본문 바로가기

알고리즘/BOJ

9205번

9205번 - 맥주 마시면서 걸어가기


문제를 읽으면서 x,y 범위가 막 주어지고 어떤식으로 노드를 구성해야 할까 고민했다.


좌표별로 구하려고 하면 메모리가 넘칠 것 같아서 조금 더 생각해보니 , 간단한 플로이드 알고리즘 문제였다.


왜냐하면 편의점과 출발점 도착점을 모두 합쳐서 최대 노드가 102개 밖에 나오지 않기 때문이다.


우선 입력받은 n을 통해서 n+2 개의 노드를 만들고, x,y 값들을 입력받는다.


이때 n이 0 이면 출발점, n+1 일때는 마지막 페스티벌의 도착점.


그 다음 모든 노드들이 갈 수 있는지를 체크한다, 이 때 기준은 맥주 50잔 이기 때문에 거리가 1000 이하여야 한다.


이 값들을 플로이드 알고리즘을 사용하는 D배열에 저장한다.


플로이드 알고리즘을 구하고, 시작점0 에서 끝점 n+1 까지 도달가능한지 여부만 체크해주면 된다.


<정답 코드>


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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include<iostream>
#include<vector>
using namespace std;
 
const int INF = 987654321;    
typedef struct
{
    int x;
    int y;
}pos;
int main()
{
    //freopen("input.txt", "r", stdin);
    int tc;
    cin >> tc;
    while (tc--)
    {
        int n;
        cin >> n;
        vector<pos> v(n + 2);
        vector<vector<int>> D(n + 2vector<int>(n + 2,INF));
 
        for (int i = 0; i < n + 2; i++)
        {
            cin >> v[i].x >> v[i].y;
        }
 
        for (int i = 0; i < n + 2; i++)
        {
            for (int j = 0; j < n + 2; j++)
            {
                int dis = abs(v[i].x - v[j].x) + abs(v[i].y - v[j].y);
 
                if (dis <= 1000)
                {
                    D[i][j] = dis;
                }
            }
        }
 
        for (int k = 0; k < n + 2; k++)
        {
            for (int i = 0; i < n + 2; i++)
            {
                for (int j = 0; j < n + 2; j++)
                {
                    if (D[i][j] > D[i][k] + D[k][j])
                    {
                        D[i][j] = D[i][k] + D[k][j];
                    }
                }
            }
        }
 
        if (D[0][n + 1!= INF)
        {
            cout << "happy\n";
        }
        else
        {
            cout << "sad\n";
        }
 
    }
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2580번  (0) 2018.02.22
2458번  (0) 2018.02.20
2610번  (0) 2018.02.20
1613번  (0) 2018.02.20
1219번  (2) 2018.02.19