5번 문제
내가 풀이한 답
문제를 보니 입력 예제의 맨 앞자리 두 자리 수와 "-" 뒤의 자리 수가 제일 중요하다는 느낌을 받았다. 나이를 계산할 때에는 <stdlib.h> 라이브러리의 atoi 함수를 이용하여 문자열을 숫자열로 바꿔주는 작업을 하였고 년도가 2019년으로 고정되어 있기 때문에 1900년생들은 119, 2000년대생들은 19를 기준으로 맨 앞자리 두 자리수를 빼서 +1을 붙여주면 됐고 성별을 알기 위해서는 "-" 뒤의 숫자가 무엇에 해당하는지만 확인하면 됐고 문제에서 주어진대로 1, 2, 3, 4 총 4가지 경우의 수만 생각을 하고 코드를 짰다.
#include <iostream>
#include <string>
#include <stdlib.h>
using namespace std;
int main(int argc, char** argv) {
string s;
cin >> s;
int age = atoi(s.substr(0, 2).c_str());
int gender = atoi(s.substr(7, 1).c_str());
if(gender == 1) cout << 119 - age + 1 << " M" << endl;
else if(gender == 2) cout << 119 - age + 1 << " W" << endl;
else if(gender == 3) cout << 19 - age + 1 << " M" << endl;
else cout << 19 - age + 1 << " W" << endl;
return 0;
}
그 결과 통과를 했다.
사이트의 답안
#include <stdio.h>
int main(){
char a[20];
int year, age;
scanf("%s", &a);
if(a[7]=='1' || a[7]=='2') year=1900+((a[0]-48)*10+(a[1]-48));
else year=2000+((a[0]-48)*10+(a[1]-48));
age=2019-year+1;
printf("%d ", age);
if(a[7]=='1' || a[7]=='3') printf("M\n");
else printf("W\n");
return 0;
}
강의에서 <iostream> 보다는 <stdio.h>를 쓰는 것이 입출력면에서 훨씬 성능이 좋다고 하였다. 나도 이제부터는 <stdio.h>로 바꾸어서 코드를 짜는 습관을 들여야겠다. 그리고 C++을 너무 오랜만에 만져서 그런지 char 배열로 해결할 수 있는 것을 string으로만 해결하려고 했던 행동을 반성하게 되었다. 어쩐지 비교연산자를 쓸 때 힘들게 되더라니... 그리고 강의에서는 아스키 코드를 썼다. 0은 48이고 1씩 증가하여 9는 57이 된다. 나머지는 논리적으로 다를게 없었다.
정리
#include <stdio.h> // scanf 함수를 쓰기 위한 라이브러리(iostream) 대체
#include <stdlib.h> // atoi 함수를 쓰기 위한 라이브러리
#include <string> // substr 함수를 쓰기 위한 라이브러리
1. 문자열을 잘라서 숫자로 바꿔주기
// substr 문자열을 잘라주는 함수
// atoi 해당 문자열을 숫자로 바꿔주는 함수
int age = atoi(s.substr(0, 2).c_str());
int gender = atoi(s.substr(7, 1).c_str());
2. 다음부터는 string 대신에 cahr[]도 고려할 것
char a[20];
3. cin, cout 객체 대신에 scanf("%s", &a), printf("%d ", age) 함수를 사용할 것
'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글
7. 영어단어 복구 (0) | 2020.09.02 |
---|---|
6. 숫자만 추출 (0) | 2020.09.01 |
4. 나이 차이 (0) | 2020.09.01 |
3. 진약수의 합 (0) | 2020.09.01 |
2. A부터 B까지의 자연수의 합 (0) | 2020.09.01 |