CS/알고리즘_삼성 SW 역량 테스트 기출 문제

삼성 SW 역량 테스트 기출 문제 : 톱니바퀴

Jedy_Kim 2021. 11. 17. 13:26
728x90

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

 

14891번: 톱니바퀴

첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터

www.acmicpc.net

 

// 코드

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
113
114
115
import java.util.*;
import java.io.*
 
 
public class Main {   
  
  static int[] wheels = new int[4];
  
  // main
  public static void main(String[] args) throws Exception{
    
    // Please Enter Your Code Here
    BufferedWriter bw  = new BufferedWriter(new OutputStreamWriter(System.out));
    BufferedReader br  = new BufferedReader(new InputStreamReader(System.in)); 
    StringTokenizer st = null
    
    // 2진수로 읽어들인다.
    for(int i=0; i<4++i) wheels[i] = Integer.parseInt(br.readLine(), 2);
    
    // 주어진 조건에 맞추어 바퀴를 돌려준다.
    int K = Integer.parseInt(br.readLine());
    for(int i=0; i<K; ++i) {
      
      st = new StringTokenizer(br.readLine());
      int idx = Integer.parseInt(st.nextToken()) - 1;
      int dir = Integer.parseInt(st.nextToken());
      
      oper(idx, dir);
    }
    
    int ret = getScore();
    bw.write(String.valueOf(ret));
    
    bw.flush();
    bw.close();
    br.close();
  }
  
  
  // 바퀴의 회전해야할 모든 방향을 계산해준다.
  static void oper(int idx, int dir) {
    
    // 바퀴가 회전해야할 방향을 모두 가지고 있다. 
    // 1 : 시계 방향, 0 : 회전 안함, -1 : 반시계 방향
    int[] dirArr = new int[4];
    dirArr[idx] = dir;
    
    // 톱니바퀴 기준 왼쪽 톱니바퀴들의 방향
    for(int i=idx; i>0--i) {
      if(isSame(i-1, i)) break// 현재 톱니바퀴와 이전 톱니바퀴와 맞닿는 부분이 일치한다면 탈출
      dirArr[i-1= -dirArr[i];
    }
    
    // 톱니바퀴 기준 오른쪽 톱니바퀴들의 방향
    for(int i=idx; i<3++i) {
      if(isSame(i, i+1)) break;
      dirArr[i+1= -dirArr[i];
    }
    
    // 회전을 시켜준다.
    for(int i=0; i<4++i) rotate(i, dirArr[i]);
  }
  
  
  // 톱니바퀴 맞닿는 부분 체크
  static boolean isSame(int i, int j) {
    
    int orgBit = (wheels[i] & (1 << 5)) > 0 ? 1 : 0;
    int trgBit = (wheels[j] & (1 << 1)) > 0 ? 1 : 0;
    
    return orgBit == trgBit;
  }
  
  
  // 회전을 시켜준다.
  static void rotate(int idx, int dir) {
    
    // 시계방향 (->)
    if(dir == 1) {
      
      // 최하위 비트가 1인 경우, 최상위 비트를 1로 채워준다.
      if( (wheels[idx] & 1> 0 ) {
        wheels[idx] >>>= 1;
        wheels[idx] |= (1 << 7);
      } else {
        wheels[idx] >>>= 1
      }
      
    } else if(dir == -1) { // 반시계 방향 (<-)
      
      // 최상위 비트가 1인 경우, 최하위 비트를 1로 채우준다.
      if( (wheels[idx] & (1 << 7)) > 0 ) {
        wheels[idx] <<= 1;
        wheels[idx] |= 1;
      } else {
        wheels[idx] <<= 1;
      }
        
    } 
  }
  
  
  // 답을 반환
  static int getScore() {
    int score = 0;
    
    score += (wheels[0& (1 << 7)) > 0 ? 1 : 0;
    score += (wheels[1& (1 << 7)) > 0 ? 2 : 0;
    score += (wheels[2& (1 << 7)) > 0 ? 4 : 0;
    score += (wheels[3& (1 << 7)) > 0 ? 8 : 0;
    
    return score;
  }
  
cs

 

반응형