왕실의 나이트

Chori·2024년 9월 27일
0
post-thumbnail

이것이 취업을 위한 코딩 테스트다 with 파이썬을 공부하면서 정리한 내용입니다.


문제 내용

  • 체스판과 같은 8×88 \times 8 좌표 평면의 한 칸에 나이트가 있음
  • 나이트는 L자 형태로만 이동할 수 있으며 좌표 평면 밖으로 나갈 수 없음
  • 나이트가 이동할 수 있는 형태
    1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동
    2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동
  • 좌표 평면의 행 위치는 1부터 8로 표현하고 열 위치는 a부터 h로 표현
  • 좌표 평면 상에 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램 작성

입력 조건

  • 첫째 줄에 8×88 \times 8 좌표 평면 상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력됨
  • 입력 문자는 a1처럼 열과 행으로 이뤄짐

출력 조건

  • 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력

입력 예시 1

a1

출력 예시 1

2

입력 예시 2

c2

출력 예시 2

6

문제 해설

  • 나이트가 이동할 수 있는 경로를 하나씩 확인하여 이동
  • 좌표 평면을 벗어나지 않도록 검사하는 과정 필요
  • 나이트의 현재 위치에 이동 경로를 더한 다음 좌표 평면 위에 있는지 확인

소스 코드

# 현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1])
column = ord(input_data[0]) - ord('a') + 1

# 나이트가 이동할 수 있는 8가지 방향
steps = ((-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1))

# 8가지 방향에 대해 각 위치로 이동이 가능한지 확인
result = 0
for step in steps:
    # 이동하고자 하는 위치 확인
    next_row = row + step[0]
    next_column = column + step[1]
    # 해당 위치로 이동이 가능하면 카운트 증가
    if 1 <= next_row <= 8 and 1 <= next_column <= 8:
        result += 1

print(result)

나의 풀이

  • 입력받은 행과 열을 정수형으로 변환
  • 나이트가 움직일 수 있는 8가지 방향대로 움직이면서 가능한 경우 세기

소스 코드

import sys

# 나이트의 현재 위치 입력받기
location = list(sys.stdin.readline().rstrip())
init_x, init_y = location[0], int(location[1])

if init_x == 'a':
    init_x = 1
elif init_x == 'b':
    init_x = 2
elif init_x == 'c':
    init_x = 3
elif init_x == 'd':
    init_x = 4
elif init_x == 'e':
    init_x = 5
elif init_x == 'f':
    init_x = 6
elif init_x == 'g':
    init_x = 7
elif init_x == 'h':
    init_x = 8

# x, y는 나이트를 움직였을 때의 위치
x, y = init_x, init_y

count = 0

# 나이트를 8가지 방향으로 움직이면서 가능한 경우 세기
# 왼쪽으로 2번 이동
if (x := init_x - 2) >= 1:
    # 위쪽으로 1번 이동
    if (y := init_y - 1) >= 1:
        count += 1
    # 아래쪽으로 1번 이동
    if (y := init_y - 1) <= 8:
        count += 1

# 오른쪽으로 2번 이동
if (x := init_x + 2) <= 8:
    # 위쪽으로 1번 이동
    if (y := init_y - 1) >= 1:
        count += 1
    # 아래쪽으로 1번 이동
    if (y := init_y + 1) <= 8:
        count += 1

# 위쪽으로 2번 이동
if (y := init_y - 2) >= 1:
    # 왼쪽으로 1번 이동
    if (x := init_x - 1) >= 1:
        count += 1
    # 오른쪽으로 1번 이동
    if (x := init_x + 1) <= 8:
        count += 1

# 아래쪽으로 2번 이동
if (y := init_y + 2) >= 1:
    # 왼쪽으로 1번 이동
    if (x := init_x - 1) >= 1:
        count += 1
    # 오른쪽으로 1번 이동
    if (x := init_x + 2) <= 8:
        count += 1

print(count)
profile
전부인 것처럼, 전부가 아닌 것처럼

0개의 댓글