[Baekjoon-Python] 17143 : 낚시왕
https://www.acmicpc.net/problem/17143 접근 격자의 열 크기(C)가 5라면 상어가 이동할 때 인덱스(c)는 0, 1, 2, 3, 4, 3, 2, 1, ...이 된다. 상어가 움직일 때 인덱스에 사이클이 발생한다. 사이클 길이는 2 * (C - 1)이다. 상어의 이동 후 인덱스를 중복없이 한 번에 찾도록 최적화해야 시간 초과가 발생하지 않는다. 열, 오른쪽 방향 기준으로 상어의 이동 후 인덱스는 (현재 인덱스 + 속력) % 열 사이클 길이 즉, (c + s) % (2 * (C - 1))이다. 풀이 from sys import stdin def catch(j): for i in range(R): # (1) if (i, j) in sharks: return sharks.pop((i..
2024. 1. 23.
[Baekjoon-Python] 17837 : 새로운 게임 2
https://www.acmicpc.net/problem/17837 접근 턴마다 1번 말부터 순서대로 이동한다. 체스판 한 칸에 여러 말이 존재할 수 있기 때문에 리스트를 사용한다. 말을 위에서부터 꺼내면 뒤집한 상태가 된다. 다음 칸이 흰색이면 다시 뒤집고 빨간색이면 뒤집지 않는다. 풀이 from sys import stdin def move(): direction = [(0, 1), (0, -1), (-1, 0), (1, 0)] turn_cnt = 1 while turn_cnt < 1001: for i in range(k): r, c, d = pieces[i] nr, nc = r + direction[d][0], c + direction[d][1] if is_out_of_range(nr, nc) or..
2024. 1. 22.
[Baekjoon-Python] 23288 : 주사위 굴리기 2
https://www.acmicpc.net/problem/23288 접근 지도를 bfs 탐색하여 연속해서 이동할 수 있는 좌표를 구한 후 점수를 미리 계산해서 중복을 제거한다. 주사위의 인덱스를 0:top, 1:north, 2:east, 3:west, 4:south, 5:bottom으로 두고 굴리는 방향에 따라 주사위 면을 재구성한다. 풀이 from sys import stdin from collections import deque def bfs(r, c) -> set: # (1) q = deque([(r, c)]) same_scores = {(r, c)} while q: r, c = q.popleft() for d in direction: nr, nc = r + d[0], c + d[1] if is_o..
2024. 1. 21.
[Baekjoon-Python] 2178 : 미로 탐색
https://www.acmicpc.net/problem/2178 접근 미로를 bfs 탐색한다. 풀이 from sys import stdin from collections import deque def bfs(x, y): q = deque([(x, y, maze[x][y])]) while q: r, c, cnt = q.popleft() cnt += 1 for i in range(4): nr, nc = r + direction[i], c + direction[3 - i] if is_out_of_range(nr, nc): continue if maze[nr][nc] == 0 or maze[nr][nc] > cnt: # (1) maze[nr][nc] = cnt q.append((nr, nc, cnt)) def..
2024. 1. 21.
[Baekjoon-Python] 21758 : 꿀 따기
https://www.acmicpc.net/problem/21758 접근 꿀의 누적합을 구한다. 벌 또는 벌통은 양 끝에 위치해야 한다. 벌, 벌, 벌통, 벌, 벌통, 벌, 벌통, 벌, 벌 세 가지 경우의 수를 확인하고 최대의 꿀의 양을 구한다. 풀이 from sys import stdin def fly(): honey_amount = 0 for i in range(1, n - 1): # (1) bee_1 = accum_honey[n - 1] - honey[i] - honey[0] # (2) bee_2 = accum_honey[n - 1] - accum_honey[i] # (3) honey_amount = max(honey_amount, bee_1 + bee_2) # (4) bee_1 = accum_ho..
2024. 1. 21.