[TC0403] [구현] 왕실의 나이트
✏️ 𝗔𝗹𝗴𝗼𝗿𝗶𝘁𝗵𝗺/이것이 코딩 테스트다

[TC0403] [구현] 왕실의 나이트

이코테

🚩 문제 설명

왕실 정원

행복 왕국의 왕실 정원은 체스판과 같은 8 x 8 좌표 평면이다.
왕실 정원의 특정한 한 칸에 나이트가 서 있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.

나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8 x 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.

이때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며,
열 위치를 표현할 때는 a부터 h로 표현한다.


예를 들어 만약 나이트가 a1에 있을 때 이동할 수 있는 경우의 수는 다음 2가지 이다.
a1의 위치는 좌표 평면에서 구석의 위치에 해당하며 나이트는 정원의 밖으로는 나갈 수 없기 때문이다.
 1. 오른쪽으로 두 칸 이동 후 아래로 한 칸 이동하기 (c2)
 2. 아래로 두 칸 이동 후 오른쪽으로 한 칸 이동하기 (b3)

또 다른 예로 나이트가 c2에 위치해 있다면 나이트가 이동할 수 있는 겨웅의 수는 6가지 이다.

◾ 나이트가 이동할 수 있는 경우의 수를 찾는 문제

◾ 나이트가 처음 위치한 곳이 문자로 입력된다.

 

 


 

 

✅ 입출력

return ➡️ 나이트가 이동할 수 있는 경우의 수
Input Output
a1 2

◾ a1 에서 오른쪽으로 두 칸 이동하고 아래로 한 칸 이동하여 ➡ c2

◾ a1 에서 아래로 두 칸 이동하고 오른쪽으로 한 칸 이동하여 ➡ b3

 

 


 

 

 

📑 문제 풀이

with 파이썬 (Python)
cols = [chr(i) for i in range(ord('a'), ord('h')+1)]
rows = list(range(1, 9))
# chess = [[c + str(r) for c in cols] for r in rows]

steps = [(-2, -1), (-2, 1), (2, -1), (2, 1), (1, -2), (-1, -2), (1, 2), (-1, 2)]

def solution(start):
    ans = 0 # 경우의 수

    # 1) 위치 찾기
    r = rows.index(int(start[1])) + 1
    c = cols.index(start[0]) + 1

    # 2) 스텝 더하기
    for step in steps:
        next_r = r + step[0]
        next_c = c + step[1]
        if next_r >= 1 and next_r <= 8 and next_c >= 1 and next_c <= 8:
            ans += 1

    print(ans)
    return ans

# start = 'a1' # 2
start = 'c2' # 6
solution(start)

 

with 자바 (Java)
package problem.TC;


import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;

//a1
//-> 2

//c2
//-> 6


// 구현 문제 
public class TC_왕실의나이트 {
	static int initY, initX, ans;
	static int[][] map = new int[9][9]; // 0 dummy

	static int[] dy = { -1, -1, 1, 1, -2, -2, 2, 2 };
	static int[] dx = { -2, 2, -2, 2, -1, 1, -1, 1 };


	public static void main(String[] args) throws Exception {
		System.setIn(new FileInputStream("input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		char[] loc = br.readLine().toCharArray();
		initY = loc[1] - '0';
		initX = loc[0] - 'a' + 1;

		// System.out.println(initY + " " + initX);

		for (int d = 0; d < 8; d++) {
			int ny = initY + dy[d];
			int nx = initX + dx[d];

			if (ny < 1 || ny >= 9 || nx < 1 || nx >= 9) continue;

			ans++;
		}

		System.out.println(ans);

	}
}

💬 Point

➡️  steps 배열로 나이트가 갈 수 있는 가짓수 구해놓기
➡️  next_r, next_c 로 체스판을 넘어가는 경우 (불가능한 경우) 제외하기
➡  알파벳 range: [chr(i) for i in range( ord('a') , ord('h') + 1) ]
➡  "문자열/배열".index("인덱스를 찾을 문자/숫자")

◾ 수평 2칸 수직 1칸

  • (0, -1) + (0, -1) + (-1, 0) = (-1, -2)
  • (0, -1) + (0, -1) + (1, 0) = (1, -2)
  • (0, 1) + (0, 1) + (-1, 0) = (-1, 2)
  • (0, 1) + (0, 1) + (1, 0) = (1, 2)

◾ 수직 2칸 수평 1칸

  • (-1, 0) + (-1, 0) + (0, -1) = (-2, -1)
  • (-1, 0) + (-1, 0) + (0, 1) = (-2, 1)
  • (1, 0) + (1, 0) + (0, -1) = (2, -1)
  • (1, 0) + (1, 0) + (0, 1) = (2, 1)

◾ 나이트가 갈 수 있는 이동 가짓수를 구하여 steps 배열로 만든다.

◾ 만약 체스판 이내에 있게 되면 카운트 해준다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

728x90