알고리즘/백준
[백준]230310-12 문제풀이
stubborngastropod
2023. 3. 13. 01:09
728x90
9019. DSLR
from collections import deque
import sys
input = sys.stdin.readline
def zero(n):
while len(str(n)) < 4:
n = '0' + str(n)
return str(n)
def D(n):
return (n * 2) % 10000
def S(n):
if n > 0:
return n - 1
else:
return 9999
def L(n):
return int(n[1:] + n[0])
def R(n):
return int(n[-1] + n[:-1])
T = int(input())
for tc in range(T):
a, b = map(int, input().split())
queue = deque([])
queue.append(a)
visited = [''] * 10000
while queue:
now = queue.popleft()
if now == b:
ans = visited[now]
break
if now != 0 and not visited[D(now)]:
queue.append(D(now))
visited[D(now)] = visited[now] + 'D'
if not visited[S(now)]:
queue.append(S(now))
visited[S(now)] = visited[now] + 'S'
if not visited[(L(zero(now)))]:
queue.append(L(zero(now)))
visited[L(zero(now))] = visited[now] + 'L'
if not visited[(R(zero(now)))]:
queue.append(R(zero(now)))
visited[R(zero(now))] = visited[now] + 'R'
print(ans)
확실히 BFS는 손에 익으니까 할만한 것 같다. 원래 큐에 방문한 문자열을 전부 저장해가면서 했는데 메모리 초과가 떠서 각 숫자를 인덱스로 하는 방문 목록에 문자 하나씩 추가해가면서 답을 찾아냈다. R이랑 L 구현 과정, 큐에 append하는 과정이 조금 지저분하긴 해서 아쉽다.
9663. N-Queen
import sys
input = sys.stdin.readline
N = int(input())
def ispromising(n):
for i in range(n):
if board[n] == board[i] or abs(board[n] - board[i]) == abs(n - i):
return False
return True
def queen(n):
global ans
if n == N:
ans += 1
return
for i in range(N):
board[n] = i
if ispromising(n):
queen(n + 1)
board = [0] * N
ans = 0
queen(0)
print(ans)
엄청 유명한 백트래킹 문제. 8방향 델타, 쌩dfs 쓰면서 정통(이라고 생각했던) 방식으로 풀었는데 답도 안나오고 애초에 문제에서 메모리를 빡빡하게 줘서 정해진 답으로 풀어야 한다고 한다. 그래서 구글링 했는데 답 안보고 풀면 절대 못풀었을듯한... ispromising을 쓰면서 유망한지를 확인하는 과정, 퀸을 놓을 열(행)을 결정하는 과정, 대각선 여부를 확인하는 과정 모두 깔끔하게 된 정답 코드를 보면서 아직 공부해야 할게 너무 많이 남았다고 느꼈다. 아직도 사고방식이 브루트포스랑 구현에서 벗어나질 못하고 있는데, 이게 처음에 와꾸 짤 때 방해가 되는 것 같아서 어떻게 해야할지 고민이다.
728x90