[1871번] 좋은 자동차 번호판 :: https://www.acmicpc.net/problem/1871
위의 문제를 한번 풀어보자.
'너무 쉬운 문제를 가지고 논하는 것 아닌가요?'
이 문제는 scanf를 어떻게 이용했는지 한번 논해보기 위해 풀어본 문제이다.
혹시 누군가는
for(int i = 0; i < 3; i ++) scanf("%c",&str[i]);로 앞의 3글자를 받아들였다던가
누군가는
for(int i = 0; i < 3; i ++) str[i] = getchar();로 앞의 3글자를 받아들였다던가
다른 누군가는 그냥 전체를 string으로 받은 후, 문자면 문자로, 숫자면 숫자로 변환시켰을 것이다.
이처럼 다양한 input방식이 존재한다.
이 문제의 input에 대한 정해를 말한다는 것은 아니지만,
scanf에 숨어있는 다양한 기능을 이야기 해보고자한다.
사실 이 문제는 scanf 한줄로 모든 인풋을 받아 낼 수 있다.
scanf("%3c%*c%d", str, &val);
이게 도대체 무슨말일까?
%3c :: 3글자만 받아들인다.
%*c :: 1글자를 받아들이지만, 무시한다.
%d :: 숫자를 입력받는다.
결국 이제 이 문제를 풀 때 input인 ABC-0123을 보면
ABC를 받고, -를 무시하고, 0123을 숫자로 받을 수 있게 된다.
이러한 scanf방식은 다양한 문제에서 이용 될 수 있다.
만약 어떤 문제에서 input이 숫자로 이루어져있고
123456
216547
789134 인데, 여기서 왼쪽 위에서 오른쪽 아래로 가는동안 가장 작게 더하면서 이동하는 법을 구하라 하면 input을 솔직히 여러가지 방법으로도 받을 수 있을 것이다.(string으로 받아도 무관하다.)
하지만 숫자로 보고 문제를 풀고 싶다면
for(int i = 0 ; i < n; i ++)
for(int j = 0 ; j < m ; j++)
scanf("%1d",&map[i][j]);
이런식으로 받아도 해결할 수 있다는 것을 알려주고 싶다.
그다음으로 scanf가 2번 이상으로 이용되고, 숫자를 입력받고 문자를 입력받고 하다보면 \n(개행)이라는 값을 잊는 경우가 있다.
이 문제에서도 그렇다.
scanf("%d",&n)을 받고 scanf("%3c%*c%d, str, &val)을 받는데
위에 굳이 getchar()을 둔 이유는 개행을 없애버리기 위해서이다.
사실 이 코드는 getchar()가 없이 개행을 무시할 수 있도록 바꿀 수 있다.
scanf("%3c%*c%d", str, &val);
이 코드를
scanf(" %3c%*c%d", str, &val);
이렇게만 바꾸어 주면 된다.
자주색 부분 처럼 공백만 하나 넣어주면 그 곳에서 개행을 무시할 수 있게 된다.
이 문제를 통해 문제를 푼다는 생각보다,
이 문제를 어떻게 다양하게 바라볼 수 있을까 생각해 보는 것도 좋을 것 같다.
소스 코드 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include <iostream> #include <cstdio> #include <cmath> using namespace std; int main() { int n; scanf("%d", &n); while (n--) { getchar(); char str[5]; int val; scanf("%3c%*c%d", str, &val); str[3] = '\0'; int get = 0; for (int i = 0; i < 3; i++) get += (str[i] - 'A') * pow(26, 2-i); if (abs(get - val) <= 100) cout << "nice" << endl; else cout << "not nice" << endl; } return 0; } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
'Basic > C' 카테고리의 다른 글
atoi, itoa, stoi, itos 구현 (0) | 2018.01.31 |
---|---|
strcpy, strlen, strcmp 구현 (0) | 2018.01.13 |
Dangling pointer (0) | 2016.05.31 |
if else로 범할 수 있는 오류 (0) | 2016.03.24 |
파일 입출력 옵션 및 예제 (0) | 2016.02.29 |