반응형

[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(262-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