본문 바로가기
연습

[구현] 왕실의 나이트

by ybs 2021. 10. 31.
반응형

나이트 위치를 입력을 받았을 때 이동할 수 있는 경우의 수를 출력해보자.

def convert(alphabet):
	if alphabet == 'a':
		return 1
	if alphabet == 'b':
		return 2
	if alphabet == 'c':
		return 3
	if alphabet == 'd':
		return 4
	if alphabet == 'e':
		return 5
	if alphabet == 'f':
		return 6
	if alphabet == 'g':
		return 7
	if alphabet == 'h':
		return 8

s = input()
x = convert(s[0])
y = int(s[1])

dx = [-2, -2, 2, 2, -1, -1, 1, 1]
dy = [1, -1, 1, -1, 2, -2, 2, -2]

count = 0

for i in range(8):
	nx = x + dx[i]
	ny = y + dy[i]
	
	if nx < 1 or nx > 8 or ny < 1 or ny > 8:
		continue
	count += 1

print(count)

컬럼이 8개밖에 안되므로 a~h 를 1~8 로 convert 하는 함수를 직접 만들었다. 나이트가 이동할 수 있는 전체 경우의 수는 8가지 이므로 for문을 돌면서 전체다 이동해보고 배열 밖을 벗어나는지 체크했다.

 

책의 정답 코드를 보니 convert 를 직접하지 않고 내장 함수 ord 를 이용했다. ord 함수는 문자를 아스키코드값으로 리턴해준다. 예를 들어 ord('a') 는 97이다. 아래와 같이 입력받은 알파벳 문자에 ord('a') 를 빼고 1을 더함으로써 알파벳과 숫자를 맵핑했다.

input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1

 

그리고 나이트가 이동 가능한 x, y 를 각각 list로 담지 않고 묶어서 담았다.

input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(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 next_row >=1 and next_row <= 8 and next_column >= 1 and next_column <= 8:
		result += 1

print(result)

 

출처 : 이것이 코딩테스트다 나동빈 저

반응형

'연습' 카테고리의 다른 글

[구현] 럭키 스트레이트  (0) 2021.11.14
[구현] 게임 개발  (0) 2021.11.08
[그리디] 숫자 카드 게임  (2) 2021.10.24
[그리디] 무지의 먹방 라이브  (0) 2021.10.17
[그리디] 볼링공 고르기  (0) 2021.10.11