Dia Egg - Shugo Chara

Algorithm/이것이 취업을 위한 코딩테스트다

왕실의 나이트 (구현/실전)

별ㅇI 2023. 4. 14. 19:12
728x90
반응형

왕실의 나이트

행복 왕국의 왕실 정원은 체스판과 같은 8 × 8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다.
나이트는 매우 충성스러운 신하로서 매일 무술을 연마한다
나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다
나이트는 특정 위치에서 다음과 같은 2가지 경우로 이동할 수 있다

  1. 수평으로 두 칸 이동한 뒤에 수직으로 한 칸 이동하기
  2. 수직으로 두 칸 이동한 뒤에 수평으로 한 칸 이동하기

이처럼 8 × 8 좌표 평면상에서 나이트의 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는
프로그램을 작성하라. 왕실의 정원에서 행 위치를 표현할 때는 1부터 8로 표현하며, 열 위치를 표현할 때는
a 부터 h로 표현한다

  • c2에 있을 때 이동할 수 있는 경우의 수는 6가지이다
  • a1에 있을 때 이동할 수 있는 경우의 수는 2가지이다

 


입력 조건

첫째 줄에 8x8 좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다. 입력 문자는 a1 처럼 열과 행으로 이뤄진다.

 

출력 조건

첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.

 

입력 예시

a1

 

출력 예시

2

 

 

 


 

문제 해설

나는 따로 조건문을 설정하는 것을 생각했다. 이 과정에서 "can only concatenate str (not "int") to str" 라는 오류가 자꾸 발생하였는데 이는 내가 아스키코드가 아닌 그냥 문자의 비교로 조건문을 수행하려다 생긴 문제였다. 이와 관련해서는 오류해결 카테고리에 정리해두엇으니 혹시 같은 문제를 겪고 있다면 참고해주기를 바란다! 

 

문제집에서는 움직일 수 잇는 방향 자체를 하나의 리스트로 저장하여 뽑아 쓰는 형식을 사용 했다. 앞에서도 한번 사용한 적이 있지만 아직 이러한 방법을 한번에 떠올리기에 나는 아직 미숙한것같다. 더 열심히 공부해야지!

그리고 또 내 코드를 더 간단학 만들 수 있는 방법은 일단 first, second라는 변수로 옮길때부터 아스키 코드로 바꾸고 더해 소문자 비교에서는 a의 아스키코드를 뺀 값의 +1과 비교 했으면 더 간결하게 코드를 써 나갈 수 있었을 것같다. 

이를 염두에 두고 짠 코드가 두번째 코드이다.

 

 


코드

 

첫번째 코드

data = input()
first = str(data[0])
second = int(data[1])
count = 0

if ord('a')<=ord(first)+1<=ord('h') and 1<=second+2<=8 :
    count += 1
if ord('a')<=ord(first)+1<=ord('h') and 1<=second-2<=8 :
    count += 1
if ord('a')<=ord(first)-1<=ord('h') and 1<=second+2<=8 :
    count += 1
if ord('a')<=ord(first)-1<=ord('h') and 1<=second-2<=8 :
    count += 1
if ord('a')<=ord(first)+2<=ord('h') and 1<=second+1<=8 :
    count += 1
if ord('a')<=ord(first)+2<=ord('h') and 1<=second-1<=8 :
    count += 1
if ord('a')<=ord(first)-2<=ord('h') and 1<=second+1<=8 :
    count += 1
if ord('a')<=ord(first)-2<=ord('h') and 1<=second-1<=8 :
    count += 1

print(count)

 

두번째 코드

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

steps = [(1,2),(1,-2),(-1,2),(-1,-2),(2,1),(2,-1),(-2,1),(-2,-1)]

for step in steps:
    next_row = row + step[0]
    next_column = column + step[1]
    if next_row > 0 and next_row <=8 and next_column > 0 and next_column <=8:
        result += 1

print(result)
728x90
반응형