반응형
[백준/BOJ]
문제 #14891
https://www.acmicpc.net/problem/14891
내가 작성한 코드
import java.io.*;
import java.util.*;
public class BOJ14891{
// N극 S극
static final int N = 0;
static final int S = 1;
// 시계방향회전 반시계방향회전
static final int ROTATE = 1;
static final int REROTATE = -1;
// 왼쪽, 오른쪽 극 계산 시
static final int LEFT = 6;
static final int RIGHT = 2;
// 4개의 타이어 극
static final int[][] tireInfo = new int[4][8];
// 4개의 타이어 인덱스
static final int[] idxs = new int[4];
// 회전 수 및 회전 방향
static int K;
static int[][] steps;
// score
static int score = 0;
public static void main(String[] args) throws Exception{
input();
solve();
printAns();
}
private static void solve() {
for(int k=0; k<K; ++k) {
// 몇번째 바퀴, 방향
rotate(steps[k][0], steps[k][1], 0);
}
// 점수 확인
checkScore();
}
// (몇번째 바퀴, 회전방향, 어느방향으로 나아가야하는지)
private static void rotate(int tireIdx, int rotateDir, int nextDir) {
int nxtRightTireIdx = tireIdx + 1;
int nxtLeftTireIdx = tireIdx - 1;
int nxtIdx = tireIdx + nextDir;
// 우 확인
if(nxtIdx == nxtRightTireIdx) {
// 현재 바퀴의 오른쪽 인덱스와 그 때의 극
int curRightIdx = (idxs[tireIdx] + RIGHT) % 8;
int curRightPole = tireInfo[tireIdx][curRightIdx];
// 현재 인덱스는 변경
idxs[tireIdx] = (idxs[tireIdx] + (rotateDir * -1) + 8) % 8;
if(nxtRightTireIdx < 4) {
// 오른쪽 바퀴의 왼쪽 인덱스와 그 때의 극
int nxtLeftIdx = (idxs[nxtRightTireIdx] + LEFT) % 8;
int nxtLeftPole = tireInfo[nxtRightTireIdx][nxtLeftIdx];
if(curRightPole != nxtLeftPole) {
rotate(nxtRightTireIdx, rotateDir * -1, 1);
}
}
// 좌 확인
}else if(nxtIdx == nxtLeftTireIdx) {
int curLeftIdx = (idxs[tireIdx] + LEFT) % 8;
int curLeftPole = tireInfo[tireIdx][curLeftIdx];
// 현재 인덱스는 변경
idxs[tireIdx] = (idxs[tireIdx] + (rotateDir * -1) + 8) % 8;
if(nxtLeftTireIdx > -1 ) {
// 왼쪽 바퀴의 오른쪽 인덱스와 그 때의 극
int nxtRightIdx = (idxs[nxtLeftTireIdx] + RIGHT) % 8;
int nxtRightPole = tireInfo[nxtLeftTireIdx][nxtRightIdx];
if(curLeftPole != nxtRightPole) {
rotate(nxtLeftTireIdx, rotateDir * -1, -1);
}
}
// 양 쪽
}else {
int curRightIdx = (idxs[tireIdx] + RIGHT) % 8;
int curRightPole = tireInfo[tireIdx][curRightIdx];
int curLeftIdx = (idxs[tireIdx] + LEFT) % 8;
int curLeftPole = tireInfo[tireIdx][curLeftIdx];
// 현재 인덱스는 변경
int preIdx = idxs[tireIdx];
idxs[tireIdx] = (idxs[tireIdx] + (rotateDir * -1) + 8) % 8;
if(nxtRightTireIdx < 4) {
// 오른쪽 바퀴의 왼쪽 인덱스와 그 때의 극
int nxtLeftIdx = (idxs[nxtRightTireIdx] + LEFT) % 8;
int nxtLeftPole = tireInfo[nxtRightTireIdx][nxtLeftIdx];
if(curRightPole != nxtLeftPole) {
rotate(nxtRightTireIdx, rotateDir * -1, 1);
}
}
if(nxtLeftTireIdx > -1 ) {
// 왼쪽 바퀴의 오른쪽 인덱스와 그 때의 극
int nxtRightIdx = (idxs[nxtLeftTireIdx] + RIGHT) % 8;
int nxtRightPole = tireInfo[nxtLeftTireIdx][nxtRightIdx];
if(curLeftPole != nxtRightPole) {
rotate(nxtLeftTireIdx, rotateDir * -1, -1);
}
}
}
}
private static void checkScore() {
for(int i=0; i<4; ++i) {
int idx = idxs[i];
int pole = tireInfo[i][idx];
if(pole == 0) continue; //N극이면 건너뜀
score += Math.pow(2, i);
}
}
private static void printAns() throws Exception {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(Integer.toString(score));
bw.close();
}
private static void input() throws Exception{
System.setIn(new FileInputStream("src/boj/input.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for(int i=0; i<4; ++i) {
String[] input = br.readLine().split("");
for(int j=0; j<8; ++j) {
tireInfo[i][j] = Integer.parseInt(input[j]);
}
}
K = Integer.parseInt(br.readLine());
steps = new int[K][2];
for(int i=0; i<K; ++i) {
String[] input = br.readLine().split(" ");
steps[i] = new int[] {Integer.parseInt(input[0])-1, Integer.parseInt(input[1])};
}
}
}
풀이 및 배운 점
크게는 입력값을 받는 input(), 문제푸는 로직을 실행하는 solve(), solve() 안에서 회전하는 로직인 rotate(), 정답을 계산하는 checkScore(), 정답을 출력하는 printAns() 이렇게 총 5개의 메소드를 작성하여 풀었다.
구현력을 기르기 위해 풀면서 느끼는 건, 문제를 보고 로직을 분리한 후에 메소드로 작성하는 것이 쉽지는 않다는 것
하지만 틀린 부분을 찾을 때 가독성이 좋아져서 이전보다 빠르게 문제점을 찾을 수 있는 것 같다.
동일한 로직이라 오른쪽 방향으로 도는 로직을 복사하여 왼쪽 방향으로 돌다가 마지막 테이스케이스에서 원하는 값을 출력하지 못했다.
그리고 nxtIdx, nxtLeftTireIdx 와 같이 비슷한 변수를 사용하다보니 코드를 작성하면서도 헷갈렸다.
변수명도 가독성있고, 직관적이게 작성하는 습관을 길러야겠다.
반응형
'코딩테스트(Coding Test) > 백준' 카테고리의 다른 글
[백준/BOJ21611] 마법사 상어와 블리자드 (0) | 2025.01.13 |
---|---|
[백준/BOJ7795] 먹을 것인가 먹힐 것인가 (0) | 2024.08.22 |
[백준/BOJ16174] 점프왕 쩰리 (0) | 2024.07.06 |
[백준/BOJ20002] 사과나무 (0) | 2024.07.04 |
[BOJ1238] 파티 (0) | 2024.04.27 |