컴퓨터는 잘못이 없다..
[알고리즘]구현_왕실의 나이트(행,열 이동에 따른 증감),(파이썬 ord()) 본문
['왕실의 나이트' 문제 설명]
-난이도 : ★☆☆
-풀이시간 : 20분
-시간 제한 : 1초
-메모리 제한 : 128MB
-출처 : 이것이 코딩테스트다(p.115)
-문제 :
행복 왕국의 왕실 정원은 체스판과 같은 8x8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서 있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다.
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다.
나이트는 특정한 위치에서 다음과 같은 2가지 경우로 이동할 수 있다.
1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기
a | b | c | d | e | f | g | h | |
1 | ||||||||
2 | ||||||||
3 | ||||||||
4 | ||||||||
5 | ||||||||
6 | ||||||||
7 | ||||||||
8 |
이처럼 8x8 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하시오.
ex) a1의 경우 이동할 수 있는 경우의 수는 다음 2가지이다. (c2, b3)
ex) c2에 있다면 이동할 수 있는 경우의 수는 6가지 이다.
-입력조건: 첫째 줄에 8X8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1처럼 열과 행으로 이뤄진다.
-출력조건: 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
-입력예시1
a1
-출력예시1
2
['왕실의 나이트' 답안1]
#현재 나이트의 위치 입력받기
input_data = input()
row = int(input_data[1]) #행은 1~8
col = ord(input_data[0]) +1 - ord('a')
#ord는 문자의 아스키코드 값을 알려준다. a=97
#나이트가 이동할 수 있는 8가지 방향을 정의하기
#복잡하게 생각하지 말고 2칸 1칸 +, - 조합으로 모든 경우의 수를 적어주면 된다.
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] #실수하지 말기!! steps의 요소가 step에 있음!
next_col = col + step[1]
#해당 위치로 이동이 가능하다면 카운트 증가
if next_row>=1 and next_row<=8 and next_col>=1 and next_col<=8 :
result=result+1
print(result)
[설명]
-8X8 좌표평면이다. 이동방향에 따른 행, 열 값의 증감을 알아보자
a | b | c | d | e | f | g | h | |
1 | (1,1) | (1,2) | (1,3) | (1,4) | (1,5) | (1,6) | (1,7) | (1,8) |
2 | (2,1) | |||||||
3 | (3,1) | |||||||
4 | (4,1) | |||||||
5 | (5,1) | |||||||
6 | (6,1) | |||||||
7 | (7,1) | |||||||
8 | (8,1) |
└이동방향에 따른 행,열 값의 변화 (행,열)
오른쪽으로 가면(변화없음,1씩증가), 왼쪽으로 가면(변화없음,1씩감소),
아래쪽으로 가면(1씩증가,변화없음), 위쪽으로 가면(1씩감소, 변화없음)
└(X,Y)
오른쪽으로 가면 Y만 증가
왼쪽으로 가면 Y만 감소
아래쪽으로가면 X만 증가
위쪽으로가면 X만 감소
암기하지말고0,0 0,11,0이렇게 적어놓고 x,y의 이동에 따른 증가,감소 보면됨!
-말이 이동할 수 있는 최대 경우의 수 8가지 (나이트가 이동할 수 있는 8가지 방향이다.)
v(도착지1) | v | v(도착지2) | ||
v(도착지8) | v | v(도착지3) | ||
v | v | 나이트의 위치 | v | v |
v(도착지7) | v | v(도착지4) | ||
v(도착지6) | v | v(도착지5) |
도착지1 (-2,-1)
도착지2 (-2, 1)
도착지3 (-1,2)
도착지4 (1,2)
도착지5 (2,1)
도착지6 (2,-1)
도착지7 (1,-2)
도착지8 (-1,-2)
-8가지 이동방향에 따른 최종 도착지 위치 계산하기
이렇게 모든 나이트가 이동할 수 있는 8가지 방향을 정해 준 후 8가지 뱡향을 적용해 도착지 위치를 모두 계산한 후
8x8 범위를 벗어나지 않으면 result를 증가시키는 방법으로 구현한다.
-참고
참고로 비슷한 문제인 '상하좌우' 문제에서는 dx, dy 리스트를 선언하여 이동할 방향을 기록할 수 있도록 하였다.
이번 소스코드에서는 steps변수가 dx, dy변수의 기능을 대신하여 수행한다.
2가지 형태 모두 자주 사용되므로, 참고하도록 하자.
[알고리즘]구현_상하좌우(파이썬 입력받는 예제) (tistory.com)
[파이썬]
-ord()
'공부 > 알고리즘(파이썬)' 카테고리의 다른 글
[알고리즘]구현_게임게발(파이썬 2차원리스트를 리스트 컴프리헨션 문법으로 초기화/append()와 extend()/함수 내 global변수) (0) | 2020.12.04 |
---|---|
[알고리즘]구현_시각(파이썬 포함연산자 in, not in/숫자를 문자로 바꾸는 메소드 str()과 연결연산자 +) (1) | 2020.12.02 |
[알고리즘]구현_상하좌우(파이썬 입력받는 예제) (1) | 2020.12.02 |