2578번: 빙고 (https://www.acmicpc.net/problem/2578)
typedef struct {
int y, x;
} POS;
POS num[SIZE*SIZE + 1];
...
for (int i = 0; i < SIZE; i++)
for (int j = 0; j < SIZE; j++) {
int n;
scanf("%d", &n);
num[n].y = j;
num[n].x = i;
}
...
입력시점에 i, j 값을 y, x 에 저장해 두면, 나중에 bingo 계산시에 n 으로 접근해서 y, x 값을 바로 알수 있다.
2) 입력시점에 -1, 0, 1 의 세 값을 처리하기 편한 값으로 변환
1780번: 종이의 개수 (https://www.acmicpc.net/problem/1780)
-1, 0, 1 로 처리하기 보다는 0, 1, 2 가 생각하기도 편하고, 나중에 개수 셀 때에도 index 로 바로 활용할 수 있어서 처리하기도 편하다
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
scanf("%d", &a[i][j]);
a[i][j]++;
}
}
3) 입력시점에 소트하지 않아도 되도록
10989번: 수 정렬하기 3 (https://www.acmicpc.net/problem/10989)
입력 데이터가 최대 10000000 이지만, 개별 데이터의 최대값은 10000 이기 때문에 중복 데이터의 개수를 세는 방식으로 처리한다. 1~10000 까지 각 값이 몇 개씩 있는지만 세면 된다.
#define MAX 10000
int number[MAX+1];
int main(void) {
int N, temp;
scanf("%d", &N);
for(int i = 0; i < N; i++) {
scanf("%d", &temp);
number[temp]++;
}
for (int i = 1; i <= MAX; i++) {
if (number[i] > 0) {
for (int j = 0; j < number[i]; j++) {
printf("%d\n", i);
}
}
}
4) 입력 데이터로 하나의 경로에 여러 개의 다른 값이 존재하는 경우
11404번: 플로이드 (https://www.acmicpc.net/problem/11404)
입력 데이터가 중복으로 제공이 되는데, 최소 비용 문제이니 중복되는 데이터 중에 가장 작은 비용으로 설정하도록 하면 된다.
시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &a, &b, &c);
if (weight[a][b] > c)
weight[a][b] = c;
}
댓글 없음:
댓글 쓰기