알고리즘 문제를 풀다보면 아무리 코드를 봐도 맞는데 틀린다.
우리는 그럴때 이렇게 말한다.
범위? 무슨 범위?
틀리기 쉬운 범위는 다음과 같다.
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
전체 코드
더보기
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 |