Hello

: )

2016년 4월 13일 수요일

입력을 처리하는 여러 가지 방법을 정리


문자열이 입력으로 주어지고, 한 문자씩 처리해야 하는 경우

1157번: 단어 공부(https://www.acmicpc.net/problem/1157)
문제에서 시간 낭비를 한 경우를 정리한 것 입니다.

최대 1,000,000 길이를 가지는 대소문자로 이루어진 문자열이 입력으로 주어지고,
1 문자씩 처리해야 하는 상황인데, 이런 경우에 대해서는 아래와 같은 입력 처리하면 됩니다.

   char c;  
   while ((c = getchar()) != EOF && c != '\n') {  
   ....  
   }  

문제 자체는 쉬운데, 입력값 처리하는데 시간을 다 보낸 경우네요.

* 추가로 적용 가능한 문제
11718번: 그대로 출력하기(https://www.acmicpc.net/problem/11718)

11719번: 그대로 출력하기 2(https://www.acmicpc.net/problem/11719)

1152번: 단어의 개수(https://www.acmicpc.net/problem/1152)


어떤 입력이 오면 중단하면 되는 경우

6588번: 골드바흐의 추측 (https://www.acmicpc.net/problem/6588) 같은 경우는
0 이 오면 중단
   while (1) {  
     scanf("%d", &N);  
     if (N == 0)  
       break;  
     // Do something  
     // Print answer  
   }  
   return 0;  

5086번: 약수와 배수 (https://www.acmicpc.net/problem/5086) 같은 경우는 0 이 두 개 오면 중단
   while (1) {  
     scanf("%d %d", &A, &B);  
     if (A == 0 && B == 0)  
       break;  
     // Do something  
     // Print answer  
   }  
   return 0;  

입력의 끝이 정의되어 있지 않는 경우

10951번: A + B - 4 (https://www.acmicpc.net/problem/10951) 같은 경우는
따로 끝이 정의되어 있지 않다. 이 경우는 아래와 같이 처리하면 된다.
   int A, B;  
   while (scanf("%d %d", &A, &B) != EOF)  // while (scanf("%d %d", &A, &B) == 2)
     printf("%d\n", A + B);  

scanf 의 return 값은 성공적으로 입력받는 변수의 개수이기 때문에 변수 개수만큼 들어왔는지로 체크해도 된다

4999번: 아! (https://www.acmicpc.net/problem/4999) 도 비슷하게 h 가 두 번째 올때까지 처리해주면 된다.

   while (scanf("%c", &c) != EOF) {  
       if (두 번째 h 를 만나면 while 문을 중단)  
         break;  
   }  

입력으로 사용되는 데이터가 중복이 있는 경우

1916번: 최소비용 구하기 (https://www.acmicpc.net/problem/1916) 같은 경우는 입력데이터를 그냥 받아서 쓰게 되면 틀리게 된다. 그래프 문제의 경우에 중복값이 전달 될 수 있는 경우를 고려해야 한다.

일반적인 경우
   for (int k = 0; k < M; k++) {  
     scanf("%d %d %d", &i, &j, &cost);  
     map[i][j] = cost;  
   }  

중복데이터를 고려하는 경우(중복되는 경우 그 중 최소값이 필요)
   for (int k = 0; k < M; k++) {  
     scanf("%d %d %d", &i, &j, &cost);  
     if (map[i][j] == 0)  
       map[i][j] = cost;  
     else if (map[i][j] > cost)  
       map[i][j] = cost;  
   }  

입력으로 사용되는 데이터의 순서를 고려해야 하는 경우

1991 번: 트리 순회 (https://www.acmicpc.net/problem/1991) 같은 경우는 1 차원 배열로 tree 를 구성하는 경우(예를 들어, index 1 은 root, left 는 index * 2, right 는 index*2+1)에 순차적으로 데이터가 있는 경우(예제 데이터)는 입력순으로 처리를 하면 tree 구성이 가능하다. 하지만, 제출시에 사용되는 입력값은 순차적으로 처리하면 tree 가 구성이 안 되는 것이 존재한다. 그래서, 1 차원으로 순서를 고려하면서 처리가 복잡해지기 보다는, 2 차원 배열로 자신과 자식들을 간단히 표현하고, 순차적으로 입력 받도록 한다.

 #define MAX 26  
 int tree[MAX + 1][2];  
   int N;  
   scanf("%d", &N);  
   for (int i = 0; i < N; i++) {  
     scanf("%c %c %c %c", &lf, &parent, &left, &right);  
     if (left != '.')  
       tree[parent - 'A'][0] = left - 'A';  
     if (right != '.')  
       tree[parent - 'A'][1] = right - 'A';  
   }  

댓글 없음:

댓글 쓰기