https://www.acmicpc.net/problem/14891
코드설명
구현과 시뮬레이션 문제입니다.
문제에서 유의해야할점들입니다.
1. char의 비교할떄는 0이 아닌 '0'으로 비교해야합니다.
public static char[][] arr;
answer = 0;
answer += arr[0][0] == '0' ? 0 : 1;
answer += arr[1][0] == '0' ? 0 : 2;
answer += arr[2][0] == '0' ? 0 : 4;
answer += arr[3][0] == '0' ? 0 : 8;
System.out.println(answer);
- 처음에 integer 형식인줄알고 있었다가 == 0 을해서 모두 아닌경우로 모든 경우 15가 나왔었습니다.
2. visited 배열을 통해 아직 검사하지 않은 톱니바퀴만 접근해야합니다.
if( idx > 0 && visited[idx-1] == false ) { //0보다는 커야됨.
if(arr[idx-1][2] == arr[idx][6]) { //만약 왼쪽톱니바퀴(idx-1)과 기준톱니바퀴(idx)의 극이 같다면, 상관없으니깐 넘어간다.
}
else if(arr[idx-1][2] != arr[idx][6]) { //만약 왼쪽톱니바퀴(idx-1)과 기준톱니바퀴(idx)의 극이 다르다면, 재귀가 들어가야합니다.
visited[idx] = true;
simulate(idx-1, dir*(-1));
}
}
//오른쪽 톱니바퀴를 검사합니다.
if( idx < 3 && visited[idx+1] == false ) {
if(arr[idx][2] == arr[idx+1][6]) {
}
else if(arr[idx][2] != arr[idx+1][6]) {
visited[idx] = true;
simulate(idx+1, dir*(-1) );
}
}
3. 시계방향으로 회전, 반시계방향으로 회전 할때는 모두 유의해서합니다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static int N, M;
public static char[][] arr;
public static boolean[] visited;
public static int answer = 0;
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
arr = new char[4][8];
for(int i=0;i<4;i++) {
st = new StringTokenizer(br.readLine());
arr[i] = st.nextToken().toCharArray();
}
st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
for(int i=0;i<N;i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
visited = new boolean[4];
simulate(a-1,b);
}
answer = 0;
answer += arr[0][0] == '0' ? 0 : 1;
answer += arr[1][0] == '0' ? 0 : 2;
answer += arr[2][0] == '0' ? 0 : 4;
answer += arr[3][0] == '0' ? 0 : 8;
System.out.println(answer);
}
// dir : 1 ( 시계방향 ) , -1 ( 반시계방향 ) idx : 돌릴 톱니바퀴 번호
public static void simulate(int idx, int dir) {
if(idx > 3 || idx < 0) return ;
//왼쪽 톱니바퀴부터 검사합니다.
//
if( idx > 0 && visited[idx-1] == false ) { //0보다는 커야됨.
if(arr[idx-1][2] == arr[idx][6]) { //만약 왼쪽톱니바퀴(idx-1)과 기준톱니바퀴(idx)의 극이 같다면, 상관없으니깐 넘어간다.
}
else if(arr[idx-1][2] != arr[idx][6]) { //만약 왼쪽톱니바퀴(idx-1)과 기준톱니바퀴(idx)의 극이 다르다면, 재귀가 들어가야합니다.
visited[idx] = true;
simulate(idx-1, dir*(-1));
}
}
//오른쪽 톱니바퀴를 검사합니다.
if( idx < 3 && visited[idx+1] == false ) {
if(arr[idx][2] == arr[idx+1][6]) {
}
else if(arr[idx][2] != arr[idx+1][6]) {
visited[idx] = true;
simulate(idx+1, dir*(-1) );
}
}
//시계방향으로 회전하는경우
if(dir == 1) {
char lastWord = arr[idx][7];
for(int i=6; i>=0; i--) {
arr[idx][i+1] = arr[idx][i];
}
arr[idx][0] = lastWord;
}
//반시계방향으로 회전하는경우
else if(dir == -1) {
char firstWord = arr[idx][0];
for(int i=1; i<=7; i++) {
arr[idx][i-1] = arr[idx][i];
}
arr[idx][7] = firstWord;
}
}
public static void print() {
for(int i=0;i<4;i++) {
System.out.println("I:"+i);
for(int j=0;j<=7;j++) {
System.out.print(" "+arr[i][j]);
}
System.out.println();
}
System.out.println("----------------------");
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 1003 피보나치 함수 - DP(Dynamic Programming, 동적계획법) JAVA (0) | 2023.08.16 |
---|---|
[백준] 108710 피보나치 수 5 - DP JAVA (0) | 2023.08.16 |
[백준] 9372 상근이의 여행 - 그래프 + DFS JAVA (0) | 2023.08.14 |
[백준] 1027 고층 건물 - 구현(Implementation) + 기하학(Geometry) JAVA (0) | 2023.08.12 |
[백준] 9935 문자열 폭발 - StringBuilder + 아이디어 JAVA (0) | 2023.08.12 |