티스토리 뷰
14891번: 톱니바퀴
첫째 줄에 1번 톱니바퀴의 상태, 둘째 줄에 2번 톱니바퀴의 상태, 셋째 줄에 3번 톱니바퀴의 상태, 넷째 줄에 4번 톱니바퀴의 상태가 주어진다. 상태는 8개의 정수로 이루어져 있고, 12시방향부터
www.acmicpc.net
풀이
1) 톱니바퀴를 2번 저장할거임. 2차원 배열에 하나, Deque에 하나
2) 4개의 톱니바퀴가 돌아가는 상황을 분리하여 if문 노가다
3) 시계방향으로 돌아갈 경우 Deque의 맨 뒤 값을 맨 앞에다 넣고 반시계방향은 반대.
4) 한 사이클이 끝나면 2차원 배열을 초기화시켜줌
5) 모든 사이클이 끝나면 dq[0] + dq[1]*2 + dq[2]*4 + dq[3]*8 출력
주의사항
1) 방향 혼동 ㄴㄴ
package com.baekJoon;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class BJ_S1_14891_톱니바퀴 {
static BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokens;
static int K, wheel[][];
static Deque<Integer> dq[] = new Deque[4];
static Queue<Oper> queue = new LinkedList<>();
public static void main(String[] args) throws NumberFormatException, IOException {
input = new BufferedReader(new StringReader(src));
for (int i=0; i<4; i++) {
dq[i] = new ArrayDeque<>();
}
wheel = new int[4][8];
for(int i=0; i<4; i++) {
String line = input.readLine();
for(int j=0; j<8; j++) {
dq[i].offer(line.charAt(j)-'0');
wheel[i][j] = line.charAt(j)-'0';
}
}
K = Integer.parseInt(input.readLine());
for(int k=0; k<K; k++) {
tokens = new StringTokenizer(input.readLine());
int no = Integer.parseInt(tokens.nextToken());
int dir = Integer.parseInt(tokens.nextToken());
queue.offer(new Oper(no, dir));
}
run();
System.out.println(dq[0].poll()+dq[1].poll()*2+dq[2].poll()*4+dq[3].poll()*8);
}
private static void run() {
while(!queue.isEmpty()) {
Oper front = queue.poll();
int dir = front.dir;
switch (front.no) { // 몇번 톱니바퀴가 선택되었는가?
case 1: // 첫번째 톱니바퀴를 돌릴경우
if(dir == 1) {
Integer temp = dq[0].pollLast();
dq[0].offerFirst(temp);
}else { // 반시계방향
Integer temp = dq[0].pollFirst();
dq[0].offerLast(temp);
}
if(wheel[0][2] != wheel[1][6]) { // ㄱ
if(dir == 1) {
Integer temp = dq[1].pollFirst(); //반시계방향
dq[1].offerLast(temp);
}else {
Integer temp = dq[1].pollLast(); //시계방향
dq[1].offerFirst(temp);
}
if(wheel[1][2] != wheel[2][6]) { // ㄴ
if(dir == 1) { // 시계방향
Integer temp = dq[2].pollLast();
dq[2].offerFirst(temp);
}else { // 반시계방향
Integer temp = dq[2].pollFirst();
dq[2].offerLast(temp);
}
if(wheel[2][2] != wheel[3][6]) { // ㄷ
if(dir == 1) { // 시계방향 이면 반시계방향
Integer temp = dq[3].pollFirst();
dq[3].offerLast(temp);
}else { // 반시계방향 이면 시계방향
Integer temp = dq[3].pollLast();
dq[3].offerFirst(temp);
}
}
}
}
break;
case 2:
if(dir == 1) { // 시계방향
Integer temp = dq[1].pollLast(); //시계방향
dq[1].offerFirst(temp);
}else { // 반시계방향
Integer temp = dq[1].pollFirst(); //반시계방향
dq[1].offerLast(temp);
}
if(wheel[0][2] != wheel[1][6]) { // ㄱ
if(dir == 1) { // 시계방향
Integer temp = dq[0].pollFirst(); //반시계방향
dq[0].offerLast(temp);
}else { // 반시계방향
Integer temp = dq[0].pollLast(); //시계방향
dq[0].offerFirst(temp);
}
}
if(wheel[1][2] != wheel[2][6]) { // ㄴ
if(dir == 1) { // 시계방향
Integer temp = dq[2].pollFirst(); //반시계방향
dq[2].offerLast(temp);
}else { // 반시계방향
Integer temp = dq[2].pollLast(); //시계방향
dq[2].offerFirst(temp);
}
if(wheel[2][2] != wheel[3][6]) { // ㄷ
if(dir == 1) {
Integer temp = dq[3].pollLast(); //시계방향
dq[3].offerFirst(temp);
}else {
Integer temp = dq[3].pollFirst(); //반시계방향
dq[3].offerLast(temp);
}
}
}
break;
case 3:
if(dir == 1) { // 시계방향
Integer temp = dq[2].pollLast(); //시계방향
dq[2].offerFirst(temp);
}else { // 반시계방향
Integer temp = dq[2].pollFirst(); //반시계방향
dq[2].offerLast(temp);
}
if(wheel[2][2] != wheel[3][6]) { // ㄷ
if(dir == 1) {
Integer temp = dq[3].pollFirst(); //반시계방향
dq[3].offerLast(temp);
}else {
Integer temp = dq[3].pollLast(); //시계방향
dq[3].offerFirst(temp);
}
}
if(wheel[1][2] != wheel[2][6]) { // ㄴ
if(dir == 1) {
Integer temp = dq[1].pollFirst(); //반시계방향
dq[1].offerLast(temp);
}else {
Integer temp = dq[1].pollLast(); //시계방향
dq[1].offerFirst(temp);
}
if(wheel[0][2] != wheel[1][6]) { // ㄱ
if(dir == 1) {
Integer temp = dq[0].pollLast(); //시계방향
dq[0].offerFirst(temp);
}else {
Integer temp = dq[0].pollFirst(); //반시계방향
dq[0].offerLast(temp);
}
}
}
break;
case 4:
if(dir == 1) { // 시계방향
Integer temp = dq[3].pollLast(); //시계방향
dq[3].offerFirst(temp);
}else { // 반시계방향
Integer temp = dq[3].pollFirst(); //반시계방향
dq[3].offerLast(temp);
}
if(wheel[2][2] != wheel[3][6]) { // ㄷ
if(dir == 1) {
Integer temp = dq[2].pollFirst(); //반시계방향
dq[2].offerLast(temp);
}else {
Integer temp = dq[2].pollLast(); //시계방향
dq[2].offerFirst(temp);
}
if(wheel[1][2] != wheel[2][6]) { // ㄴ
if(dir == 1) {
Integer temp = dq[1].pollLast(); //시계방향
dq[1].offerFirst(temp);
}else {
Integer temp = dq[1].pollFirst(); //반시계방향
dq[1].offerLast(temp);
}
if(wheel[0][2] != wheel[1][6]) { // ㄱ
if(dir == 1) {
Integer temp = dq[0].pollFirst(); //반시계방향
dq[0].offerLast(temp);
}else {
Integer temp = dq[0].pollLast(); //시계방향
dq[0].offerFirst(temp);
}
}
}
}
break;
}
for(int i=0; i<4; i++) { // 톱니바퀴 돌리기
for(int j=0; j<8; j++) {
int temp = dq[i].pollFirst();
wheel[i][j] = temp;
dq[i].offerLast(temp);
}
}
}
}
static class Oper{
int no;
int dir;
public Oper(int no, int dir) {
super();
this.no = no;
this.dir = dir;
}
}
static String src =
"10001011\r\n" +
"10000011\r\n" +
"01011011\r\n" +
"00111101\r\n" +
"5\r\n" +
"1 1\r\n" +
"2 1\r\n" +
"3 1\r\n" +
"4 1\r\n" +
"1 -1";
}
후기
실버이길래 과소평가했지만 생각보다 귀찮았던 구현문제였다.
코드를 써나가면서도 이게 맞나.. 싶을정도의 코드량 때문인지 상당히 비효율적으로 구현하고 있다는 느낌은 들었으나,
실행시간은 빠른편이라서 그냥 두었다. 두뇌운동하기에 적합한 난이도인것 같다.
'Algorithm' 카테고리의 다른 글
[백준] S2 16112 5차 전직 (java) (0) | 2020.12.18 |
---|---|
[백준] S5 14467 소가 길을 건너간 이유 1 (java) (0) | 2020.12.18 |
[백준] G4 2661 좋은수열 (java) (0) | 2020.12.18 |
[백준] B2 13458 시험 감독 (java) (0) | 2020.12.17 |
[백준] G5 3190 뱀 (java) (0) | 2020.12.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- S3
- 구현
- g4
- 백준
- react native
- 리액트 네이티브
- 백트래킹
- 시뮬레이션
- 그리디
- laugh4mile
- 현꾸라지
- G5
- PriorityQueue
- Spring Boot
- map
- 우선순위큐
- S2
- SWEA
- 문자열
- java
- DFS
- 다익스트라
- 코딩새내기
- BFS
- 객체지향
- 알고리즘
- 리액트
- Spring
- 자바
- react
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함