왕실 정원은 체스판과 같은 8x8 좌표 평면이다. 왕실 정원의 특정한 한 칸에 나이트가 서있다. 나이트는 말을 타고 있기 때문에 이동을 할 때는 L자 형태로만 이동할 수 있으며 정원 밖으로는 나갈 수 없다. 나이트는 다음과 같은 2가지 경우로 이동할 수 있다.
이처럼 8x8 좌표 평면상에서 나이트위 위치가 주어졌을 때 나이트가 이동할 수 있는 경우의 수를 출력하는 프로그램을 작성하라. 행 위치는 1~8 열 위치는 a~h
전형적인 시뮬레이션, 완전 탐색 유형이면서 2차원 좌표를 이용하는 구현 문제이다.
입력 조건 : 첫째 줄에는 8x8좌표 평면상에서 현재 나이트가 위치한 곳의 좌표를 나타내는 두 문자로 구성된 문자열이 입력된다.
출력 조건 : 첫째 줄에 나이트가 이동할 수 있는 경우의 수를 출력하시오.
a = list(input())
x,y = a[1],a[0]
abc = ['a','b','c','d','e','f','g','h']
ax = 0
for xstr in abc:
ax += 1
if x == abc[xstr]:
return x = ax
dx = [0,0,-1,1]
dy = [-1,1,0,0]
count = 0
for row in range(2,4):
nx = x + dx[row] + dx[row]
ny = y + dy[row] + dy[row]
for column in range(2):
nx = nx + dx[column]
ny = ny + dy[column]
if nx >= 1 or nx <= 8 or ny >= 1 or ny >= 8:
count += 1
for column in range(2):
nx = x + dx[column] + dx[column]
ny = y + dy[column] + dy[column]
for row in range(2,4):
nx = nx + dx[row]
ny = ny + dy[row]
if nx >= 1 or nx <= 8 or ny >= 1 or ny >= 8:
count += 1
print(count)
요구사항대로 충실히 구현하면 되는 문제이다. 나이트의 8가지 경로를 하나씩 확인하며 각 위치로 이동이 가능한지 확인한다. 리스트를 이용하여 8가지 방향에 대한 방향 벡터를 정의한다.
input_data = input()
row = int(input_data[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
steps = [(-2,-1),(-2,1),(2,-1),(2,1),(-1,-2),(1,-2),(-1,2),(1,2)]
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)
8가지 경로를 하나씩 확인하려고 생각한것 까지는 좋았는데, 거기까지만 좋았음
문자열 string은 원래 배열이므로 list로 바꿔주지 않아도 됐었다.
현재 위치를 지정할때, [0][0] 즉, 1행 1열을 어떻게 설정해야 할지 모르겠다면 그냥 공간에 존재하지 않는다는 식으로 코드를 짜면 된다. (if구문 참조)
열을 나타내는 문자 a~h를 굳이 1~8로 치환을 해줘야 한다고 생각했다. 치환할 필요 없이 아스키코드를 활용해 a~h문자들을 숫자로 표현하여 기준이 되는 a를 기준으로 나타내는 방법이 있었다..! 너무 복잡하게 생각한것 같다.
8가지 경로를 for문으로 적었는데, steps로 표현한것보다 훨씬 복잡하다. for문이 더 효율적일것 같다는 편견이 생긴것 같은데... 고작 8가지라면 리스트로 표현을 하여 각각을 대입해보는게 훨씬 빠르고 간편한 것 같다.
공간을 벗어날 경우 count를 하는 if문을 적었는데, or로 적었음;;; 아니 무슨... 이런 코드를 다적었지... 저번에 이런식으로 적은 코드가 있어서 똑같이 따라 적은듯하다.. 이러지 말자 ;-;
ord() : 특정한 한 문자를 아스키 코드 값으로 변환해 주는 함수
chr() : 아스키 코드 값을 문자로 변환해 주는 함수(10진수, 16진수 사용 가능)
아스키코드(ASCII) : 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 쉽게 말해 각 문자마다 숫자로 된 코드 번호를 부여해 놓은 것 ㅇㅇ 컴퓨터는 데이터를 숫자로 받아들이니까 ㅇㅇ
문자 인코딩(character encoding = text encoding) : 사용자가 입력한 문자나 기호들을 컴퓨터가 이용할 수 있는 신호로 만드는 것
저번에 했던 코드를 떠올리려고 했다. 했던 작업을 떠올리는것은 좋지만 무조건 "똑같이" 적으려고 했다는 점에서 굉장히 멍청했다. 목적에 따라 문제 해결 방식은 달라지는 것인데, 예전에 했던 코드를 "똑같이" 적으려고는 하지 말자. 참조만!!!!!
열심히 작성한 for문을 살리고 싶어서 뜯어고쳤는데, for column in range(2): 이 구문에서 nx,ny를 설정한것 까지는 다 좋은데 두번째 반복문일때 nx = nx + dx[column] 우변의 nx가 처음반복문때와 달라져서 결과가 이상하게 나왔음!!!!!!! 그래서 그냥 마지막 위치를 lx,ly로 새로운 변수로 지정해줬다.
그리고 if lx >= 1 and lx <= 8 and ly >= 1 and ly <= 8: 이 부분에서 처음에 실수로 >= 8: 이런식으로 적어서 결과가 제대로 안나왔다.
a = input()
x = int(a[1])
y = int(ord(a[0])) - int(ord('a')) + 1
dx = [0,0,-1,1]
dy = [-1,1,0,0]
count = 0
for row in range(2,4):
nx = x + dx[row] + dx[row]
ny = y + dy[row] + dy[row]
for column in range(2):
lx = nx + dx[column]
ly = ny + dy[column]
if lx >= 1 and lx <= 8 and ly >= 1 and ly <= 8:
count += 1
for column in range(2):
nx = x + dx[column] + dx[column]
ny = y + dy[column] + dy[column]
for row in range(2,4):
lx = nx + dx[row]
ly = ny + dy[row]
if lx >= 1 and lx <= 8 and ly >= 1 and ly <= 8:
count += 1
print(count)