문자열이 입력으로 주어지고, 한 문자씩 처리해야 하는 경우
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';
}
댓글 없음:
댓글 쓰기