본문 바로가기

알고리즘/BOJ

14891번

14891번 - 톱니 바퀴


문제에서 구하란 대로 시뮬레이션을 통해서 풀었다.


톱니는 deque 를 이용해서 각 방향값들을 담았다. deque 를 쓴 이유는 톱니가 회전했을 경우, 톱니 값들을 


앞으로 밀거나 뒤로 밀기에 편리하기 때문에 사용하였다.


rotate 함수를 통해서 w 위치에서 r 방향 움직이게 하였고, dir 을 통해서 처음에 0일때만 양방향으로


1이면 오른쪽으로만, 2이면 왼쪽으로만 재귀함수가 실행되도록 하기 위해서 추가하였다.


마지막 합을 구할 때 비트마스크 연산을 사용했는데, 아직 이 비트마스크가 헷갈려서 처음에 i<<1 로 계산해서 계속 틀렸다.


이 문제에서 얻어갈 점


rotate 하는거로 deque 로 구현한 점 ( 처음에 for문으로 구하려고 했는데.. 갑자기 어찌나 헷갈리던지..)


<정답 코드>


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
#include<iostream>
#include<deque>
#include<vector>
using namespace std;
int k;
vector<deque<int>> wheel(5,deque<int>(8) );
void rotate(int w, int r,int dir)
{
 
    //시계
    if (r == 1)
    {
        if (w + 1 <= 4 && (dir==0 || dir==1))
        {
            if (wheel[w][2!= wheel[w + 1][6])
            {
                rotate(w + 1-r,1);
            }
        }
 
        if (w - 1 >= 1 && (dir==0 || dir==2))
        {
            if (wheel[w][6!= wheel[w - 1][2])
            {
                rotate(w - 1-r, 2);
            }
        }
        int tmp = wheel[w].back();
        wheel[w].pop_back();
        wheel[w].push_front(tmp);
 
        
 
    }
    
    //반시계
    if (r == -1)
    {
        if (w + 1 <= 4 && (dir == 0 || dir == 1))
        {
            if (wheel[w][2!= wheel[w + 1][6])
            {
                rotate(w + 1-r, 1);
            }
        }
 
        if (w - 1 >= 1 && (dir == 0 || dir == 2))
        {
            if (wheel[w][6!= wheel[w - 1][2])
            {
                rotate(w - 1-r, 2);
            }
        }
 
        int tmp = wheel[w].front();
        wheel[w].pop_front();
        wheel[w].push_back(tmp);
    }
}
int main()
{
    //freopen("input.txt", "r", stdin);
    for (int i = 1; i <= 4; i++)
    {
        char tmp[9];
        scanf("%s"&tmp);
        for (int j = 0; j < 8; j++)
        {
            wheel[i][j] = tmp[j] - '0';
        }
    }
 
    int a[101][2];
    scanf("%d"&k);
    
    for (int i = 0; i < k; i++)
    {
        scanf("%d %d"&a[i][0], &a[i][1]);
    }
    
    for(int i=0;i<k;i++)
    {
        rotate(a[i][0], a[i][1] ,0);
 
    }
 
    int sum = 0;
    for (int i = 1; i <= 4; i++)
    {
        if (wheel[i][0== 0)
        {
            sum += 0;
        }
        else
        {
            sum += (1 << (i-1));
        }
    }    
 
    printf("%d\n", sum);
 
    return 0;
}
cs


반응형

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

2503번  (0) 2018.01.09
3085번  (0) 2018.01.09
14888번  (0) 2018.01.09
14889번  (1) 2018.01.09
10026번  (0) 2018.01.08