Technology/Problem Solving

[PS]맞왜틀 시리즈6 범위

문베디드 2022. 6. 8. 22:16

알고리즘 문제를 풀다보면 아무리 코드를 봐도 맞는데 틀린다.

우리는 그럴때 이렇게 말한다.

범위? 무슨 범위?

틀리기 쉬운 범위는 다음과 같다.

 

1) for, while 과 같은 반복문 횟수, 반복문 시작, 종료 위치

C/C++에서 사용하는 배열은 0부터 시작한다. 그런데 보통 알고리즘 문제에서 주어지는 번호가 1번부터 시작한다.

입력받을때는 배열의 1번부터 N번까지 입력을 받는데

반복문을 돌릴때 0번부터 N-1 까지 접근하는 경우가 많다. 아래 예시를 보자

1
2
for(int i = 0; i < N; ++i)
    arr[i];
cs

이러한 반복문 실수는 입력 받는 부분, 문제풀이를 위한 알고리즘 부분 혹은 문제 결과를 출력하는 반복문에서도 일어날 수 있다. 꼼꼼히 살피자

 

2) 최대값 범위 처리

최단거리를 구하는 문제를 풀다보면 최대값을 임의값으로 설정하고 처리할때가 있다.

그런데 경유 노드가 많아지면 본인이 예상했던 것보다 최대값이 커질수도 있다.

최악의 경우 이동비용*최대경유노드 가 최대값이 되어야 한다.

 

내가 두가지 실수를 저지른 문제는 아래 문제이다.

연습하기 좋은 문제인듯 하다.

https://www.acmicpc.net/problem/11404

 

11404번: 플로이드

첫째 줄에 도시의 개수 n이 주어지고 둘째 줄에는 버스의 개수 m이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가

www.acmicpc.net

전체 코드

더보기
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
//문제: https://www.acmicpc.net/problem/11404
#include <stdio.h>
void floydwarshall(int d[][101], int N) {
    for (int k = 1; k <= N; ++k)
        for (int i = 1; i <= N; ++i)
        {
            for (int j = 1; j <= N; ++j)
            {
                if (d[i][j] > d[i][k] + d[k][j])
                    d[i][j] = d[i][k] + d[k][j];
            }
        }
}
 
int main() {
    int d[101][101];
    const int INF = 90000000;
    for (int i = 0; i < 101++i)
        for (int j = 0; j < 101++j)
            if (i == j)
                d[i][j] = 0;
        else
                d[i][j] = INF;
    //Input
    int N, M;
    scanf("%d"&N);
    scanf("%d"&M);
    for (int i = 0; i < M; ++i) {
        int a, b, c;
        scanf("%d %d %d"&a, &b, &c);
        if (d[a][b] == INF)
            d[a][b] = c;
        else
        {
            if(d[a][b] > c)
                d[a][b] = c;
        }
    }
    //----------solution
    floydwarshall(d, N);
    //Output
    for (int i = 1; i <= N; ++i) {
        for (int j = 1; j <= N; ++j) {
            if (d[i][j] == INF)
                printf("0 ");
            else
                printf("%d ", d[i][j]);
        }
        printf("\n");
    }
}
 
 
cs

'Technology > Problem Solving' 카테고리의 다른 글

[PS]알고리즘 강의  (0) 2022.06.14
[PS]공부진도  (0) 2022.06.11
[PS]맞왜틀 시리즈5 변수 범위  (2) 2022.05.21
[PS]맞왜틀 시리즈4 초기화  (0) 2022.05.21
[PS]맞왜틀 시리즈3 정렬범위  (0) 2022.05.20