컴공생 누르지 마세요! 컴공생 울어요.

[구현] 구현 (2) 실전 문제 - 왕실의 나이트 본문

STUDY/알고리즘

[구현] 구현 (2) 실전 문제 - 왕실의 나이트

당도최고치악산멜론 2023. 3. 11. 16:41

이코테 p.115 실전 문제 - 왕실의 나이트

내 소스코드

상하좌우 각각에 대하여 2칸 이동할 수 있는지 확인

상하로 이동했다면 좌우로 1칸 이동할 수 있는지 확인

좌우로 이동했다면 상하로 1칸 이동할 수 있는지 확인

data = input()
row = data[:1]  # 알파벳
col = int(data[1:])  # 숫자

result = 0

if 3 <= col:  # 위로 2칸 이동 가능
  if 'b' <= row and row <= 'g':  # 좌우 둘 다 1칸 이동 가능
    result += 2
  elif 'b' <= row or row <= 'g':  # 좌우 둘 중에 하나만 1칸 이동 가능
    result += 1

if col <= 6:  # 아래로 2칸 이동 가능
  if 'b' <= row and row <= 'g':
    result += 2
  elif 'b' <= row or row <= 'g':
    result += 1

if 'c' <= row:  # 좌로 2칸 이동 가능
  if 'b' <= row and row <= 'g':
    result += 2
  elif 'b' <= row or row <= 'g':
    result += 1

if row <= 'f':  # 우로 2칸 이동 가능
  if 'b' <= row and row <= 'g':
    result += 2
  elif 'b' <= row or row <= 'g':
    result += 1

print(result)

교재 소스코드

steps를 이용하여 나이트의 이동 경로를 나타냄. 나이트의 현재 위치가 주어지면 이동 경로를 더한 다음, 이동 후 위치가 8x8 좌표 평면에 있는지 확인.

* ord(문자) : 하나의 문자를 입력으로 받고, 해당 문자의 아스키 코드를 반환

* steps 변수를 이용하는 테크닉 잘 알아두기

# 현재 나이트의 위치 입력받기
data = input()
row = int(data[1])
# a -> 1, b -> 2, ...로 나타내기
col = int(ord(data[0])) - int(ord('a')) + 1

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

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

print(result)

 

Comments