기술 블로그

5650. [모의 SW 역량테스트] 핀볼 게임 본문

알고리즘 문제/SW Expert Academy

5650. [모의 SW 역량테스트] 핀볼 게임

parkit 2019. 10. 10. 22:38
728x90
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRF8s6ezEDFAUo



보자마자 시뮬레이션을 떠올렸다.


0인 곳을 4가지 방향(상, 하, 좌, 우) 모두 고려해준다.


주석 참고.


block[r][c] : c방향으로 움직이고 있을 때, r번 째 블록을 만나면 block[r][c]의 방향으로 바뀐다. 값 자체임을 유의.

rev[d] : d방향의 역방향.



그리고 바보같은 짓을 했다.


계속 49개만 맞고, 1개를 틀리길래 어디가 오류인지 로직을 봤는데도 불구하고 


틀린 부분이 없는 것 같길래 뭐지 싶었는데


알고보니 웜 홀 조건을 40 ~ 46번 째 줄(주석 부분)로 구현하였었다.


당연히 올바른 로직인줄 알고 아예 무시하고 있었다.


즉, 예를 들어 8번 웜홀의 위치가 (1, 4), (1, 5)일 수도 있었다. 


행과 열이 같을 수도 있다는 말이다.


다음에는 당연하다 싶은 로직도 봐야겠다.




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
#include <bits/stdc++.h>
 
using namespace std;
 
#define Max 104
 
int N, m[Max][Max], block[6][5], ans;
int dy[5= { 0-1100 };
int dx[5= { 000-11 };
int rev[5= { 02143 };
vector<pair<intint> > worm[11];
 
int simulation(int sy, int sx, int d)
{
    int ret = 0;
    int r = sy, c = sx;
 
    while (1)
    {
        r += dy[d];
        c += dx[d];
 
        // 출발 위치로 돌아오거나 블랙홀에 빠졌을 때
        if ((r == sy && c == sx) || m[r][c] == -1return ret;
        
        // 블록 만났을 때(점수 증가)
        if (1 <= m[r][c] && m[r][c] <= 5)
        {
            ++ret;
            d = block[m[r][c]][d];
        }
        // 웜홀 만났을 때
        else if (6 <= m[r][c] && m[r][c] <= 10)
            for (auto i : worm[m[r][c]])
                if (!(i.first == r && i.second == c)) { 
                    r = i.first, c = i.second; break
                }
 
        /*
        else if (6 <= m[r][c] && m[r][c] <= 10)
            for (auto i : worm[m[r][c]])
                if (i.first != r && i.second != c) 
                { 
                    r = i.first; c = i.second; 
                    break; 
                }
        */
    }
    
    return -1;
}
 
int main(void)
{
    //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin);
 
    int test_case;
    scanf("%d"&test_case);
 
    block[1][1= 2; block[2][1= 4;
    block[1][2= 4; block[2][2= 1;
    block[1][3= 1; block[2][3= 2;
    block[1][4= 3; block[2][4= 3;
 
    block[3][1= 3; block[4][1= 2; block[5][1= 2;
    block[3][2= 1; block[4][2= 3; block[5][2= 1;
    block[3][3= 4; block[4][3= 4; block[5][3= 4;
    block[3][4= 2; block[4][4= 1; block[5][4= 3;
 
    for (int tc = 1; tc <= test_case; tc++) {
        ans = 0;
        for (int i = 0; i < 11; i++) worm[i].clear();
        scanf("%d"&N);
        for(int i = 0; i <= N + 1; i++)
            for (int j = 0; j <= N + 1; j++)
                if (i == 0 || i == N + 1 || j == 0 || j == N + 1) m[i][j] = 5;
                else m[i][j] = 0;            
        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= N; j++) {
                scanf("%d"&m[i][j]);
                if (6 <= m[i][j] && m[i][j] <= 10) worm[m[i][j]].push_back({ i, j });                
            }        
        for (int i = 1; i <= N; i++)
            for (int j = 1; j <= N; j++)        
                if (m[i][j] == 0)
                    for (int k = 1; k <= 4; k++)
                        ans = max(ans, simulation(i, j, k));                    
        printf("#%d %d\n", tc, ans);
    }
 
    return 0;
}
cs






















728x90
반응형

'알고리즘 문제 > SW Expert Academy' 카테고리의 다른 글

9282번 초콜릿과 건포도  (0) 2020.02.25
5656번 벽돌 깨기  (0) 2019.07.01
홈 방범 서비스  (0) 2019.05.24
1767번 프로세서 연결하기  (0) 2019.04.14
5653번 줄기세포 배양  (2) 2018.10.05