1-1. 삼성 SW 테스트

[삼성SW테스트] 백준 17143번 - 낚시왕

asdklfjlasdlfkj 2019. 12. 29. 22:41

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

 

17143번: 낚시왕

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

www.acmicpc.net

삼성 SW 테스트 (19년 상반기) 시뮬레이션 문제다.

주어진 조건에 대해 시간 제한 (1초)을 오버해 처음엔 틀렸지만 

상어의 이동 속도에 대해 전부 루프를 돌지 않고 규칙을 찾아 방향과 위치가 같은 상태로 돌아오는데 이동한 거리를 통해 시간을 줄일 수 있었다.

 

(추가)
시간 복잡도를 증가시키지 않기 위해 R x C를 돌고 그 안에서 필요한 상어정보들만 뽑아 큐에 넣어 R x C x 무언가가 되어 시간복잡도를 증가시키는 코딩은 좋지 않다. 즉 R x C 루프에서 정보를 뽑고 그 후에 C x M x S 시간복잡도를 별도로 갖게 된다면 실행시간을 단축시킬 수 있다. 앞으로도 거대루프 안에서 계속 무언가를 코딩한다기 보다는 그 안에서 필요한 정보를 별도의 자료구조에 저장하고, 이를 활용하여 해답을 도출하는 습관을 갖도록 하자.

 

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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#define maxlen 101
using namespace std;
 
int R, C, M;
int r, c, s, d, z;
int answer = 0;
typedef struct shark{
    int size;
    int speed;
    int direction;
}shark;
vector<shark> Sharks[maxlen][maxlen];
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    cin >> R >> C >> M;
    for (int i = 0; i < M; i++){
        cin >> r >> c >> s >> d >> z;
        shark aShark;
        aShark.size = z;
        aShark.direction = d;
        aShark.speed = s;
        Sharks[r][c].push_back(aShark);
    }
    int curPos = 0;
    curPos++;
    while (curPos <= C){
        // catch
        for (int row = 1; row <= R; row++){
            if (Sharks[row][curPos].size()){
                answer += Sharks[row][curPos][0].size;
                Sharks[row][curPos].clear();
                break;
            }
        }
        // move
        queue<pair<pair<intint>pair<intpair<intint> > > > q;
        for (int row = 1; row <= R; row++){
            for (int col = 1; col <= C; col++){
                if (Sharks[row][col].size()){
                    q.push(make_pair(make_pair(row, col), make_pair(Sharks[row][col][0].sizemake_pair(Sharks[row][col][0].speed, Sharks[row][col][0].direction))));
                    Sharks[row][col].clear();
                }
            }
        }
        while (!q.empty()){
            int row = q.front().first.first;
            int col = q.front().first.second;
            int size = q.front().second.first;
            int speed = q.front().second.second.first;
            int direction = q.front().second.second.second;
            q.pop();
            int howmanymove;
            if (direction == 1 || direction == 2){
                howmanymove = speed % (2 * (R - 1));
            }
            else
                howmanymove = speed % (2 * (C - 1));
            for (int i = 0; i < howmanymove; i++){
                if (direction == 1){
                    //up
                    if (row == 1){
                        direction = 2;
                        row++;
                    }
                    else
                        row--;
                }
                else if (direction == 2){
                    if (row == R){
                        direction = 1;
                        row--;
                    }
                    else
                        row++;
                }
                else if (direction == 3){
                    if (col == C){
                        col--;
                        direction = 4;
                    }
                    else{
                        col++;
                    }
                }
                else{
                    if (col == 1){
                        col++;
                        direction = 3;
                    }
                    else
                        col--;
                }
            }
            if (Sharks[row][col].size() != 0){
                // 기존에 있으면 크기비교해서 넣어주기.
                if (Sharks[row][col][0].size < size){
                    Sharks[row][col][0].size = size;
                    Sharks[row][col][0].speed = speed;
                    Sharks[row][col][0].direction = direction;
                }
            }
            else{
                shark aShark;
                aShark.size = size;
                aShark.speed = speed;
                aShark.direction = direction;
                Sharks[row][col].push_back(aShark);
            }
        }
        curPos++;
    }
    cout << answer << '\n';
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs