Tag: implementation
All the articles with the tag "implementation".
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 로 접근했다.
from itertools import permutations
N = int(input())
hit_result = [list(map(int, input().split())) for _ in range(N)]
max_score = 0
# permutations는 애초에 중복 없음 → set() 필요 없음
for perm in permutations([i for i in range(1, 9)]): # 1번 선수 제외 순열
order = list(perm[:3]) + [0] + list(perm[3:]) # 0번(1번 선수) 4번 타자 고정
score = 0
idx = 0 # 타석 순서 인덱스
for inning in hit_result:
out = 0
base1, base2, base3 = 0, 0, 0 # 각 루의 주자 (0/1)
while out < 3:
result = inning[order[idx]]
if result == 0:
out += 1
elif result == 1:
score += base3
base1, base2, base3 = 1, base1, base2
elif result == 2:
score += base3 + base2
base1, base2, base3 = 0, 1, base1
elif result == 3:
score += base3 + base2 + base1
base1, base2, base3 = 0, 0, 1
elif result == 4:
score += base3 + base2 + base1 + 1
base1, base2, base3 = 0, 0, 0
idx = (idx + 1) % 9
max_score = max(max_score, score)
print(max_score)⚾
백준 17281번 '⚾' (골드 4) 문제 풀이. implementation, bruteforcing 로 접근했다.
학생은 1번부터 N²번까지 번호가 매겨져 있고, (r, c)는 r행 c열을 의미한다. (r, c)의 인접한 칸은 (r-1, c), (r+1, c), (r, c-1), (r, c+1)이다.
학생이 좋아하는 학생 4명이 주어지고, 다음 순서로 자리를 배정한다.
- 비어있는 칸 중에서 좋아하는 학생이 인접한 칸에 가장 많은 칸으로 자리를 정한다.
- 1을 만족하는 칸이 여러 개이면, 인접한 칸 중에서 비어있는 칸이 가장 많은 칸으로 자리를 정한다.
- 2를 만족하는 칸도 여러 개인 경우에는 행의 번호가 가장 작은 칸으로, 그러한 칸도 여러 개이면 열의 번호가 가장 작은 칸으로 자리를 정한다.
학생의 만족도는 자리 배치가 모두 끝난 후에 구할 수 있다. 학생의 만족도를 구하려면 그 학생과 인접한 칸에 앉은 좋아하는 학생의 수를 구해야 한다. 그 값이 0이면 0, 1이면 1, 2이면 10, 3이면 100, 4이면 1000이다.
구현 문제이다. 주어진 규칙대로 정확하게 구현하면 된다.
상어 초등학교
백준 21608번 '상어 초등학교' (골드 5) 문제 풀이. implementation 로 접근했다.
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 로 접근했다.
import re
N = int(input())
room = [input() for _ in range(N)]
# 가로
row_cnt = sum(len(re.findall(r'\.{2,}', row)) for row in room)
# 세로
transposed = [''.join(row[i] for row in room) for i in range(N)]
col_cnt = sum(len(re.findall(r'\.{2,}', col)) for col in transposed)
print(row_cnt, col_cnt)
정규표현식 \.{2,}는 “연속된 2개 이상의 .”을 의미한다.
누울 자리를 찾아라
백준 1652번 '누울 자리를 찾아라' (실버 5) 문제 풀이. implementation, string 로 접근했다.
m = int(input())
s = 0 # 비트마스크
for _ in range(m):
command = input().strip().split()
if command[0] == 'add':
x = int(command[1])
s |= (1 << x)
elif command[0] == 'remove':
x = int(command[1])
s &= ~(1 << x)
elif command[0] == 'check':
x = int(command[1])
print(1 if s & (1 << x) else 0)
elif command[0] == 'toggle':
x = int(command[1])
s ^= (1 << x)
elif command[0] == 'all':
s = (1 << 21) - 1
elif command[0] == 'empty':
s = 0집합
백준 11723번 '집합' (실버 5) 문제 풀이. implementation, set, bitmask 로 접근했다.
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 로 접근했다.