예제 4-1) 상하좌우 (p.110)
@ 나의 풀이
import sys
input = sys.stdin.readline
n = int(input())
move = []
move = list(map(str, input().split()))
x = 1
y = 1
for m in move :
if m == "U":
if x == 1 :
continue
x += -1
elif m == "D" :
if x == n :
continue
x += 1
elif m == "L" :
if y == 1 :
continue
y += -1
elif m == "R" :
if y == 5 :
continue
y += 1
print(x, y)
아주 단순하게 L, R, U, D를 하나씩 대입해가면서 어느 방향으로 가야하는지 구했다.
@ 책의 풀이
import sys
input = sys.stdin.readline
n = int(input())
move = list(map(str, input().split()))
x, y = 1, 1
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
lrud = ['L', 'R', 'U', 'D']
for m in move :
for i in range(4) :
if m == lrud[i] :
nx = x + dx[i]
ny = y + dy[i]
if nx > n or nx < 1 or ny > n or ny < 1 :
continue
x, y = nx, ny
print(x, y)
L, R, U, D가 있는 리스트와 그에 해당하는 x, y의 이동값을 리스트로 만들어 이동할 계획서에 따라 이동값을 더한다. 이때 이동값이 1보다 작거나 n보다 클 경우 이동값을 더하지 않고 원래의 x, y 값으로 진행한다.
예제 4-2) 시각 (p.113)
@ 나의 풀이
import sys
input = sys.stdin.readline
count = 0
n = int(input())
for i in range(n+1) :
for j in range(60) :
for k in range(60) :
num = str(i) + str(j) + str(k)
if num.find('3') >= 0 :
count += 1
print(count)
3이 있는지 반복문 돌려서 구하기.
책의 풀이와 다른 점은 3이 있느냐 없느냐를 나는
if num.find('3') >= 0 으로 찾았고,
책은 if '3' in num으로 찾았다.
문자열이고 3의 위치를 찾는 문제가 아니므로 in을 사용해서 풀 수 있다.
실전문제 4-3) 왕실의 나이트
@ 나의 풀이
import sys
input = sys.stdin.readline
al = input()
n,m = al[0], int(al[1])
n2 = 0
moveA = [2, 2, -2, -2, 1, 1, -1, -1]
moveB = [1, -1, 1, -1, 2, -2, 2, -2]
alpha = ['a','b','c','d','e','f','g','h']
for i in range(8) :
if n == alpha[i] :
n2 = i+1
count = 0
for i in range(8) :
n3, m3 = n2, m
n3 += moveA[i]
m3 += moveB[i]
if n3 < 1 or n3 > 8 or m3 < 1 or m3 > 8 :
continue
count += 1
print(count)
2가지 경우로 움직일 수 있다고 했으므로 moveA, B에 이동할 수 있는 경우를 모두 작성하여 넣었다.
그리고 8x8 체스판이기 때문에 열 위치가 a부터 h까지 있으므로 alpha라는 리스트에 모두 넣었다.
for문으로 열 위치를 알아내고 열 위치와 행 위치에 moveA,B의 수를 다 넣어보면서 1보다 작거나 8보다 큰 경우가 있으면 count하지 않도록 작성하였다.
@ 책의 풀이
import sys
input = sys.stdin.readline
input_date = input()
row = int(input_date[1])
column = int(ord(input_data[0])) - int(ord('a')) + 1
steps = [(-2, -1), (-1, -2), (1, -2), (2, -1), (2, 1), (1, 2), (-1, 2), (-2, 1)]
result = 0
for step in steps :
next_row = row + step[0]
next_column = column + step[1]
if 1 <= next_row and next_row <= 8 and 1 <= next_column and next_column <= 8 :
result += 1
print(result)
먼저 ord를 이용해서 문자를 아스키코드로 바꿨고, int(ord('a'))를 빼서 몇 번인지 알 수 있도록
1을 더한 이유는 input_data[0]이 a일 때 int(ord('a'))를 빼면 0이므로 1을 더해서 a가 1, b가 2 ... 이렇게 풀 수 있도록 하였다.
그리고 움직일 수 있는 경우를 steps이라는 리스트에 넣었고, 그 안에 행, 열이 움직일 수 있는 방향을 넣었다. 이를 이용해서 반복문 돌리고 문제 해결
==> 문자를 숫자로 바꿔서 풀어야 할 때 아스키코드 사용하기 (ord), 문자열은 그 자체가 배열이므로 이 특성 잘 이해하고 사용하기.
실전문제 4-4) 게임 개발
나중에 풀기로 미룸