컴퓨터는 잘못이 없다..

[알고리즘]구현_왕실의 나이트(행,열 이동에 따른 증감),(파이썬 ord()) 본문

공부/알고리즘(파이썬)

[알고리즘]구현_왕실의 나이트(행,열 이동에 따른 증감),(파이썬 ord())

도토리까꿍v 2020. 12. 3. 00:49
Contents 접기

['왕실의 나이트' 문제 설명]

-난이도 : ★☆

-풀이시간 : 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)

 

[알고리즘]구현_상하좌우(파이썬 입력받는 예제)

['상하좌우' 문제 설명] -난이도 : ★☆☆ -풀이시간 : 15분 -시간 제한 : 1초 -메모리 제한 : 128MB -출처 : 이것이 코딩테스트다(p.110) -문제 : 여행가 A는 NxN크기의 정사각형 공간 위에 서있다. 이 공

sjy1218vv.tistory.com

 

[파이썬]

-ord()

 

 

Comments