#2 구현

이말감·2021년 6월 23일
0

알고리즘

목록 보기
2/11

예제 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) 게임 개발

나중에 풀기로 미룸

profile
전 척척학사지만 말하는 감자에요

0개의 댓글