Hello

: )

2016년 4월 16일 토요일

입력시점에 데이터를 처리하는 여러가지 방법들

1) 입력시에 좌표를 저장하여 검색을 안 해도 되도록
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;  
   }  

댓글 없음:

댓글 쓰기