Algorithm

[BOJ] 14891. 톱니바퀴

프로그래민 2020. 3. 31. 23:30
반응형

문제에 주어진 대로 하면 되는 시뮬레이션이다.

단순 구현 문제이기 때문에 문제에 주어진 조건그대로를 수행하게 된다면 풀 수 있는 문제이다. 하나의 톱니바퀴가 돈다면 양쪽으로 끝지점 까지 영향을 끼칠 수 있으므로 left함수와 right함수를 만들어서 양 끝 인덱스 까지 재귀를 하는 방식으로 구현하였다.

구현함에 있어 고려할 부분이 상당히 많아서 풀이하는 시간을 상당히 많이 소요하였다. 꼼꼼함이 필요한 문제같다.

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
package selfStudy.chap07;
 
 
public class Main_bj_14891_톱니바퀴 {
    static int [][] circle;
    
    
    public static void main(String[] args) throws Exception {
        BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        circle=new int[4][8];
        
        for(int i=0;i<4;i++) {
            String str=br.readLine();
            for(int j=0;j<8;j++) {
                circle[i][j]=str.charAt(j)-'0';
            }
        }
    
        int T=Integer.parseInt(br.readLine());
        
        for(int tc=0;tc<T;tc++) {
            st=new StringTokenizer(br.readLine());
            int pick = Integer.parseInt(st.nextToken())-1;
            int dir = Integer.parseInt(st.nextToken());
            
            if(dir==1)
                func(pick,true);
            else
                func(pick,false);
            
        }
 
        int sum=0;
        for(int i=0;i<4;i++) {
            if(circle[i][0]==1) {
                sum+=(1<<i);
            }
        }
        System.out.println(sum);
    }
    
    
    static void func(int pick, boolean dir) {
        left(pick-1,!dir);
        right(pick+1,!dir);
        rotate(pick, dir);
    }
    
    static void left(int pick,boolean dir) {
        if(pick<0)
            return;
        
        if(circle[pick][2]!=circle[pick+1][6]) {
            left(pick-1,!dir);
            rotate(pick, dir);
        }
    }
    
    static void right(int pick,boolean dir) {
        if(pick>3)
            return;
        
        if(circle[pick-1][2]!=circle[pick][6]) {
            right(pick+1,!dir);
            rotate(pick, dir);
        }
    }
    
    static void rotate(int index,boolean dir) {
        if(dir==true) {    //시계방향
            int temp= circle[index][7];
            for(int i=7;i>=1;i--) {
                circle[index][i]=circle[index][i-1];
            }
            circle[index][0]=temp;
        }else if(dir==false) {    //반시계방향
            int temp= circle[index][0];
            for(int i=0;i<=6;i++)
                circle[index][i]=circle[index][i+1];
            circle[index][7]=temp;
            
        }
    }
}
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
                                                   

 

반응형

'Algorithm' 카테고리의 다른 글

[SWEA] 5607. 조합  (0) 2020.04.03
[BOJ] 1941. 소문난 칠공주  (0) 2020.04.02
[BOJ] 13335. 트럭  (0) 2020.03.31
[BOJ] 14999. 주사위 굴리기  (0) 2020.03.31
[BOJ] 5427. 불  (0) 2020.03.30