백준 17143 낚시왕
본문 바로가기
알고리즘 모음집/알고리즘 (Algorithm)

백준 17143 낚시왕

by KyeongMin 2019. 7. 12.
728x90
반응형

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

 

17143번: 낚시왕

낚시왕이 상어 낚시를 하는 곳은 크기가 R×C인 격자판으로 나타낼 수 있다. 격자판의 각 칸은 (r, c)로 나타낼 수 있다. r은 행, c는 열이고, (R, C)는 아래 그림에서 가장 오른쪽 아래에 있는 칸이다. 칸에는 상어가 최대 한 마리 들어있을 수 있다. 상어는 크기와 속도를 가지고 있다. 낚시왕은 처음에 1번 열의 한 칸 왼쪽에 있다. 다음은 1초 동안 일어나는 일이며, 아래 적힌 순서대로 일어난다. 낚시왕은 가장 오른쪽 열의 오른쪽 칸에 이동하

www.acmicpc.net

솔직히 이런 분류의 문제는 문제에서 원하는 대로만 하면 돼서 어렵지는 않았습니다. 

여기서 포인트는 상어가 가진 속도와 크기를 어떻게 저장하고 이동을 시킬 것인가를 생각해야 합니다.

우선, 위의 이야기에 앞서 풀이 방법에 대해서 간략하게 설명드리겠습니다.

 

견자판의 크기 R, C와 상어의 수 M이 처음 입력으로 들어갑니다.

그리고 M마리의 상어의 견자판에서의 위치 r, c 속력 s, 이동방향 d, 크기 z 가 순서대로 주어지고

 

d는 1 == 위  2==아래 3==오른쪽 4==왼쪽으로 

int dy []={};

int dx []={};

설정 시 인덱스 자체로 쉽게 사용을 하기 위해서

 

처음 0 번방은 그대로        있는것이니 11에 위치한다면 11에 있는것이니, 0,0

      1  번방은 위로          가는 것이니 11에 위치한다면 01로가는 것이니, -1,0

      2  번방은 아래로       가는것이니 11에 위치한다면 21로 가는 것이니, 1,0

      3  번방은 오른쪽으로 가는것이니 11에 위치한다면 12로 가는 것이니, 0,1

      4  번방은 왼쪽으로    가는것이니 11에 위치한다면 10으로 가는 것이니, 0,-1

즉,  int dy [5]={0,-1, 1, 0, 0};

     int dx [5]={0, 0,  0, 1,-1};

 

이렇게 설정해주면 쉽게 사용이 가능합니다.

상어를 이동시킬 때 다른 배열에 이동을 마친 방향과 위치를 표시하고 

다른 상어가 이동할 때 같은 위치에 오는 경우도 있기 때문에 그렇게 된다면

작은 상어라면 그대로 두고 현재 위치의 상어보다 크다면 그 상어가 위치하도록

하면 됩니다.

그리고 낚시왕은 맵을 0,0부터 받았다면 c가 0인 위치부터 격자판의 C-1 만큼 

1초씩 총 C초만큼 이동하면서 제일 가까운 위치의 상어를 잡으면 됩니다. 그 잡은 상어의 크기를

q변수에 저장하여 출력하면 됩니다.

 

말로 하면 이렇게 쉬운데 그렇다면 상어의 속도와 방향과 위치를 어떻게 저장할까요?

저는 구조체 이차원 배열을 사용하여하였습니다. 그렇게 해서 위의 방식대로 이동시키고

출력하는 방식으로 문제를 풀었습니다.

 

너무 피곤한 상태에서 알고리즘 풀이를 하다 보니 다구현 해놓고 막판에 size < size 끼리 비료를

해야 하는 게 맞는데 방향 < 사이즈를 비교하는 실수를 해서 삽질을 했답니다. ㅜㅜ

항상 피곤해도 변수 이름 위치 잘 확인하세요. 

 

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include<stdio.h>
int R, C, M, r, c, s, d, z;
int dy[] = {0,-1,1,0,0};
int dx[] = {0,0,0,1,-1};
// 위 1, 아래 2, 오3, 왼4,
/*
00 01 02
10 11 12
20 21 22
*/
struct Data {
    int speed, size,dir;
};
Data Shark[104][104];
void init() {
    scanf("%d %d %d"&R, &C, &M);
    for (int i = 1; i <= M; i++) {
        scanf("%d %d %d %d %d"&r, &c, &s, &d, &z);
        Shark[r][c].size = z;
        Shark[r][c].speed = s;
        Shark[r][c].dir = d;
    }
}
int main(void)
{
    init();
    int ret = 0;
    for (int x = 1; x <= C; x++) {
        Data C_Shark[104][104= { 0, };
        int y = 1;
        while (1) {// 낚시
            if (y >R)break;
            if (Shark[y][x].dir != 0) {
                ret += Shark[y][x].size;
                Shark[y][x].size = 0;
                Shark[y][x].dir = 0;
                Shark[y][x].speed = 0;
                break;
            }
            y++;
        }
        for (int i = 1; i <= R; i++) {
            for (int j = 1; j <= C; j++) {
                if (Shark[i][j].dir != 0) {
                    int ndir = Shark[i][j].dir;
                    int nspeed = Shark[i][j].speed;
                    int nsize = Shark[i][j].size;
                    int ny=i;
                    int nx=j;
                    for (int i1 = 1; i1 <=nspeed; i1++) {
                        ny += dy[ndir];
                        nx += dx[ndir];
                    
                        if (ny<1|| ny>R|| nx<1 || nx>C) {
                            
                            ny -= dy[ndir];
                            nx -= dx[ndir];
                            if (ndir == 1)ndir = 2;
                            else if (ndir == 2)ndir = 1;
                            else if (ndir == 3)ndir = 4;
                            else if (ndir == 4) ndir = 3;
                            i1--;
                        }
                        
                    
                    }
                    
                    if (C_Shark[ny][nx].dir != 0) {
                        if (C_Shark[ny][nx].size < nsize) {
                            C_Shark[ny][nx].dir = ndir;
                            C_Shark[ny][nx].size = nsize;
                            C_Shark[ny][nx].speed = nspeed;
                        }
                        else {
 
                        }
                    }
                    else {
                        C_Shark[ny][nx].dir = ndir;
                        C_Shark[ny][nx].size = nsize;
                        C_Shark[ny][nx].speed = nspeed;
                    }
 
                }
            }
        }
 
        for (int i = 1; i <= R; i++) {
            for (int j = 1; j <= C; j++) {
                Shark[i][j].dir = 0;
                Shark[i][j].size = 0;
                Shark[i][j].speed = 0;
                Shark[i][j].dir = C_Shark[i][j].dir;
                Shark[i][j].size = C_Shark[i][j].size;
                Shark[i][j].speed = C_Shark[i][j].speed;
            }
        }
 
    }
        printf("%d" ,ret);
    return 0;
}
 
 

위의 소스 코드 참고하시면 되고 구조체 이차원 배열 말고도 구조체 백터를 이용해서 해도 되니

한번 해보시는 것을 추천드립니다.

728x90
반응형

댓글