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

 

14891번: 톱니바퀴

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

www.acmicpc.net

코드설명

구현과 시뮬레이션 문제입니다.

 

문제에서 유의해야할점들입니다.

 

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("----------------------");
    }
    
}

+ Recent posts