문제 풀이 및 개발 공간

[백준] 1331번 나이트 투어 문제! (silver 5 본문

백준공부/java

[백준] 1331번 나이트 투어 문제! (silver 5

gomduri43 2022. 8. 8. 17:14

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	public static void main(String[] args)  throws IOException {
		BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
		int[][] alphabet=new int[6][7];
		boolean vOrInv=true;
		char moved=0;
		int dis=0;
		char initialChar=0;
		int initialDis=0;
		for(int i=0; i<36; i++) {
			String word=br.readLine();
			//왔던 곳인지 비교, 새로운 체스판을 입력받을때마다 1을 대입해서,
			//혹여 alphabet[A][1]의 값이 1이면, 중복된 것이므로 false;
			if(alphabet[word.charAt(0)-'A'][word.charAt(1)-'0']==1) {
				vOrInv=false;
			}
			alphabet[word.charAt(0)-'A'][word.charAt(1)-'0']=1;
			
			//맨마지막에 초기위치로 돌아갈 수 있는지 판별해야하므로, i=0일때의 초기 위치 저장. 
			if(i==0) {
				initialChar=word.charAt(0);
				initialDis=word.charAt(1)-'0';
			}
			//이동한 값이 이동가능 범위인지. 알파벳 1칸 차이면 숫자는 2칸차
			//알파벳 2칸 차는 숫자는 1칸차
			//알파벳 동일하게 이동불가,
			//알파벳 차가 2이상으로 이동불가. 
			else {
				if(Math.abs(word.charAt(0)-moved)==1) {
					if(Math.abs((word.charAt(1)-'0')-dis) != 2) {
						vOrInv=false;
					}
				}
				else if(Math.abs(word.charAt(0)-moved)==2) {
					if(Math.abs((word.charAt(1)-'0')-dis) != 1) {
						vOrInv=false;
					}
				}
				else if(Math.abs(word.charAt(0)-moved)>2 || Math.abs(word.charAt(0)-moved)==0) {
					vOrInv=false;
				}
			}
			moved=word.charAt(0);
			dis=word.charAt(1)-'0';
		}
		//맨마지막위치에서 초기위치로 이동가능한지 판단
		if(Math.abs(initialChar-moved)==1) {
			if(Math.abs(initialDis-dis) != 2) {
				vOrInv=false;
			}
		}
		else if(Math.abs(initialChar-moved)==2) {
			if(Math.abs((initialDis-dis)) != 1) {
				vOrInv=false;
			}
		}
		else if(Math.abs(initialChar-moved)>2 ||Math.abs(initialChar-moved)==0) {
			vOrInv=false;
		}

		
		bw.write(vOrInv==true ? "Valid": "Invalid");
		bw.flush();
	}
}