반응형
정답 비율이 52퍼일정도로, 문제는 쉬운편이에요.
문제는 다들 이해 하셨죠?
알고리즘도 쉬운편인데, 어떤식으로 구현하냐가 문제네요.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br;
static final int left = -1, right = 1;
static LinkedList<LinkedList<Integer>> gears = new LinkedList<>();
static int resultValue = 0;
public static void main(String[] args) throws Exception {
inputGear(); //기어 정보 입력
inputRotation(); //로테이션 정보 입력
System.out.println(gears.get(0).get(0) + (gears.get(1).get(0) * 2) + (gears.get(2).get(0) * 4) + (gears.get(3).get(0) * 8));
}
static void inputGear() throws Exception {
br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
for (int j = 0; j < 4; j++) {
st = new StringTokenizer(br.readLine());
String input = st.nextToken();
LinkedList<Integer> gear = new LinkedList<>();
for (int k = 0; k < input.length(); k++) {
if (input.charAt(k) == '1') {
gear.add(1);
} else {
gear.add(0);
}
}
gears.add(gear); //기어를 입력받아 저장
}
// System.out.println("input");
// showGear();
}
static void inputRotation() throws Exception {
StringTokenizer st = new StringTokenizer(br.readLine());
int inputNum = Integer.parseInt(st.nextToken());
for (int i = 0; i < inputNum; i++) {
st = new StringTokenizer(br.readLine());
int gearNum = Integer.parseInt(st.nextToken());
int direction = Integer.parseInt(st.nextToken());
// System.out.println(gearNum-1 + ", " + direction);
rotateFirstGear(gearNum-1, direction); //기어를 돌립니다
// showGear();
}
}
static void rotateFirstGear(int gearNum, int direction) {
if (gearNum < 3 && gears.get(gearNum).get(2) != gears.get(gearNum+1).get(6)) { //오른쪽 기어를 돌릴지 확인하여 동작
rotateRightGear(gearNum+1, direction * -1);
}
if (0 < gearNum && gears.get(gearNum).get(6) != gears.get(gearNum-1).get(2)) { //왼쪽 기어를 돌릴지 확인 하여 동작
rotateLeftGear(gearNum-1, direction * -1);
}
rotateGear(gearNum, direction);
}
static void rotateRightGear(int gearNum, int direction) {
if (gearNum < 3 && gears.get(gearNum).get(2) != gears.get(gearNum+1).get(6)) { //오른쪽 기어를 돌릴지 확인하여 동작
rotateRightGear(gearNum+1, direction * -1);
}
rotateGear(gearNum, direction);
}
static void rotateLeftGear(int gearNum, int direction) {
if (0 < gearNum && gears.get(gearNum).get(6) != gears.get(gearNum-1).get(2)) { //왼쪽 기어를 돌릴지 확인 하여 동작
rotateLeftGear(gearNum-1, direction * -1);
}
rotateGear(gearNum, direction);
}
static void rotateGear(int gearNum, int direction) {
if (direction == left) {
// System.out.println(gearNum + "번째 기어를 왼쪽 으로 돌린다");
int tempValue = gears.get(gearNum).removeFirst();
gears.get(gearNum).addLast(tempValue);
} else {
// System.out.println(gearNum + "번째 기어를 오른쪽 으로 돌린다");
int tempValue = gears.get(gearNum).removeLast();
gears.get(gearNum).addFirst(tempValue);
}
}
static void showGear() {
System.out.println();
System.out.println(" " + gears.get(0).get(0) + " " + " " + gears.get(1).get(0) + " " + " " + gears.get(2).get(0) + " " + " " + gears.get(3).get(0) + " ");
System.out.println(" " + gears.get(0).get(7) + " " + gears.get(0).get(1) + " " + " " + gears.get(1).get(7) + " " + gears.get(1).get(1) + " " + " " + gears.get(2).get(7) + " " + gears.get(2).get(1) + " " + " " + gears.get(3).get(7) + " " + gears.get(3).get(1) + " ");
System.out.println(gears.get(0).get(6) + " " + gears.get(0).get(2) + gears.get(1).get(6) + " " + gears.get(1).get(2) + gears.get(2).get(6) + " " + gears.get(2).get(2) + gears.get(3).get(6) + " " + gears.get(3).get(2));
System.out.println(" " + gears.get(0).get(5) + " " + gears.get(0).get(3) + " " + " " + gears.get(1).get(5) + " " + gears.get(1).get(3) + " " + " " + gears.get(2).get(5) + " " + gears.get(2).get(3) + " " + " " + gears.get(3).get(5) + " " + gears.get(3).get(3) + " ");
System.out.println(" " + gears.get(0).get(4) + " " + " " + gears.get(1).get(4) + " " + " " + gears.get(2).get(4) + " " + " " + gears.get(3).get(4) + " ");
System.out.println("------------------------");
}
}
첫번째로 돌릴 기어에 따른 케이스별로 메소드를 하나하나 구현 할 수도 있지만,
문제의 정답만 맞추는 거라 생각하여, 재활용 할 수 있는 메소드를 구현해봤습니다.
첫번째 기어 로테이션 전에, 먼저 오른쪽 기어 체크와 왼쪽 기어 체크 메소드 수행 후 첫번째 기어를 로테이션 합니다.
오른쪽 기어 체크 메소드는, 그 오른쪽 기어 체크 메소드 수행 후 로테이션을 수행합니다.
그럼, 오른쪽 기어 체크 메소드를 호출하면 해당 기어의 오른쪽 기어 체크 메소드 수행 후 로테이션을 수행하겠죠?
넹 맞아요. 재귀로 구현했습니다
핵심은 로테이션 전에, 기어를 돌릴지 확인하는거죠.
주석을 풀어서 돌려보면 이해하기 쉬울거에요.
반응형
'코딩 테스트 > 백준(java)' 카테고리의 다른 글
DP - 1463. 1로 만들기 (0) | 2021.03.25 |
---|---|
DP - 2839. 설탕 배달 (0) | 2021.03.25 |
Q14890: 경사로 (0) | 2021.03.20 |
백준 2193) 이친수 (0) | 2017.09.16 |
백준 1149) RGB거리 (0) | 2017.09.16 |