Tag: simulation
All the articles with the tag "simulation".
n, w, L = map(int, input().split())
trucks = list(map(int, input().split()))
bridge = deque([0] * w)
t = 0
cur_w = 0
i = 0
while i < n:
t += 1
cur_w -= bridge.popleft()
if cur_w + trucks[i] <= L:
bridge.append(trucks[i])
cur_w += trucks[i]
i += 1
else:
bridge.append(0)
t += w
print(t)트럭
백준 13335번 '트럭' (실버 1) 문제 풀이. implementation, data structures, simulation 로 접근했다.
field = list(map(list, [input() for _ in range(12)]))
dyx = [(1, 0), (0, 1), (-1, 0), (0, -1)]
def bfs(sy, sx):
visited = set()
q = [(sy, sx)]
visited.add((sy, sx))
while q:
y, x = q.pop(0)
for dy, dx in dyx:
ny, nx = y + dy, x + dx
if not(0 <= ny < 12 and 0 <= nx < 6):
continue
if (ny, nx) in visited:
continue
if field[ny][nx] == field[sy][sx]:
visited.add((ny, nx))
q.append((ny, nx))
if len(visited) >= 4:
for y, x in visited:
field[y][x] = '.'
return True
return False
cnt = 0
while True:
is_remove = False
for i in range(12):
for j in range(6):
if field[i][j] == '.':
continue
if bfs(i, j):
is_remove = True
if not is_remove:
break
# 블록 내리기
for j in range(6):
stack = []
for i in range(11, -1, -1):
if field[i][j] == '.':
continue
stack.append(field[i][j])
field[i][j] = '.'
i = 11
while stack:
field[i][j] = stack.pop(0)
i -= 1
cnt += 1
print(cnt)Puyo Puyo
백준 11559번 'Puyo Puyo' (골드 4) 문제 풀이. implementation, graph theory, graph traversal 로 접근했다.
P = list(map(int, input().split()))
S = list(map(int, input().split()))
def shuffle_card(cards, S):
new_cards = [0] * (N)
for i, n_i in enumerate(S):
new_cards[n_i] = cards[i]
return new_cards
cards = P[:]
answer = [0, 1, 2] * (N // 3)
cnt = 0
while answer != cards:
cards = shuffle_card(cards, S)
cnt += 1
if cards == P:
print(-1)
break
else:
print(cnt)카드 섞기
백준 1091번 '카드 섞기' (골드 4) 문제 풀이. implementation, simulation 로 접근했다.
import heapq
def nag_int(s):
"""음수 정수를 반환"""
return -int(s)
TC = int(input())
for t in range(TC):
N, M = map(int, input().split())
importance_list = list(map(nag_int, input().split()))
q = deque([(i, im) for i, im in enumerate(importance_list)])
heapq.heapify(importance_list)
cnt = 1
cur_min = heapq.heappop(importance_list)
while q:
i, im = q.popleft()
if i == M and cur_min == im:
# M 번째 출력되면 끝
break
elif cur_min == im:
# 출력 가능하면 다음으로
cur_min = heapq.heappop(importance_list)
cnt += 1
else:
# 출력 안되면 대기열 맨 뒤로
q.append((i, im))
print(cnt)프린터 큐
백준 1966번 '프린터 큐' (실버 3) 문제 풀이. implementation, data structures, simulation 로 접근했다.
N, K = map(int, input().split())
durability = deque(map(int, input().split()))
belt = deque([False] * (N * 2)) # belt 위에 로봇이 있는지 여부
PUT_IDX = 0
OUT_IDX = N - 1
round_num = 1
while True:
# 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다.
durability.rotate()
belt.rotate()
# 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
belt[OUT_IDX] = False
# 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다.
for i in range(N - 2, -1, -1):
# 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다.
if not belt[i]:
continue
n_i = i + 1
if not belt[n_i] and durability[n_i] >= 1:
durability[n_i] -= 1
belt[i] = False
belt[n_i] = True
# 언제든지 로봇이 내리는 위치에 도달하면 그 즉시 내린다.
belt[OUT_IDX] = False
# 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다.
if durability[PUT_IDX]:
durability[PUT_IDX] -= 1
belt[PUT_IDX] = True
# 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다.
if durability.count(0) >= K:
break
round_num += 1
print(round_num)컨베이어 벨트 위의 로봇
백준 20055번 '컨베이어 벨트 위의 로봇' (골드 5) 문제 풀이. implementation, simulation 로 접근했다.
MAX_W = 1000
N, M = map(int, input().split())
if N != 0:
books = list(map(int, input().split()))
cnt = 1
remain_w = M
for book in books:
# 더 넣을 수 없으면 포장
if remain_w < book:
cnt += 1
remain_w = M
remain_w -= book
print(cnt)
else:
print(0)짐 챙기는 숌
백준 1817번 '짐 챙기는 숌' (실버 5) 문제 풀이. implementation, greedy algorithm, simulation 로 접근했다.
첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다.
둘째 줄부터 N개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 곳의 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10 미만의 자연수 또는 0이다.
마지막 줄에는 이동하는 명령이 순서대로 주어진다. 동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4로 주어진다.
이동할 때마다 주사위의 윗 면에 쓰여 있는 수를 출력한다. 만약 바깥으로 이동시키려고 하는 경우에는 해당 명령을 무시하고, 출력도 하지 않는다.
주사위의 상태를 관리하며 시뮬레이션하는 구현 문제이다.
주사위 굴리기
백준 14499번 '주사위 굴리기' (골드 4) 문제 풀이. implementation, simulation 로 접근했다.
def toggle_switch(switches, N, gender, num):
if gender == 1:
# 남학생은 스위치 번호가 자기가 받은 수의 배수이면, 그 스위치의 상태를 바꾼다.
for i in range(num - 1, N, num):
switches[i] = (switches[i] + 1) % 2
else:
# 여학생은 자기가 받은 수와 같은 번호가 붙은 스위치를 중심으로 좌우가 대칭이면서 가장 많은 스위치를 포함하는 구간을 찾아서, 그 구간에 속한 스위치의 상태를 모두 바꾼다.
num -= 1
switches[num] = (switches[num] + 1) % 2
i = 1
while num - i >= 0 and num + i < N:
if switches[num - i] != switches[num + i]:
break
switches[num - i] = (switches[num - i] + 1) % 2
switches[num + i] = (switches[num + i] + 1) % 2
i += 1
return switches
N = int(input())
switches = list(map(int, input().split()))
M = int(input())
for _ in range(M):
gender, num = map(int, input().split())
switches = toggle_switch(switches, N, gender, num)
for i in range(N // 20 + 1):
print(*switches[i*20:(i + 1)*20])스위치 켜고 끄기
백준 1244번 '스위치 켜고 끄기' (실버 4) 문제 풀이. implementation, simulation 로 접근했다.
첫째 줄에 N, L, R이 주어진다. (1 ≤ N ≤ 50, 1 ≤ L ≤ R ≤ 100)
둘째 줄부터 N개의 줄에 각 나라의 인구수가 주어진다. r행 c열에 주어지는 정수는 A[r][c]의 값이다. (0 ≤ A[r][c] ≤ 100)
인구 이동이 발생하는 일수가 2,000번 보다 작거나 같은 입력만 주어진다.
인구 이동이 며칠 동안 발생하는지 첫째 줄에 출력한다.
이 문제는 시뮬레이션과 BFS를 결합한 문제이다. 매일 국경선이 열리는 나라들을 찾아 연합을 만들고, 인구를 재분배하는 과정을 반복해야 한다.
인구 이동이 일어나는 하루는 다음과 같은 과정을 거친다:
- 연합 찾기: BFS를 사용하여 국경선이 열리는 나라들의 연합을 찾는다.
- 인구 재분배: 각 연합의 평균 인구수를 계산하고 재분배한다.
- 종료 조건 확인: 어떤 연합도 만들어지지 않으면 인구 이동 종료.
open 함수)인구 이동
백준 16234번 '인구 이동' (골드 4) 문제 풀이. implementation, graph theory, graph traversal 로 접근했다.