본문 바로가기

BOJ/C++

[BOJ] 14891. 톱니바퀴

[문제]

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터 시계방향 순서대로 주어진다. N극은 0, S극은 1로 나타나있다. 다섯째 줄에는 회전 횟수 K(1 ≤ K ≤ 100)가 주어진다. 다음 K개 줄에는 회전시킨 방법이 순서대로 주어진다. 각 방법은 두 개의 정수로 이루어져 있고, 첫 번째 정수는 회전시킨 톱니바퀴

www.acmicpc.net

[풀이]

14891 맞았습니다!! 2176KB 0ms C++14 / 수정 1864B 1일 전

 

 

이 문제와 같습니다. 

2019/07/28 - [SWEA/삼성SW역량테스트] - [SWEA] 특이한 자석

 

[SWEA] 특이한 자석

[문제] https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH SW Expert Academy SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요! www.swex..

jayrightthere.tistory.com


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
#include <iostream>
#include <vector>
#include <cmath>
 
using namespace std;
 
//50분 소요 
 
int bycle[4][8], k;
typedef pair<intint> pp;
vector<pp> dir;
 
void print() {
    cout << '\n';
     for (int i = 0; i < 4; i++
    {
        for (int j = 0; j < 8; j++) {
            cout <<  bycle[i][j] << " ";
        }
        cout << '\n';
    }
    cout << '\n';
}
bool check(int l, int r) {
    if (bycle[l][2== bycle[r][6]) return false;
    return true;
 
}
void rotate(int num, int dir) {
    
    if (dir == 1) {
        //시계방향 => 마지막 극점이 앞으로 온다. 
        int tmp = bycle[num][7];
        for (int i = 6; i >= 0; i--) {
            bycle[num][i+1= bycle[num][i]; 
        }
        bycle[num][0= tmp;
    }
    else {
          //반시계방향 => 처음 극점이 마지막으로 간다. 
        int tmp = bycle[num][0];
        for (int i = 1; i <= 7; i++) {
            bycle[num][i-1= bycle[num][i]; 
        }
        bycle[num][7= tmp;
    }
    
}
void right(int num, int dir) {
    if (!(0 <= num && num <= 3)) return;
 
    if (check(num-1, num)) {
        right(num+1-dir);
        rotate(num, dir);
    }
}
void left(int num, int dir) {
    if (!(0 <= num && num <= 3)) return;
    
    if (check(num, num+1)) {
        left(num-1-dir);
        rotate(num, dir);
    }
 
    
}
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    for (int i = 0; i < 4; i++
    {   
        string tmp;
        cin >> tmp;
            
        for (int j = 0; j < 8; j++) {
           bycle[i][j] = tmp[j] - 48;
        }
    }
    
    cin >> k;
    //input 
 
    //맞닿는 극이 다르면 연속 회전 -> dfs
    //왼쪽에 있는 톱니랑 맞닿는 극은 6번, 오른족에 있는 톱니랑 맞닿는 극은 2번 
 
    while(k--) {
        //k번 회전 실행 
        int a, b;
        cin >> a >> b;
        a = a-1;
 
        left(a-1-b);
        right(a+1-b);
        rotate(a, b);
    }
    
    int ans = 0;
    for (int i = 0; i < 4; i++
    {
        if (bycle[i][0== 1) {
            ans += pow(2, i);
        }
        
    }
    // print();
 
    cout << ans << '\n';
    return 0;
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

'BOJ > C++' 카테고리의 다른 글

[BOJ] 17142. 연구소3  (0) 2019.08.04
[BOJ] 15683. 감시  (0) 2019.08.03
[BOJ] 14890. 경사로  (0) 2019.08.02
[BOJ] 14500. 테트로미노  (0) 2019.08.02
[BOJ] 14499. 주사위굴리기  (0) 2019.08.02