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 |
반응형
'CS > 알고리즘_삼성 SW 역량 테스트 기출 문제' 카테고리의 다른 글
삼성 SW 역량 테스트 기출 문제 : 스타트와 링크 (0) | 2021.11.17 |
---|---|
삼성 SW 역량 테스트 기출 문제 : 로봇 청소기 (0) | 2021.11.05 |
삼성 SW 역량 테스트 기출 문제 : 연구소 (0) | 2021.10.20 |
삼성 SW 역량 테스트 기출 문제 : 주사위 굴리기 (0) | 2021.10.19 |
삼성 SW 역량 테스트 기출 문제 : 시험 감독 (0) | 2021.10.14 |