본문 바로가기
알고리즘&자료구조

이코테 - 왕실의 나이트

by do_ng 2021. 1. 24.

내가 짠 코드) 

		Scanner sc = new Scanner(System.in);
		
		// 나이트의 현재 위치 입력받기
		String spot = sc.nextLine();
		
		int col = 0; //열(수평) 
		//입력한 문자에 따라 정수로 변환시켜줌 
		if(spot.charAt(0) == 'a') col = 1;
		if(spot.charAt(0) == 'b') col = 2;
		if(spot.charAt(0) == 'c') col = 3;
		if(spot.charAt(0) == 'd') col = 4;
		if(spot.charAt(0) == 'e') col = 5;
		if(spot.charAt(0) == 'f') col = 6;
		if(spot.charAt(0) == 'g') col = 7;
		if(spot.charAt(0) == 'h') col = 8;
		 
		int row = Integer.parseInt(spot.substring(1)); //행(수직)
		// 아래와 같이 문자를 정수로 변환할경우 아스키 코드 표에 의해서 변환이 되므로 주의! ex)문자 '1' -> 81(십진수) 
		// int row = (int)spot.charAt(1);
		
		int result = 0; // 나이트가 이동 가능한 경우의 수 
		int col_a = col , row_a = row; 
		
		//1.수평 2칸 이동후 수직 1칸 이동시 
		for(int i=0;i<2;i++) {
			if(i == 0) col_a -= 2; //수평 왼쪽으로 두칸 이동
			if(i == 1) col_a += 2; //수평 오른쪽으로 두칸 이동
			
			//좌표평면을 벗어나지 않는 경우에 한해서 수직으로 (위로,아래로)1칸씩 이동 
			if(1 <= col_a && col_a <= 8){
				for(int j=0;j<2;j++){
					if(j == 0) ++row_a; //수직 아래로 한칸이동
					if(j == 1) --row_a; //수직 위로 한칸이동
					
					if(1 <= row_a && row_a <= 8) {
						result++; 
					}
					row_a = row; //행 초기화 
				}
			}
			col_a = col; //열 초기화 
		}
		
		//2.수직 2칸 이동후 수평 1칸 이동시 
		for(int i=0;i<2;i++) {
			if(i == 0) row_a -= 2; //수직 위로 2칸이동
			if(i == 1) row_a += 2; //수직 아래로 2칸이동 
			
			//좌표평면을 벗어나지 않는 경우에 한해서 수평으로 (오른쪽,왼쪽)1칸씩 이동 
			if(1 <= row_a && row_a <= 8){
				for(int j=0;j<2;j++){
					if(j == 0) ++col_a; //수평 오른쪽 한칸이동
					if(j == 1) --col_a; //수평 왼쪽 한칸이동
					
					if(1 <= col_a && col_a <= 8) {
						result++; 
					}
					col_a = col; //열 초기화 
				}
			}
			row_a = row; //행 초기화 
		}
		
		System.out.println(result);

 

다른 코드) 

		Scanner sc = new Scanner(System.in);
		
		// 나이트의 현재 위치 입력받기 
		String spot = sc.nextLine();
		// 아스키 코드값을 계산해서 나이트의 위치를 정수로 바꿈   
		// 문자끼리 연산을 할때는 해당문자에 맞는 십진수 형태로 변환이 되서 연산이 실행됨 
		int row = spot.charAt(1) - '0'; // ex) 문자'1'(81),문자'0'(80) -> 81-80 = 1(행)    
		int column = spot.charAt(0) - 'a' + 1; // ex) 'a'(97) - 'a'(97) + 1 -> 1(열)
		
		// 나이트가 이동할 수 있는 8가지 방향 *** 
		// 경우의 수가 많지 않다면 해당 경우에 대해서만 확인을 해주면 된다 
		/*
		 	1.왼쪽으로 2칸(x) -> 위로 1칸(y)
		 	2.왼쪽으로 2칸(x) -> 아래로 1칸(y)
		 	3.오른쪽으로 2칸(x) -> 위로 1칸(y)
		 	4.오른쪽으로 2칸(x) -> 아래로 1칸(y)
		 	5.위쪽으로 2칸(y) -> 왼쪽으로 1칸(x)
		 	6.위쪽으로 2칸(y) -> 오른쪽으로 1칸(x)
		 	7.아래쪽으로 2칸(y) -> 왼쪽으로 1칸(x)
		 	8.아래쪽으로 2칸(y) -> 오른쪽으로 1칸(x) 
		 */
		int[] x = {-2,-2,2,2,-1,1,-1,1}; //수평 
		int[] y = {-1,1,-1,1,-2,-2,2,2}; //수직
		
		// 나이트가 이동할 수 있는 8가지 방향중 이동이 가능한 방향을 검사함 ** 
		int result = 0; // 나이트가 이동 가능한 경우의 수 
		for(int i = 0;i<8;i++) {
			int row_a = row + x[i];
			int column_a = column + y[i];
			// 나이트가 해당 위치로 이동이 가능한 경우에만 result 증가 
			if(0 < row_a && row_a < 9 && 0 < column_a && column_a < 9) result++;
		}
		
		System.out.println(result);

 

문제를 풀긴 했는데 다른 코드를 보니 좀 더 쉽게 풀 수 있는 방법이 있었음... 

첫 번째로 아스키코드값을 잘 이용해서 풀면 쉽게 행과 열을 정수형으로 변환할 수 있었음 

두 번째로는 경우의 수가 많지 않을 경우 해당 경우에 대해서만 확인을 해주면 복잡하지 않게 코드를 작성할 수 있음 

'알고리즘&자료구조' 카테고리의 다른 글

재귀함수 - 팩토리얼  (0) 2021.01.26
이코테 - 게임개발  (0) 2021.01.26
이코테 - 상하좌우(구현)  (0) 2021.01.23
이코테 - 숫자카드게임  (0) 2021.01.19
1517 버블소트  (1) 2020.09.27