문제 요약
8X8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.
이 때 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는 a부터 h로 표현된다.
나의 코드 및 설명 (맞았습니다!!)
- location : 나이트의 위치를 입력
a1을 입력했을 때 ['a', '1'] 처럼 리스트에 담게끔 작성하였다. - location_num : 나이트의 위치를 숫자화하여 리스트에 저장하기 위해 작성
a일 때 1, b일 때 2,, 처럼 표현하기 위함이다. - move_type : 나이트가 움직일 수 있는 모든 위치를 A부터 H로 표현하였다.
- dx : 행의 움직임을 나타낸다.
- dy : 열의 움직임을 나타낸다.
- nx, ny : 움직임을 끝낸 나이트의 위치의 행, 열을 각각 nx, ny로 표현하였고,
if문을 통해 나이트가 왕실의 정원에서 벗어나면 다음 반복을 수행하도록 작성하였다. - 단순하게 풀었으나, 코드가 너무 복잡하고, 전문성이 없어보인다.
location = list(str(input()))
location_num = []
if location[0] == "a":
location_num.append(1)
location_num.append(int(location[1]))
elif location[0] == "b":
location_num.append(2)
location_num.append(int(location[1]))
elif location[0] == "c":
location_num.append(3)
location_num.append(int(location[1]))
elif location[0] == "d":
location_num.append(4)
location_num.append(int(location[1]))
elif location[0] == "e":
location_num.append(5)
location_num.append(int(location[1]))
elif location[0] == "f":
location_num.append(6)
location_num.append(int(location[1]))
elif location[0] == "g":
location_num.append(7)
location_num.append(int(location[1]))
elif location[0] == "h":
location_num.append(8)
location_num.append(int(location[1]))
move_type = ["A","B","C","D","E","F","G","H"]
dx = [2,2,1,-1,-2,-2,-1,1]
dy = [1,-1,-2,-2,-1,1,2,2]
count = 0
for j in range(len(move_type)):
nx, ny = 0, 0
nx = location_num[0]+dx[j]
ny = location_num[1]+dy[j]
if nx < 1 or ny < 1 or nx > 8 or ny > 8:
continue
else:
count += 1
print(count)
교재의 코드 및 설명
- ord 함수를 통해 문자 a를 숫자로 변환하였다.
참고로 ord('a') = 97 / char(65) = A 이다. 유용하게 사용할 것 같으니 꼭 기억하자.
#현재 나이트의 위치 입력받기
location = input()
row = int(location[1]) #행
column = ord(location[0]) - (ord('a')) + 1
#나이트가 이동할 수 있는 8가지 방향 정의
steps = [(-2,-1),(-1,-2),(1,-2),(2,-1),(2,1),(1,2),(-1,2),(-2,1)]
#8가지 방향에 대하여 각 위치로 이동이 가능한지 확인
count = 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:
count += 1
print(count)
피드백
앞의 상하좌우 문제 덕분에 비교적 간단하게 풀 수 있었지만, 숙달이 부족하다.
행과 열을 벗어나는지 구하는 문제는 행과 열을 따로 구분하여 계산하는 것이 간단하다는 법을 배웠다.
특히 1. 어떠한 문자열 A를 입력했을 때 A[0],A[1] 을 통해 문자열의 각 문자로 접근이 가능하다는 점은 기본 문법이지만 꼭 기억해야겠다.
2. A_list = [(1,2),(3,4)] 의 리스트가 있을 때 리스트 요소 A[0] 은 (1,2) 즉, 리스트 요소에도 접근 가능하다는 점도 기억해야겠다.
'이코테' 카테고리의 다른 글
[이코테] Chapter4-3 구현 / 게임 개발 (0) | 2023.02.20 |
---|---|
[이코테] Chapter4-1 구현 / 시각 (0) | 2023.02.19 |
[이코테] Chapter3-1 그리디 / 거스름돈 (0) | 2023.02.19 |