diff --git a/baekjoon/1197.py b/baekjoon/1197.py new file mode 100644 index 0000000..1aea81e --- /dev/null +++ b/baekjoon/1197.py @@ -0,0 +1,41 @@ +V, E = map(int, input().split()) +cost = 0 +parent = [i for i in range(V+1)] +rank = [0 for i in range(V+1)] +edges = [] +for e in range(E): + edges.append(tuple(map(int, input().split()))) +edges.sort(key=lambda x: x[2]) + + +def find(u): + p = parent[u] + if p == u: + return u + return find(p) + + +def union(u, v): + p1 = find(u) + p2 = find(v) + r1 = rank[p1] + r2 = rank[p2] + if r1 > r2: + parent[p2] = p1 + elif r1 < r2: + parent[p1] = p2 + else: + parent[p1] = p2 + rank[p2] += 1 + return + + +l = 1 +for a, b, w in edges: + if find(a) != find(b): + union(a, b) + cost += w + l += 1 + if l == V: + break +print(cost) \ No newline at end of file diff --git a/baekjoon/16235.py b/baekjoon/16235.py index fdbf548..683a5ff 100644 --- a/baekjoon/16235.py +++ b/baekjoon/16235.py @@ -1,38 +1,52 @@ N, M, K = map(int, input().split()) A = [] -namu = [[[] for _ in range(N)] for i in range(N)] +namu = [[{} for _ in range(N)] for i in range(N)] land = [[5] * N for _ in range(N)] for i in range(N): A.append(list(map(int, input().split()))) for i in range(M): x, y, z = map(int, input().split()) - namu[x - 1][y - 1].append(z) + if z in namu[x - 1][y - 1]: + namu[x - 1][y - 1][z] += 1 + else: + namu[x - 1][y - 1][z] = 1 mv = [(0, 1), (1, 0), (0, -1), (-1, 0), (1, 1), (-1, -1), (1, -1), (-1, 1)] + for _ in range(K): # spring for i in range(N): for j in range(N): - namu[i][j].sort() # 어린 순 - for k in range(len(namu[i][j])): - if namu[i][j][k] <= land[i][j]: - land[i][j] -= namu[i][j][k] - namu[i][j][k] += 1 + tmp = {} + die = 0 + for age, cnt in sorted(namu[i][j].items()): + l = (land[i][j] // age) + if cnt <= l: + land[i][j] -= age * cnt + tmp[age + 1] = cnt + elif 1 <= l: + land[i][j] -= l * age + tmp[age + 1] = l + die += (age // 2) * (cnt - l) else: - for l in range(k, len(namu[i][j])): # summer - land[i][j] += namu[i][j].pop() // 2 - break + die += (age // 2) * cnt + namu[i][j] = tmp + land[i][j] += die for i in range(N): # fall for j in range(N): - for k in range(len(namu[i][j])): - if namu[i][j][k] % 5 == 0: + for age, cnt in namu[i][j].items(): + if age % 5 == 0: for x, y in mv: - if 0 <= i + x < N and 0 <= j + y < N: - namu[i + x][j + y].append(1) - for i in range(N): # winter - for j in range(N): - land[i][j] += A[i][j] + ii = i + x + jj = j + y + if 0 <= ii < N and 0 <= jj < N: + if namu[ii][jj].get(1): + namu[ii][jj][1] += cnt + else: + namu[ii][jj][1] = cnt + land[i][j] += A[i][j] # winter answer = 0 for i in range(N): for j in range(N): - answer += len(namu[i][j]) + for k in namu[i][j].values(): + answer += k print(answer) \ No newline at end of file diff --git a/baekjoon/16236.py b/baekjoon/16236.py index e69de29..cf5a69f 100644 --- a/baekjoon/16236.py +++ b/baekjoon/16236.py @@ -0,0 +1,58 @@ +from collections import deque +from sys import stdin +N = int(stdin.readline()) +fishes = [] +for i in range(N): + col = list(map(int, stdin.readline().split())) + for j, fish in enumerate(col): + if fish == 9: + baby = [i, j] + col[j] = 0 + fishes.append(col) +mv = [(0, 1), (1, 0), (0, -1), (-1, 0)] +bsize = 2 +bcnt = 0 + + +def bfs(): + visited = [[False] * N for _ in range(N)] + q = deque([(0, baby[0], baby[1])]) + maxp = 10000 + candi = [] + while q: + p, x, y = q.popleft() + if visited[x][y]: + continue + if maxp < p: + break + elif 0 < fishes[x][y] < bsize: + maxp = p + candi.append((x, y, p)) + visited[x][y] = True + for i, j in mv: + xx = x + i + yy = y + j + if 0 <= xx < N and 0 <= yy < N and fishes[xx][yy] <= bsize and not visited[xx][yy]: + q.append((p+1, xx, yy)) + if not candi: + return False + candi.sort() + return candi[0] + + +answer = 0 +while True: + ret = bfs() + if not ret: + break + x, y, p = ret + answer += p + baby = [x, y] + fishes[x][y] = 0 + bcnt += 1 + if bcnt == bsize: + bsize += 1 + bcnt = 0 + + +print(answer) \ No newline at end of file diff --git a/baekjoon/17140.py b/baekjoon/17140.py new file mode 100644 index 0000000..1c79b79 --- /dev/null +++ b/baekjoon/17140.py @@ -0,0 +1,42 @@ +from collections import defaultdict +R, C, K = map(int, input().split()) +R, C = R - 1, C - 1 +A = [list(map(int, input().split())) for _ in range(3)] + +def oper(A): + l = 0 + for i in range(len(A)): + cnt_dict = defaultdict(int) + for a in A[i]: + if a != 0: + cnt_dict[a] += 1 + cnt_pairs = [(c, n) for n, c in cnt_dict.items()] + cnt_pairs.sort() + A[i] = [] + for c, n in cnt_pairs: + A[i].append(n) + A[i].append(c) + if len(A[i]) > 100: + break + l = max(l, len(A[i])) + for row in A: + for j in range(max(0, l-len(row))): + row.append(0) + return + + +for i in range(100): + if 0 <= R < len(A) and 0 <= C < len(A[0]) and A[R][C] == K: + print(i) + break + if len(A) >= len(A[0]): + oper(A) + else: + A = list(map(list, zip(*A))) + oper(A) + A = list(map(list, zip(*A))) +else: + if 0 <= R < len(A) and 0 <= C < len(A[0]) and A[R][C] == K: + print(100) + else: + print(-1) \ No newline at end of file diff --git a/baekjoon/17143.py b/baekjoon/17143.py new file mode 100644 index 0000000..cb0d1c5 --- /dev/null +++ b/baekjoon/17143.py @@ -0,0 +1,49 @@ +R, C, M = map(int, input().split()) +sharks = [[False for i in range(C)] for _ in range(R)] +for i in range(M): + r, c, s, d, z = map(int, input().split()) + sharks[r - 1][c - 1] = (s, d - 1, z) +ans = 0 + + +def cal_mv(sharks): + new_pos = [[False for i in range(C)] for _ in range(R)] + for i in range(R): + for j in range(C): + if not sharks[i][j]: + continue + s, d, z = sharks[i][j] + if d == 0 or d == 1: + if d == 0: + p = -s + i + else: + p = s + i + d = (p // (R - 1) + d) % 2 + p %= (2 * (R - 1)) + if p > (R - 1): + p = 2 * (R - 1) - p + if not new_pos[p][j] or new_pos[p][j][2] < z: + new_pos[p][j] = (s, d, z) + else: + if d == 3: + p = -s + j + else: + p = s + j + if (p // (C - 1)) % 2: + d = (d - 1) % 2 + 2 + p %= (2 * (C - 1)) + if p > (C - 1): + p = 2 * (C - 1) - p + if not new_pos[i][p] or new_pos[i][p][2] < z: + new_pos[i][p] = (s, d, z) + return new_pos + + +for c in range(C): + for i in range(R): + if sharks[i][c]: + ans += sharks[i][c][2] + sharks[i][c] = False + break + sharks = cal_mv(sharks) +print(ans) diff --git a/baekjoon/17779.py b/baekjoon/17779.py new file mode 100644 index 0000000..09ebe1f --- /dev/null +++ b/baekjoon/17779.py @@ -0,0 +1,37 @@ +N = int(input()) +A = [list(map(int, input().split())) for _ in range(N)] +total = 0 +for i in range(N): + total += sum(A[i]) + +def divide(x, y, d1, d2): + popul = [0, 0, 0, 0] + lx, ly = x+d1, y-d1 + rx, ry = x+d2, y+d2 + bx, by = x+d1+d2, y-d1+d2 + for i in range(x): + popul[0] += sum(A[i][:y+1]) + popul[1] += sum(A[i][y+1:]) + for i in range(x, lx): + popul[0] += sum(A[i][:y-i+x]) + for i in range(x, rx+1): + popul[1] += sum(A[i][y+1+i-x:]) + for i in range(lx, bx+1): + popul[2] += sum(A[i][:ly-lx+i]) + for i in range(rx+1, bx+1): + popul[3] += sum(A[i][ry+rx+1-i:]) + for i in range(bx+1, N): + popul[2] += sum(A[i][:by]) + popul[3] += sum(A[i][by:]) + popul.append(total-sum(popul)) + return max(popul) - min(popul) + + +ret = float('inf') +for x in range(N - 2): + for y in range(1, N - 1): + for d1 in range(1, y): + for d2 in range(1, min(N - y, N-(x+d1))): + ret = min(ret, divide(x, y, d1, d2)) + +print(ret) diff --git a/baekjoon/17822.py b/baekjoon/17822.py new file mode 100644 index 0000000..f8f0913 --- /dev/null +++ b/baekjoon/17822.py @@ -0,0 +1,57 @@ +from collections import deque + + +N, M, T = map(int, input().split()) +circle = [list(map(int, input().split())) for _ in range(N)] +multiple = {i+1: [] for i in range(N)} +mv = [(1, 0), (-1, 0), (0, 1), (0, -1)] +for i in range(1, N+1): + for j in range(1, N//i + 1): + multiple[i].append(i*j-1) + + +def swap(n, d, k): + res = 0 + if d == 0: # 0 clockwise + k = M - k + for i in multiple[n]: # 숫자를 swap + circle[i] = circle[i][k:] + circle[i][:k] + candi = set() + for i in range(N): + for j in range(M): + if circle[i][j] > 0 and circle[i][j] == circle[i][j-1]: + candi.add((i, j)) + candi.add((i, j-1)) + for i in range(N-1): + for j in range(M): + if circle[i][j] > 0 and circle[i][j] == circle[i+1][j]: + candi.add((i, j)) + candi.add((i+1, j)) + for i, j in candi: + circle[i][j] = 0 + if not candi: + nums = [] + for i in range(N): + for j in range(M): + if circle[i][j] > 0: + nums.append(circle[i][j]) + mean = sum(nums) / len(nums) + for i in range(N): + for j in range(M): + if circle[i][j] > mean: + circle[i][j] -= 1 + elif 0 < circle[i][j] < mean: + circle[i][j] += 1 + for i in range(N): # 원판의 숫자를 sum + res += sum(circle[i]) + return res + + +for i in range(T): + n, d, k = map(int, input().split()) + res = swap(n, d, k) + if not res: + print(res) + break +else: + print(res) \ No newline at end of file diff --git a/baekjoon/17837.py b/baekjoon/17837.py new file mode 100644 index 0000000..aa78be7 --- /dev/null +++ b/baekjoon/17837.py @@ -0,0 +1,42 @@ +N, K = map(int, input().split()) +board = [list(map(int, input().split())) for _ in range(N)] +pos = [[[] for _ in range(N)] for _ in range(N)] +pieces = [] +t = [0, 0, 2, 1, 3] +for k in range(K): + r, c, m = map(int, input().split()) + pieces.append([r-1, c-1, t[m]]) + pos[r-1][c-1].append(k) +mv = [(0, 1), (-1, 0), (0, -1), (1, 0)] + + +def play(): + for k in range(K): + r, c, m = pieces[k] + rr, cc = r + mv[m][0], c + mv[m][1] + if not (0 <= rr < N and 0 <= cc < N) or board[rr][cc] == 2: # 밖에 나가는 것과 파란색일 case + rr, cc = rr - 2 * mv[m][0], cc - 2 * mv[m][1] + pieces[k][2] = (m + 2) % 4 + if not (0 <= rr < N and 0 <= cc < N) or board[rr][cc] == 2: # 한번더 밖에 나가는 것과 파란색일 case + pieces[k][2] = (m + 2) % 4 + continue + idx = pos[r][c].index(k) + tmp = pos[r][c][idx:] + pos[r][c] = pos[r][c][:idx] + if board[rr][cc]: + tmp = list(reversed(tmp)) + for p in tmp: + pieces[p][0] = rr + pieces[p][1] = cc + pos[rr][cc].append(p) + if len(pos[rr][cc]) > 3: + return True + return False + + +for i in range(1000): + if play(): + print(i+1) + break +else: + print(-1) \ No newline at end of file diff --git a/baekjoon/19236.py b/baekjoon/19236.py new file mode 100644 index 0000000..9e5b481 --- /dev/null +++ b/baekjoon/19236.py @@ -0,0 +1,56 @@ +mv = [(-1, 0), (-1, -1), (0, -1), (1, -1), (1, 0), (1, 1), (0, 1), (-1, 1)] +fishes = [] +orders = [0] * 17 +for i in range(4): + a, b, c, d, e, f, g, h = map(int, input().split()) + fishes.append([[a, b-1], [c, d-1], [e, f-1], [g, h-1]]) +for i in range(4): + for j in range(4): + orders[fishes[i][j][0]] = [i, j] +global ans +ans = 0 + + +def dfs(fishes, x, y, s, orders): + global ans + n, d = fishes[x][y] + s += n + fishes[x][y][0] = 17 + orders[n] = [] + for i in range(1, 17): + if not orders[i]: + continue + cx, cy = orders[i] + cn, cd = fishes[cx][cy] + for j in range(8): + nd = (cd + j) % 8 + tx, ty = cx + mv[nd][0], cy + mv[nd][1] + if 0 <= tx < 4 and 0 <= ty < 4 and fishes[tx][ty][0] <= 16: + tn, td = fishes[tx][ty] + fishes[tx][ty] = [cn, nd] + orders[cn] = [tx, ty] + fishes[cx][cy] = [tn, td] + orders[tn] = [cx, cy] + break + candi = [] + for i in range(1, 4): + xx, yy = x + i*mv[d][0], y + i*mv[d][1] + if (0 <= xx < 4 and 0 <= yy < 4) and fishes[xx][yy][0]: + candi.append((xx, yy)) + if not candi: + ans = max(ans, s) + return + for cx, cy in candi: + tmp = [] + tmp_orders = orders[:] + for i in range(4): + tmp.append([]) + for j in range(4): + tmp[-1].append(fishes[i][j][:]) + tmp[x][y][0] = 0 + dfs(tmp, cx, cy, s, tmp_orders) + return + + +dfs(fishes, 0, 0, 0, orders) +print(ans) diff --git a/baekjoon/19237.py b/baekjoon/19237.py new file mode 100644 index 0000000..79f9577 --- /dev/null +++ b/baekjoon/19237.py @@ -0,0 +1,73 @@ +N, M, K = map(int, input().split()) +prior = [] +sharks = {} # x, y, direction +pos = [] +# 1,2,3,4 위,아래,왼쪽,오른 +for i in range(N): + s = map(int, input().split()) + pos.append([]) + for j, n in enumerate(s): + if n: + pos[-1].append([n, K]) # [shark num, remaining time] + sharks[n] = [i, j] + else: + pos[-1].append([0, 0]) +for i, d in enumerate(list(map(int, input().split()))): + sharks[i+1].append(d-1) +for i in range(1, M+1): + prior.append([]) + for j in range(4): + prior[-1].append([]) + for d in list(map(int, input().split())): + prior[-1][-1].append(d-1) +mv = [(-1, 0), (1, 0), (0, -1), (0, 1)] + + +def mvs(sharks): + # sharks move + tmp_sharks = {} + for shark, [x, y, d] in sharks.items(): + for cur_d in prior[shark - 1][d]: + i, j = mv[cur_d] + nx, ny = x + i, y + j + if 0 <= nx < N and 0 <= ny < N and not pos[nx][ny][0]: + tmp_sharks[shark] = [nx, ny, cur_d] + break + else: + for cur_d in prior[shark - 1][d]: + i, j = mv[cur_d] + nx, ny = x + i, y + j + if 0 <= nx < N and 0 <= ny < N and pos[nx][ny][0] == shark: + tmp_sharks[shark] = [nx, ny, cur_d] + break + # calculate time + for i in range(N): + for j in range(N): + if pos[i][j][1]: + pos[i][j][1] -= 1 + if not pos[i][j][1]: + pos[i][j][0] = 0 + # check sharks pos + dels = [] + for shark, [x, y, _ ] in tmp_sharks.items(): + if not pos[x][y][0] or pos[x][y][0] == shark: + pos[x][y] = [shark, K] + else: # other shark exists + if pos[x][y][0] < shark: + dels.append(shark) + else: + dels.append(pos[x][y][0]) + pos[x][y][0] = shark + for shark in dels: + del tmp_sharks[shark] + return tmp_sharks + + +ans = 0 +while len(sharks) > 1: + if ans >= 1000: + ans = -1 + break + sharks = mvs(sharks) + ans += 1 +print(ans) \ No newline at end of file diff --git a/baekjoon/19238.py b/baekjoon/19238.py new file mode 100644 index 0000000..7e2bf80 --- /dev/null +++ b/baekjoon/19238.py @@ -0,0 +1,63 @@ +from collections import deque + +N, M, F = map(int, input().split()) +maps = [] +for i in range(N): + maps.append(list(map(int, input().split()))) +drv = [i-1 for i in list(map(int, input().split()))] +spos = [] # start position +dpos = [] # destination +for i in range(M): + a, b, c, d = map(int, input().split()) + spos.append([a-1, b-1]) + dpos.append([c-1, d-1]) +mv = [(0, 1), (1, 0), (-1, 0), (0, -1)] + + +def spath(des, src): + q = deque([src]) + visited = [[False] * N for _ in range(N)] + candi = [] + for d in range(N*N): + next_q = deque([]) + while q: + x, y = q.popleft() + if visited[x][y]: + continue + if [x, y] in des: + candi.append([x, y, d]) + visited[x][y] = True + for i, j in mv: + xx, yy = x + i, y + j + if 0 <= xx < N and 0 <= yy < N and not visited[xx][yy] and not maps[xx][yy]: + next_q.append([xx, yy]) + if candi: + break + q = next_q + candi.sort() + if not candi: + return -1, -1, F + 1 + return candi[0] + + +while spos: + x, y, f = spath(spos, drv) + F -= f + if F < 0: + break + i = spos.index([x, y]) + drv = spos[i] + del spos[i] + des = dpos[i] + del dpos[i] + + x, y, f = spath([des], drv) + drv = des + F -= f + if F < 0: + break + F += f * 2 +if F < 0: + print(-1) +else: + print(F) \ No newline at end of file diff --git a/baekjoon/20055.py b/baekjoon/20055.py new file mode 100644 index 0000000..aa7f434 --- /dev/null +++ b/baekjoon/20055.py @@ -0,0 +1,24 @@ +N, K = map(int, input().split()) +A = list(map(int, input().split())) +robots = [] +stage = 1 +while stage: + A = A[-1:] + A[:-1] + for i in range(len(robots)): + robots[i] += 1 + if robots and robots[0] == N - 1: + robots.pop(0) + for i, robot in enumerate(robots): + if A[robot + 1]: + if not i or (i and robots[i-1] != robot+1): + A[robot+1] -= 1 + robots[i] += 1 + if robots and robots[0] == N - 1: + robots.pop(0) + if A[0]: + A[0] -= 1 + robots.append(0) + if A.count(0) >= K: + print(stage) + break + stage += 1 \ No newline at end of file diff --git a/baekjoon/20056.py b/baekjoon/20056.py new file mode 100644 index 0000000..6585076 --- /dev/null +++ b/baekjoon/20056.py @@ -0,0 +1,58 @@ +from collections import defaultdict + + +N, M, K = map(int, input().split()) +fballs = defaultdict(list) +maps = [[0] * N for j in range(N)] +for i in range(M): + r, c, m, s, d = map(int, input().split()) + fballs[(r-1, c - 1)].append([m, s, d]) + maps[r-1][c-1] += 1 +mv = [(-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1), (0, -1), (-1, -1)] + + +def cal_mv(fballs): + ret_fballs = defaultdict(list) + for (r, c), infos in fballs.items(): + maps[r][c] -= len(infos) + for m, s, d in infos: + i, j = mv[d] + rr, cc = (s*i + r)%N, (s*j + c)%N + ret_fballs[(rr, cc)].append([m, s, d]) + maps[rr][cc] += 1 + dels = [] + for (r, c), infos in ret_fballs.items(): + l = len(infos) + if l < 2: + continue + newm, news, newd = 0, 0, [] + for m, s, d in infos: + newm += m + news += s + newd.append(d % 2) + newm //= 5 + if not newm: + dels.append((r, c)) + continue + news //= l + if newd == [0] * l or newd == [1] * l: + newd = [0, 2, 4, 6] + else: + newd = [1, 3, 5, 7] + tmp = [] + if newm: + for d in newd: + tmp.append([newm, news, d]) + ret_fballs[(r, c)] = tmp + for i in dels: + del ret_fballs[i] + return ret_fballs + + +for i in range(K): + fballs = cal_mv(fballs) +ans = 0 +for infos in fballs.values(): + for m, d, s in infos: + ans += m +print(ans) \ No newline at end of file diff --git a/baekjoon/20057.py b/baekjoon/20057.py new file mode 100644 index 0000000..39bcb1a --- /dev/null +++ b/baekjoon/20057.py @@ -0,0 +1,59 @@ +N = int(input()) +grid = [list(map(int, input().split())) for _ in range(N)] + + +def trans(mv): + new_mv = [] + for i, j in mv: + new_mv.append((-j, i)) + return new_mv + + +mv = [(0, -1), (1, 0), (0, 1), (-1, 0)] +pos = [[(-2, -1), (-1, -2), (-1, -1), (-1, 0), (0, -3), (1, -2), (1, -1), (1, 0), (2, -1), (0, -2)]] +pos.append(trans(pos[-1])) +pos.append(trans(pos[-1])) +pos.append(trans(pos[-1])) +per = [0.02, 0.1, 0.07, 0.01, 0.05, 0.1, 0.07, 0.01, 0.02] +global ans +ans = 0 + + +def cal(x, y, dx, dy, pos): + global ans + A = grid[dx][dy] + grid[dx][dy] = 0 + total = 0 + for i in range(9): + xx, yy = pos[i] + nx, ny = x + xx, y + yy + sand = int(A * per[i]) + if 0 <= nx < N and 0 <= ny < N: + grid[nx][ny] += sand + total += sand + else: + ans += sand + total += sand + nx, ny = x + pos[9][0], y + pos[9][1] + if 0 <= nx < N and 0 <= ny < N: + grid[nx][ny] += A - total + else: + ans += A - total + return True + + +l = 0 +d = -1 +x, y = N // 2, N // 2 +for i in range(2 * (N - 1) + 1): + d = (d + 1) % 4 + if d % 2 == 0: + l += 1 + for j in range(l): + if x | y == 0: + break + dx = x + mv[d][0] + dy = y + mv[d][1] + cal(x, y, dx, dy, pos[d]) + x, y = dx, dy +print(ans) \ No newline at end of file diff --git a/baekjoon/20058.py b/baekjoon/20058.py new file mode 100644 index 0000000..7a8f503 --- /dev/null +++ b/baekjoon/20058.py @@ -0,0 +1,60 @@ +from collections import deque + +N, Q = map(int, input().split()) +NN = 2 ** N +A = [list(map(int, input().split())) for _ in range(NN)] +L = list(map(int, input().split())) +mv = [(0, 1), (1, 0), (0, -1), (-1, 0)] + + +def rotate(l, A): + mA = [[0] * NN for _ in range(NN)] + for r in range(0, NN, l): + for c in range(0, NN, l): + for x in range(r, r + l): + for y in range(c, c + l): + #px, py = r + l // 2, c + l // 2 + #dx, dy = x - px, y - py + #nx, ny = int(px + dy), int(py - dx) + mA[r - c + y][r + c + l - x - 1] = A[x][y] + candi = [] + for x in range(NN): + for y in range(NN): + cnt = 0 + for i, j in mv: + xx, yy = x + i, y + j + if 0 <= xx < NN and 0 <= yy < NN and mA[xx][yy]: + cnt += 1 + if cnt < 3: + candi.append((x, y)) + for x, y in candi: + if mA[x][y]: + mA[x][y] -= 1 + return mA + + +for l in L: + A = rotate(2 ** l, A) +total = 0 +for a in A: + total += sum(a) +maxsize = 0 +for i in range(NN): + for j in range(NN): + if not A[i][j]: + continue + q = deque([(i, j)]) + tmpmax = 0 + while q: + x, y = q.popleft() + if not A[x][y]: + continue + A[x][y] = 0 + tmpmax += 1 + for mx, my in mv: + nx, ny = x + mx, y + my + if 0 <= nx < NN and 0 <= ny < NN and A[nx][ny]: + q.append((nx, ny)) + maxsize = max(maxsize, tmpmax) +print(total) +print(maxsize) \ No newline at end of file diff --git a/baekjoon/20061.py b/baekjoon/20061.py new file mode 100644 index 0000000..88b9ea4 --- /dev/null +++ b/baekjoon/20061.py @@ -0,0 +1,60 @@ +N = int(input()) +bboard = [[0] * 4 for _ in range(6)] +gboard = [[0] * 4 for _ in range(6)] +global score +score = 0 + + +def cal(t, x, y, board): + global score + if t == 1: + for i in range(2, 7): + if i >= 6 or board[i][y]: + board[i - 1][y] = 1 + break + elif t == 2: + for i in range(2, 7): + if i >= 6 or (board[i][y] or board[i][y+1]): + board[i - 1][y] = 1 + board[i - 1][y + 1] = 1 + break + else: + for i in range(2, 7): + if i >= 6 or (board[i][y] or board[i-1][y]): + board[i - 1][y] = 1 + board[i - 2][y] = 1 + break + i = 5 + while i > 1: + if board[i] == [1, 1, 1, 1]: + score += 1 + board.pop(i) + board = [[0, 0, 0, 0]] + board + i += 1 + i -= 1 + cnt = 0 + for i in range(2): + if 1 in board[i]: + cnt += 1 + for i in range(cnt): + board.pop() + board = [[0, 0, 0, 0]] + board + return board + + +for _ in range(N): + t, x, y = map(int, input().split()) + if t == 1: + gboard = cal(1, x, y, gboard) + bboard = cal(1, y, x, bboard) + else: + gboard = cal(t, x, y, gboard) + bboard = cal(t + (-2*(t%2)) + 1, y, x, bboard) + + +blocknum = 0 +for i in range(2, 6): + blocknum += sum(bboard[i]) + blocknum += sum(gboard[i]) +print(score) +print(blocknum) \ No newline at end of file diff --git a/baekjoon/21608.py b/baekjoon/21608.py new file mode 100644 index 0000000..20c6530 --- /dev/null +++ b/baekjoon/21608.py @@ -0,0 +1,74 @@ +from collections import defaultdict +N = int(input()) +mv = ((0, 1), (1, 0), (-1, 0), (0, -1)) +room = [[0] * N for _ in range(N)] +pos = {i:0 for i in range(1, N**2 + 1)} +dictfri = {} +for _ in range(N*N): + stus = list(map(int, input().split())) + cur = stus[0] + fris = stus[1:] + dictfri[cur] = fris + candi = defaultdict(int) + for idx, fri in enumerate(fris): + if not pos.get(fri): + continue + fx, fy = pos[fri] + for dx, dy in mv: + cx, cy = fx + dx, fy + dy + if 0 <= cx < N and 0 <= cy < N and not room[cx][cy]: + candi[(cx, cy)] += 1 + if candi: + vs = list(candi.values()) + m = max(vs) + if vs.count(m) == 1: + idx = vs.index(m) + ks = list(candi.keys()) + x, y = ks[idx] + pos[cur] = (x, y) + room[x][y] = cur + continue + else: + tmp = [] + for k, v in candi.items(): + if v == m: + tmp.append(k) + candi = [] + for i, j in tmp: + if room[i][j]: + continue + cnt = 0 + for dx, dy in mv: + x, y = i + dx, j + dy + if 0 <= x < N and 0 <= y < N and not room[x][y]: + cnt += 1 + candi.append((cnt, i, j)) + else: + candi = [] + for i in range(N): + for j in range(N): + if room[i][j]: + continue + cnt = 0 + for dx, dy in mv: + x, y = i+dx, j+dy + if 0 <= x < N and 0 <= y < N and not room[x][y]: + cnt += 1 + candi.append((cnt, i, j)) + candi.sort(key=lambda x: (-x[0], x[1], x[2])) + x, y = candi[0][1], candi[0][2] + room[x][y] = cur + pos[cur] = (x, y) +score = [0, 1, 10, 100, 1000] +ans = 0 +for i in range(N): + for j in range(N): + cnt = 0 + cur = room[i][j] + fris = dictfri[cur] + for dx, dy in mv: + x, y = i + dx, j + dy + if 0 <= x < N and 0 <= y < N and room[x][y] in fris: + cnt += 1 + ans += score[cnt] +print(ans) \ No newline at end of file diff --git a/baekjoon/21609.py b/baekjoon/21609.py new file mode 100644 index 0000000..d8c099a --- /dev/null +++ b/baekjoon/21609.py @@ -0,0 +1,86 @@ +from collections import deque + +N, M = map(int, input().split()) +grid = [list(map(int, input().split())) for _ in range(N)] # empty: -2 +mv = ((1, 0), (0, 1), (-1, 0), (0, -1)) +global score +score = 1 + + +def pulldown(grid): + ngrid = [[-2] * N for _ in range(N)] + for j in range(N): + idx = N - 1 + for i in range(N - 1, -1, -1): + if grid[i][j] >= 0: + ngrid[idx][j] = grid[i][j] + idx -= 1 + elif grid[i][j] == -1: + ngrid[i][j] = -1 + idx = i - 1 + return ngrid + + +def rotate(grid): + ngrid = [] + for j in range(N - 1, -1, -1): + tmp = [] + for i in range(N): + tmp.append(grid[i][j]) + ngrid.append(tmp) + return ngrid + + +def cal_score(grid): + global score + visited = [[False] * N for _ in range(N)] + maxsize = 0 + maxrainbow = 0 + large_block = [] + for i in range(N): + for j in range(N): + if visited[i][j] or grid[i][j] <= 0: + continue + q = deque([(i, j)]) + candi = [] + rainbow = 0 + size = 0 + color = grid[i][j] + while q: + x, y = q.popleft() + if visited[x][y]: + continue + visited[x][y] = True + size += 1 + candi.append((x, y)) + for dx, dy in mv: + xx, yy = x + dx, y + dy + if 0 <= xx < N and 0 <= yy < N and not visited[xx][yy] and grid[xx][yy] in [0, color]: + q.append((xx, yy)) + for x, y in candi: + if not grid[x][y]: + visited[x][y] = False + rainbow += 1 + if size > 1: + if size > maxsize: + maxsize = size + large_block = candi + maxrainbow = rainbow + elif size == maxsize: + if rainbow >= maxrainbow: + large_block = candi + maxrainbow = rainbow + for x, y in large_block: + grid[x][y] = -2 + score = maxsize ** 2 + return grid + + +total = 0 +while score: + grid = cal_score(grid) + total += score + grid = pulldown(grid) + grid = rotate(grid) + grid = pulldown(grid) +print(total) \ No newline at end of file diff --git a/baekjoon/21610.py b/baekjoon/21610.py new file mode 100644 index 0000000..e7c6095 --- /dev/null +++ b/baekjoon/21610.py @@ -0,0 +1,44 @@ +N, M = map(int, input().split()) +maps = [list(map(int, input().split())) for _ in range(N)] +mv = [(0, -1), (-1, -1), (-1, 0), (-1, 1), (0, 1), (1, 1), (1, 0), (1, -1)] +diagonal = [(-1, -1), (-1, 1), (1, -1), (1, 1)] +clouds = [[N-1, 0], [N-1, 1], [N-2, 0], [N-2, 1]] + + +def biba(d, s, maps, clouds): + x, y = mv[d] + xx, yy = x * s, y * s + visited = [[False] * N for _ in range(N)] + for i in range(len(clouds)): + r, c = clouds[i] + clouds[i][0] = (r + xx) % N + clouds[i][1] = (c + yy) % N + for r, c in clouds: #rainning + maps[r][c] += 1 + visited[r][c] = True + cnts = [] + for r, c in clouds: #water copy + cnts.append(0) + for x, y in diagonal: + xx, yy = r + x, c + y + if 0 <= xx < N and 0 <= yy < N and maps[xx][yy]: + cnts[-1] += 1 + for idx, cloud in enumerate(clouds): + r, c = cloud + maps[r][c] += cnts[idx] + clouds = [] + for i in range(N): + for j in range(N): + if not visited[i][j] and maps[i][j] > 1: + maps[i][j] -= 2 + clouds.append([i, j]) + return clouds + + +for i in range(M): + d, s = map(int, input().split()) + clouds = biba(d-1, s, maps, clouds) +res = 0 +for i in range(N): + res += sum(maps[i]) +print(res) \ No newline at end of file diff --git a/baekjoon/21611.py b/baekjoon/21611.py new file mode 100644 index 0000000..0845710 --- /dev/null +++ b/baekjoon/21611.py @@ -0,0 +1,115 @@ +N, M = map(int, input().split()) +beads = [list(map(int, input().split())) for _ in range(N)] +magic = [] +pos = {} +mv = {1: (-1, 0), 2: (1, 0), 3: (0, -1), 4: (0, 1)} +j = 0 +p = 1 +x, y = N//2, N//2 +scores = {1: 0, 2: 0, 3: 0} +for i in range(N//2*4 + 1): + if i % 2 == 0: + j += 1 + if i % 4 == 0: + d = 3 + elif i % 4 == 1: + d = 2 + elif i % 4 == 2: + d = 4 + else: + d = 1 + for k in range(j): + xx, yy = mv[d] + x, y = x + xx, y + yy + pos[p] = (x, y) + p += 1 +del pos[N*N] + + +def pullBead(): + cnt = 0 + for i in range(1, N * N): + x, y = pos[i] + p = beads[x][y] + if p > 0: + cnt += 1 + x, y = pos[cnt] + beads[x][y] = p + for i in range(cnt + 1, N * N): + x, y = pos[i] + beads[x][y] = 0 + return + + +def ice(d, s): + x, y = N//2, N//2 + xx, yy = mv[d] + for i in range(s): + x += xx + y += yy + beads[x][y] = 0 + pullBead() + return + + +def explode(): + n = -1 + cnt = 0 + res = False + for i in range(1, N*N): + x, y = pos[i] + cur = beads[x][y] + if cur == 0: + break + if n == cur: + cnt += 1 + else: + if cnt >= 4: + for j in range(1, cnt+1): + x, y = pos[i-j] + beads[x][y] = 0 + scores[n] += cnt + res = True + n = cur + cnt = 1 + if cnt >= 4: + for j in range(cnt): + x, y = pos[i-j] + beads[x][y] = 0 + scores[n] += cnt + res = True + return res + + +def makeBeads(): + nbeads = [[0] * N for _ in range(N)] + n = beads[N//2][N//2-1] + nbeads[N//2+1][N//2-1] = n + cur_idx = 1 + for i in range(1, N*N): + x, y = pos[i] + cur = beads[x][y] + if cur == 0: + break + if cur == n: + x, y = pos[cur_idx] + nbeads[x][y] += 1 + else: + cur_idx += 2 + if cur_idx >= N*N: + break + x, y = pos[cur_idx] + nbeads[x][y] += 1 + x, y = pos[cur_idx + 1] + nbeads[x][y] = cur + n = cur + return nbeads + + +for i in range(M): + d, s = map(int, input().split()) + ice(d, s) + while explode(): + pullBead() + beads = makeBeads() +print(scores[1] + scores[2]*2 + scores[3]*3) \ No newline at end of file diff --git a/baekjoon/23290.py b/baekjoon/23290.py new file mode 100644 index 0000000..1a353a3 --- /dev/null +++ b/baekjoon/23290.py @@ -0,0 +1,102 @@ +M, S = map(int, input().split()) +fishes = {} +for i in range(4): + for j in range(4): + fishes[(i, j)] = [] +mv = {0: (0, -1), 1: (-1, -1), 2: (-1, 0), 3: (-1, 1), 4: (0, 1), 5: (1, 1), 6: (1, 0), 7: (1, -1)} +grid = [[0] * 4 for _ in range(4)] +scents = [[0] * 4 for _ in range(4)] +for i in range(M): + x, y, d = map(int, input().split()) + fishes[(x-1, y-1)].append(d-1) + grid[x-1][y-1] += 1 +origin = {} +s1, s2 = list(map(int, input().split())) +shark = [s1-1, s2-1] +smv = [(-1, 0), (0, -1), (1, 0), (0, 1)] # 상좌하우 + + +def move(fishes): + nfishes = {} + for i in range(4): + for j in range(4): + nfishes[(i, j)] = [] + for x, y in fishes: + for d in fishes[(x, y)]: + for i in range(8): + xx, yy = mv[(d-i) % 8] + nx, ny = x+xx, y+yy + if 0 <= nx < 4 and 0 <= ny < 4 and shark != [nx, ny] and not scents[nx][ny]: + nfishes[(nx, ny)].append((d-i) % 8) + grid[x][y] -= 1 + grid[nx][ny] += 1 + break + else: + nfishes[(x, y)].append(d) + return nfishes + + +def search(): + candi = [] + cnt = -1 + for i in range(4): + xx1, yy1 = smv[i] + nx1, ny1 = shark[0] + xx1, shark[1] + yy1 + if not(0 <= nx1 < 4 and 0 <= ny1 < 4): + continue + cnt1 = grid[nx1][ny1] + for j in range(4): + xx2, yy2 = smv[j] + nx2, ny2 = nx1 + xx2, ny1 + yy2 + if not (0 <= nx2 < 4 and 0 <= ny2 < 4): + continue + cnt2 = cnt1 + grid[nx2][ny2] + for k in range(4): + xx3, yy3 = smv[k] + nx3, ny3 = nx2 + xx3, ny2 + yy3 + if not (0 <= nx3 < 4 and 0 <= ny3 < 4): + continue + cnt3 = cnt2 + grid[nx3][ny3] + if nx3 == nx1 and ny3 == ny1: + cnt3 = cnt2 + if cnt3 > cnt: + cnt = cnt3 + candi = [i, j, k] + for d in candi: + xx, yy = smv[d] + shark[0] += xx + shark[1] += yy + if grid[shark[0]][shark[1]] > 0: + scents[shark[0]][shark[1]] = 3 + grid[shark[0]][shark[1]] = 0 + fishes[tuple(shark)] = [] + return + + +def rm_scent(): + for i in range(4): + for j in range(4): + if scents[i][j] > 0: + scents[i][j] -= 1 + + +def fishcopy(): + for fish, v in origin.items(): + x, y = fish + grid[x][y] += len(v) + fishes[(x, y)].extend(v) + return + + +for i in range(S): + for j in range(4): + for k in range(4): + origin[(j, k)] = fishes[(j, k)][:] + fishes = move(fishes) + search() + rm_scent() + fishcopy() +res = 0 +for i in range(4): + res += sum(grid[i]) +print(res) \ No newline at end of file diff --git a/baekjoon/9372.py b/baekjoon/9372.py new file mode 100644 index 0000000..a27a991 --- /dev/null +++ b/baekjoon/9372.py @@ -0,0 +1,33 @@ +def union(parent, u, v): + p1 = find(parent, u) + p2 = find(parent, v) + r1, r2 = rank[u], rank[v] + if r1 > r2: + parent[p2] = p1 + else: + parent[p1] = p2 + if r1 == r2: + rank[p2] += 1 + return + + +def find(parent, v): + p = parent[v] + if p == v: + return p + return find(parent, p) + + +T = int(input()) +for t in range(T): + N, M = map(int, input().split()) + parent = [i for i in range(N+1)] + rank = [0 for i in range(N+1)] + cost = 0 + for i in range(M): + a, b = map(int, input().split()) + p1, p2 = find(parent, a), find(parent, b) + if p1 != p2: + union(parent, p1, p2) + cost += 1 + print(cost) \ No newline at end of file diff --git "a/programmers/2 x n \355\203\200\354\235\274\353\247\201.py" "b/programmers/2 x n \355\203\200\354\235\274\353\247\201.py" new file mode 100644 index 0000000..05b4fcb --- /dev/null +++ "b/programmers/2 x n \355\203\200\354\235\274\353\247\201.py" @@ -0,0 +1,5 @@ +def solution(n): + dp = [1, 1] + for i in range(2, n+1): + dp.append((dp[-1] + dp[-2]) % 1000000007) + return dp[n] \ No newline at end of file diff --git "a/programmers/\353\251\200\353\246\254 \353\233\260\352\270\260.py" "b/programmers/\353\251\200\353\246\254 \353\233\260\352\270\260.py" new file mode 100644 index 0000000..da609fb --- /dev/null +++ "b/programmers/\353\251\200\353\246\254 \353\233\260\352\270\260.py" @@ -0,0 +1,5 @@ +def solution(n): + answer = [1, 1] + for i in range(2, n+1): + answer.append((answer[-1] + answer[-2]) % 1234567) + return answer[n] \ No newline at end of file diff --git "a/programmers/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260.py" "b/programmers/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260.py" new file mode 100644 index 0000000..2700bfc --- /dev/null +++ "b/programmers/\354\204\254 \354\227\260\352\262\260\355\225\230\352\270\260.py" @@ -0,0 +1,28 @@ +def solution(n, costs): + parent = [i for i in range(n)] + rank = [0] * n + + def find(u): + p = parent[u] + if p == u: + return u + return find(p) + + def union(u, v, root1, root2): + rank1, rank2 = rank[root1], rank[root2] + if rank1 > rank2: + parent[root2] = root1 + else: + parent[root1] = root2 + if rank1 == rank2: + rank[root2] += 1 + return + + answer = 0 + costs.sort(key=lambda x: x[2]) + for a, b, c in costs: + p1, p2 = find(a), find(b) + if p1 != p2: + union(a, b, p1, p2) + answer += c + return answer \ No newline at end of file diff --git "a/programmers/\354\225\274\352\267\274 \354\247\200\354\210\230.py" "b/programmers/\354\225\274\352\267\274 \354\247\200\354\210\230.py" new file mode 100644 index 0000000..516c7d6 --- /dev/null +++ "b/programmers/\354\225\274\352\267\274 \354\247\200\354\210\230.py" @@ -0,0 +1,33 @@ +def solution(n, works): + answer = 0 + works.sort(reverse=True) + l, r = 0, works[0] + while l <= r: + mid = (l + r) // 2 + if check(mid, n, works): + r = mid - 1 + else: + l = mid + 1 + for i in range(len(works)): + diff = works[i] - l + if diff <= 0: + continue + works[i] = l + n -= diff + for i in range(min(n, len(works))): + if works[i] == 0: + break + works[i] -= 1 + for work in works: + answer += work ** 2 + return answer +def check(d, n, works): + total = 0 + for work in works: + diff = work - d + if diff <= 0: + continue + total += diff + if total > n: + return False + return True \ No newline at end of file diff --git "a/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.py" "b/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.py" new file mode 100644 index 0000000..9aa9d59 --- /dev/null +++ "b/programmers/\354\235\264\354\244\221\354\232\260\354\204\240\354\210\234\354\234\204\355\201\220.py" @@ -0,0 +1,28 @@ +from heapq import heappush, heappop + + +def solution(operations): # min heap & max heap + maxh = [] + minh = [] + for ops in operations: + op, n = ops.split() + n = int(n) + if op == "D": + if n == 1: + if not maxh: + continue + heappop(maxh) + if not maxh or -maxh[0] < minh[0]: ## 동기화 + minh, maxh = [], [] + else: + if not minh: + continue + heappop(minh) + if not minh or minh[0] > -maxh[0]: + minh, maxh = [], [] + else: + heappush(maxh, -n) + heappush(minh, n) + if not maxh: + return [0, 0] + return [heappop(maxh), heappop(minh)] diff --git "a/programmers/\354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225.py" "b/programmers/\354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225.py" new file mode 100644 index 0000000..478f026 --- /dev/null +++ "b/programmers/\354\240\225\354\210\230 \354\202\274\352\260\201\355\230\225.py" @@ -0,0 +1,5 @@ +def solution(triangle): + for i in range(len(triangle)-1, 0, -1): + for j in range(i): + triangle[i-1][j] += max(triangle[i][j], triangle[i][j+1]) + return triangle[0][0] \ No newline at end of file diff --git "a/programmers/\354\244\204 \354\204\234\353\212\224 \353\260\251\353\262\225.py" "b/programmers/\354\244\204 \354\204\234\353\212\224 \353\260\251\353\262\225.py" new file mode 100644 index 0000000..c9b06dc --- /dev/null +++ "b/programmers/\354\244\204 \354\204\234\353\212\224 \353\260\251\353\262\225.py" @@ -0,0 +1,15 @@ +def solution(n, k): + answer = [] + numbers = [i + 1 for i in range(n)] + d = 1 + k -= 1 + for i in range(1, n+1): + d *= i + for i in range(n, 0, -1): + d //= i + r = int(k // d) + k = k % d + num = numbers.pop(r) + answer.append(num) + #numbers = numbers[:r] + numbers[r + 1:] + return answer \ No newline at end of file diff --git "a/programmers/\354\265\234\352\263\240\354\235\230 \354\247\221\355\225\251.py" "b/programmers/\354\265\234\352\263\240\354\235\230 \354\247\221\355\225\251.py" new file mode 100644 index 0000000..9278eb0 --- /dev/null +++ "b/programmers/\354\265\234\352\263\240\354\235\230 \354\247\221\355\225\251.py" @@ -0,0 +1,8 @@ +def solution(n, s): + r, q = divmod(s, n) + if r < 1: + return [-1] + answer = [r] * n + for i in range(n-q, n): + answer[i] += 1 + return answer \ No newline at end of file diff --git "a/programmers/\355\201\260 \354\210\230 \353\247\214\353\223\244\352\270\260.py" "b/programmers/\355\201\260 \354\210\230 \353\247\214\353\223\244\352\270\260.py" new file mode 100644 index 0000000..cf130ab --- /dev/null +++ "b/programmers/\355\201\260 \354\210\230 \353\247\214\353\223\244\352\270\260.py" @@ -0,0 +1,12 @@ +def solution(number, k): + answer = [] + num = list(map(int, number)) + for idx, n in enumerate(num): + while answer: + if answer[-1] < n and len(answer) + (len(num)-idx) > (len(num) - k): + answer.pop() + else: + break + if len(answer) + k < len(num): + answer.append(n) + return "".join(list(map(str, answer))) \ No newline at end of file diff --git "a/programmers/\355\225\230\353\205\270\354\235\264\354\235\230 \355\203\221.py" "b/programmers/\355\225\230\353\205\270\354\235\264\354\235\230 \355\203\221.py" new file mode 100644 index 0000000..1bde489 --- /dev/null +++ "b/programmers/\355\225\230\353\205\270\354\235\264\354\235\230 \355\203\221.py" @@ -0,0 +1,15 @@ +global answer +def solution(n): + global answer + answer = [] + hanoi(n, 1, 2, 3) + return answer +def hanoi(n, src, mid, des): + if n == 1: + global answer + answer.append([src, des]) + return + hanoi(n-1, src, des, mid) + hanoi(1, src, mid, des) + hanoi(n-1, mid, src, des) + return \ No newline at end of file