본문 바로가기
코딩테스트/백준

[백준/java] 14891번: 톱니바퀴 - 삼성 코딩테스트 기출문제

by drCode 2021. 8. 13.
728x90
반응형

14891번: 톱니바퀴

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

 

14891번: 톱니바퀴

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

www.acmicpc.net

프로세스 순서 착오에 의해 문제를 푸는데만 3일이 넘게 걸렸다..

 

728x90

 

대충 이해했던 프로세스는 아래와 같다.

 ---> 1. 지정받은 번호의 톱니바퀴를 방향에 맞게 일단 회전시킨다.

 ---> 2. 회전시킨 후, 왼쪽과 오른쪽 톱니바퀴의 극을 비교한다

 ---> 3. 극이 다르면 비교 대상의 톱니바퀴를 반대방향으로 회전시킨다.

 ---> 4. 2 ~ 3번을 반복한다

 

로 이해했었는데 아주 잘못된 이해였다.

 

진짜 이래서 지문 읽는 것을 정말 잘해야한다..

 

반응형

 

※ 문제 해결 방안

(1) 입력값들을 입력받고 방향배열 int[] dirArr을 반드시 초기화해준다.

(2) 입력받은 톱니바퀴 번호에 해당하는 방향배열 인덱스에 입력받은 방향을 넣어준다

(3) 왼쪽, 오른쪽 방향으로 탐색을 한다.

(4) 탐색이 다 끝났으면 모든 톱니바퀴를 방향이 지정된대로 회전시킨다.

(5) 1번으로 돌아가서 4번까지 지정된 횟수에 맞게 순환한다.

(6) 점수를 구한다.

 

package simulation;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class GearRotation {
	static int[][] gear = new int[4][8];
	static int score = 0;
	static int[] dirArr;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		for (int i = 0; i < gear.length; i++) {
			String[] arr = br.readLine().split("");
			for (int j = 0; j < arr.length; j++) {
				gear[i][j] = stoi(arr[j]);
			}
		}

		int K = stoi(br.readLine());

		while (K-- > 0) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int idx = stoi(st.nextToken()) - 1;
			int dir = stoi(st.nextToken());
			
			dirArr = new int[4];			// 방향 배열 초기화
			dirArr[idx] = dir;
			
			checkToothL(idx, dir*-1);	// 좌측 탐색
			checkToothR(idx, dir*-1);	// 우측 탐색
			
			for (int i = 0; i < dirArr.length; i++) rotate(i, dirArr[i]);	// 회전 방향 모두 설정한 후 톱니바퀴를 회전시킨다 
		}

		for (int i = 0; i < gear.length; i++) {
			if (gear[i][0] == 1)
				score += 1 << i;
		}

		System.out.println(score);
	}

	public static void rotate(int idx, int dir) {
		int temp = 0;
		if (dir == 1) {
			temp = gear[idx][7];
			for (int i = gear[idx].length - 1; i > 0; i--) {
				gear[idx][i] = gear[idx][i - 1];
			}
			gear[idx][0] = temp;
		} else if(dir == -1) {
			temp = gear[idx][0];
			for (int i = 0; i < gear[idx].length - 1; i++) {
				gear[idx][i] = gear[idx][i + 1];
			}

			gear[idx][7] = temp;
		}
	}

	public static void checkToothR(int left, int dir) {
		int right = left + 1;
		if (right > 3) return;
		if (gear[left][2] != gear[right][6]) {
			dirArr[right] = dir;
			checkToothR(right, dir*-1);
		}
	}

	public static void checkToothL(int rihgt, int dir) {
		int left = rihgt - 1;
		if (left < 0) return;
		if (gear[left][2] != gear[rihgt][6]) {
			dirArr[left] = dir;
			checkToothL(left, dir * -1);
		}
	}

	public static int stoi(String str) {
		return Integer.parseInt(str);
	}
}
728x90
반응형

댓글