요르딩딩

백준 1063 : 킹 (char(알파벳)/.charAt(0)/switch문) 본문

[코딩테스트]/문제풀이

백준 1063 : 킹 (char(알파벳)/.charAt(0)/switch문)

요르딩딩 2021. 9. 8. 18:49
728x90
반응형

이번 문제는 나름 꽤 시간이 걸렸던 문제였습니다. 물론 시간날때마다 도전해서 그렇긴 하지만 

String 문자를 char형으로 변환하여 증가/감소 시킬수 있다는 점과 변환하는 방법, 그리고 익숙하지만 잘 안쓰게 되는 swich문도 사용해 보았습니다.

 

1. 먼저 문제를 읽은 후 문제에 대한 이해가 중요합니다.

 이번문제에서 헷갈렸던 부분은 돌을 언제 움직일 수 있느냐 였습니다. 문제를 보고 이해한 바로는

= 체스가 돌이 있는 위치로 이동하게 되면, 그 돌을 체스가 이동해온 방향으로 이동시킨다 였습니다.

문제를 풀어본 결과 다행이 제대로 이해한거 같습니다.

 

2. 이제 문제를 이해했으니, 규칙을 만드는 것이었습니다. 

 규칙을 만들어야 로직을 짤때 수월하기 때문입니다. 여기서 고민했던점은 "RT"로 이동할때 "R"로 이동하고 "T"로 이동하면 되는거 아닌가? 했습니다. 하지만 그렇게 하게되면, 만약 "RT"로 이동한것이 체스판을 벗어났을 경우(A~H, 1~8) "R"로 이동한 것과 "T"로 이동한것 모두 롤백을 시켜줘야합니다. 그렇기에 번거롭지만 각각의 경우를 모두 switch문에 작성하기로 했습니다.

 

3. 로직을 짜면서 생각해야했던 점에 대해서 알아보겠습니다.

 첫번째로는 돌의 이동입니다. 이동된 체스가 돌과의 위치가 같다면 돌을 이동시키도록 했습니다. 다만, 돌이 체스판을 벗어났을 경우 이동하지 않아야 하므로, 돌도 체스와 마찬가지로 tmp2에 임의로 저장해 두기로 했습니다.

 

 두번째 범위를 벗어났을 경우 이동을 하지 않아야하므로, 미리 이동시켜놓은 값 tmp(체스), tmp2(돌)의 위치가 체스판을 벗어나지 않았을 경우 체스와 돌의 위치를 미리 이동시킨값 tmp, tmp2에 값으로 대체하도록 하였습니다. 물론 체스판을 벗어나게 되면 그냥 PASS합니다.

 

처음 문제를 읽었을때는 이해가 잘 안되긴 했지만, 돌의 이동경우를 이해하고 나서는 로직의 규칙을 정하는것은 쉽다고 느꼈습니다. 그런데 막상 로직을 짜면서 예외가 발생했고, 로직의 길이가 길어져 고민을 하기도 했지만 최대한 가독성있고, 심플한 로직을 짜기위해 노력했던거 같습니다. 문제는 풀었지만 다른분들이 푼 로직을 보면 좀 더 효율적인 로직이 있는지 확인해보고 넘어가야겠다는 생각이 들었습니다.

 

제목에도 적었듯이 이번에 익힐 기술은

1. string -> char으로 변환시킬때 사용하는 sting.charAt(0)과 char이 문자일 경우 증가(+1)/감소(-1)로 문자를 변경할 수 있다는점,

2. switch문

3. char -> String 변환할때는 String.valueOf(char)

4. 하나의 클래스안에 static로 정의된 메소드를 사용하려면 this를 사용하면 안된다는 점 이렇게 알아두면 좋은 것들을 적어보았습니다.

 

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

public class test {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		String[] a1 = br.readLine().split(" ");

		//(체스, 돌, 입력횟수) 입력
		String tmp1 = a1[0];
		String tmp2 = a1[1];
		int count = Integer.parseInt(a1[2]);

		//체스 위치 세팅
		String[] M = tmp1.split("");
		String stM = M[0];
		int intM = Integer.parseInt(M[1]);

		//돌 위치 세팅
		String[] N = tmp2.split("");
		String stN = N[0];
		int intN = Integer.parseInt(N[1]);

		for (int i = 0; i < count; i++) {
			String[] move = br.readLine().split(" ");
			char tmpSt =  (char) stM.charAt(0);;
			int tmpInt = intM;
			switch (String.valueOf(move[0])) {
			case "R": // 알파벳+1
				tmpSt = (char) (stM.charAt(0) + 1); 
				break;
			case "L": // 알파벳-1
				tmpSt = (char) (stM.charAt(0) - 1); 
				break;
			case "T": // 숫자 +1
				tmpInt = intM + 1; 
				break;
			case "B": // 숫자 -1
				tmpInt = intM - 1; 
				break;
			case "RT": // 알파벳+1, 숫자 +1
				tmpSt = (char) (stM.charAt(0) + 1); 
				tmpInt = intM + 1; 
				break;
			case "RB": // 알파벳+1, 숫자 -1
				tmpSt = (char) (stM.charAt(0) + 1); 
				tmpInt = intM - 1;
				break;
			case "LB": // 알파벳-1, 숫자 -1
				tmpSt = (char) (stM.charAt(0) - 1); 
				tmpInt = intM - 1; 
				break;
			case "LT": // 알파벳-1, 숫자 +1
				tmpSt = (char) (stM.charAt(0) - 1); 
				tmpInt = intM + 1; 
				break;
			}

			//돌이랑 겹칠때 돌이동 => 밀이 이동한 만큼 돌도 이동
			char tmpSt2 = (char) stN.charAt(0);
			int tmpInt2 = intN;
			if (tmpSt == stN.charAt(0) && tmpInt == intN) { //알파벳 위치, 숫자 위치 같은지 비교
				tmpSt2 = (char) ((char) stN.charAt(0) + (tmpSt - stM.charAt(0)));
				tmpInt2 = intN + (tmpInt - intM);
			}

			//범위 안에 있다면 옮기기 아니면 PASS
			if (true == rangeString(tmpSt) && true == rangeString(tmpSt2)) {
				if (true == rangeInt(tmpInt) && true == rangeInt(tmpInt2)) {
					stM = String.valueOf(tmpSt);
					intM = tmpInt;

					stN = String.valueOf(tmpSt2);
					intN = tmpInt2;
				}

			}
		}
		System.out.println(stM + String.valueOf(intM));
		System.out.println(stN + String.valueOf(intN));
	}

	//알파벳 범위 체크
	public static boolean rangeString(char st) {
		if (st < (char) 'A' || st > (char) 'H') { 
			return false;
		}
		return true;
	}

	//숫자 범위 체크
	public static boolean rangeInt(int i) {
		if (i < 1 || i > 8) { 
			return false;
		}
		return true;
	}
}

 

728x90
반응형
Comments