기술 블로그

17300번 패턴 본문

알고리즘 문제/BOJ

17300번 패턴

parkit 2019. 12. 26. 22:09
728x90
반응형

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





처음에 어떻게 접근할까 생각하다가


한 칸 건너 뛸 수 있는 상황은 16가지 상황밖에 없었다.(8가지 * 2(반대))


예)

1에서 3으로 갈 때 또는 3에서 1로 갈 때, 2를 체크해준다.

.

.


그래서 check[1][3] = check[3][1] = true로 


미리 이러한 상황일 때만 가운데 숫자를 방문했는지 안 했는지 검사해준다.


또한, 


1→3

4→6

7→9

.

.


등 


이러한 경우들을 보면 가운데 점이 모두 (처음 + 끝) / 2임을 알 수 있다.


그래서 40번 째 줄에 (v[i] + v[i - 1]) / 2를 해준 것이다.


i >= 1일 때로 조건을 준 것은 그 전에 어느 방향에서 왔는지 알아야 하므로, v[i - 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
#include <bits/stdc++.h>
 
using namespace std;
 
#define Max 10
 
int n;
bool use[Max], check[Max][Max];
vector<int> v;
 
int main()
{
    //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin);
    cin.tie(0);
    scanf("%d"&n);
    int input;
    for (int i = 0; i < n; i++) {
        scanf("%d"&input);
        v.push_back(input);
    }
 
    if (v.size() <= 2) {
        printf("NO\n");
        return 0;
    }
 
    check[1][3= check[3][1= true;
    check[4][6= check[6][4= true;
    check[7][9= check[9][7= true;
    check[1][7= check[7][1= true;
    check[2][8= check[8][2= true;
    check[3][9= check[9][3= true;
    check[1][9= check[9][1= true;
    check[3][7= check[7][3= true;
 
    for (int i = 0; i < v.size(); i++) {
 
        // 한 칸 건너 뛸 때 검사
        if (i >= 1 && check[v[i - 1]][v[i]]) {
            if (!use[(v[i - 1+ v[i]) / 2]) {
                printf("NO\n");
                return 0;
            }
        }
 
        // 중복 검사
        if (use[v[i]]) {
            printf("NO\n");
            return 0;
        }
        use[v[i]] = true;
    }
 
    printf("YES\n");
 
    return 0;
}
cs


















728x90
반응형

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

10844번 쉬운 계단 수  (0) 2020.01.01
17615번 볼 모으기  (0) 2019.12.29
2437번 저울  (0) 2019.12.26
14927번 전구 끄기  (0) 2019.12.25
1080번 행렬  (0) 2019.12.24