[λ°±μ€] 28298 λ νν νμΌ μμΉ λ¬Έμ (python νμ΄μ¬)
https://www.acmicpc.net/problem/28298
28298λ²: λ νν νμΌ μμΉ λ¬Έμ
첫째 μ€μ μΈ μ μ $N$, $M$, $K$κ° κ³΅λ°±μΌλ‘ ꡬλΆλμ΄ μ£Όμ΄μ§λ€. $(1\le N,M,K\le 500;$ $N,M$μ $K$μ λ°°μμ΄λ€$)$ λ€μ $N$κ°μ μ€μλ νμΌμ $i$ν μμ λ°°μΉλ₯Ό μλ―Ένλ κΈΈμ΄ $M$μ λ¬Έμμ΄ $d_i$κ° μ£Όμ΄μ§λ€.
www.acmicpc.net
μκ° μ΄κ³Όκ° μκΈ΄ λ¬Έμ . μ΄λ²μ μ λ ₯κ° μ νμ λ³΄κ³ μκ°μ λ§κ² λ‘μ§μ μ§°λ€κ³ μκ°νλλ° μκ°μ΄κ³Όκ° λ°μνλ€.
λ‘μ§μ μ‘°κΈ μμ νλκΉ ν΅κ³Όνλ€. μ κ·Έλ°μ§ μκ°ν΄ 보λ μμΈμ μ°Ύμ μ μμλ€.
μ€κ°μ 리μ€νΈμμ κ°μκ° κ°μ₯ λ§μ μμλ₯Ό μΆλ ₯νλ λ©μλκ° νμνλ€.
λ§μ λ°©λ²μ΄ μμ§λ§ λλ μ½λλ₯Ό κ°κ²°νκ² μμ±νκ³ μΆμ΄ max(arr, key = arr.count)λ‘ κ΅¬ννλ€.
len(arr) = nμ΄λΌ κ°μ νλ©΄, arr.count κ° nλ² μ€νλλ€. λ°λΌμ μ μ½λμ μκ°λ³΅μ‘λλ n**2μ΄λ€.
λ°λΌμ μ 체 μκ°λ³΅μ‘λλ μ½ K * K * ((N/K * M/K )**2)μ΄κ³ μ΅λ 1 * 1 * ((500 * 500)**2) = 62500000000μ΄ λλ€. μκ°μ΄κ³Όλ λ°μνλ κ² λΉμ°νλ€.
μ€λμ κ΅ν: μλ‘μ΄ λ°©λ²μ μΈ λλ μκ°λ³΅μ‘λλ₯Ό κΌΌκΌΌν κ³μ°ν΄ 보μ.
μμ΄λμ΄
1. K * Kλ‘ νμΌλ€μ λλ μ€λ€.
2. μμ λΉ¨κ°μμ²λΌ, K * Kλ‘ λλ μ§ νμΌλ€μ κ° μ리λ₯Ό κΈ°μ€μΌλ‘ μνλ²³ κ°μλ₯Ό κ³μ°νλ€.
3. μνλ²³ κ°μκ° κ°μ₯ λ§μ μνλ²³μΌλ‘ νμΌλ€μ κ΅μ²΄ν΄ μ€λ€. κ΅μ²΄ν νμΌ κ°μλ μ μ₯ν΄ μ€λ€.
μ 체 μ½λ (+ μ£Όμ)
import sys
tiles = [] # N * M νμΌ
count_list = [0] * 26 # μνλ²³μ κ°μλ₯Ό countν΄μ£Όλ 리μ€νΈ
Sum = 0 # κ΅μ²΄ν νμΌ κ°μ
N, M, K = map(int, input().split())
for i in range(N):
tiles.append(list(sys.stdin.readline().rstrip()))
step_num = N * M // K**2 # K * K λ‘ λλ κ°μ
for x in range(K):
for y in range(K): # K * K νμμ κ°κ°μ μ리
count_list = [0] * 26 # κ°μ count 리μ€νΈ μ΄κΈ°ν
for i in range(0, N - K+ 1, K):
for j in range(0, M - K + 1, K):
t = tiles[i + x][j + y]
count_list[ord(t) - 65] += 1 # μνλ²³ count
max_tile_num = max(count_list)
Sum += step_num - max_tile_num # λ³κ²½ν νμΌ κ°μ μΆκ°
max_tile = chr(count_list.index(max_tile_num) + 65) #κ°μ₯ κ°μκ° λ§μ μνλ²³ return
for i in range(0, N - K+ 1, K):
for j in range(0, M - K + 1, K):
tiles[i + x][j + y] = max_tile # νμΌ λ³ν
# μΆλ ₯
print(Sum)
for line in tiles:
print("".join(line))
μ½λ μ€λͺ
count_list = [0] * 26 # κ°μ count 리μ€νΈ μ΄κΈ°ν
for i in range(0, N - K+ 1, K):
for j in range(0, M - K + 1, K):
t = tiles[i + x][j + y]
count_list[ord(t) - 65] += 1 # μνλ²³ count
νμΌμ μ¬ μ μλ κ°μ΄ μνλ²³ λλ¬Έμλ§ μ¬ μ μλ€λ κ±Έ μ΄μ©ν΄ κ° μνλ²³μ κ°μλ₯Ό λ°°μ΄μ κ°μΌλ‘ νννλ€.
ord() ν¨μλ₯Ό νμ©ν΄ μΈλ±μ€κ°κ³Ό μνλ²³μ μΌμΉμμΌμ€λ€. (ord('A') = 65, chr(65) = 'A')
max_tile_num = max(count_list)
Sum += step_num - max_tile_num # λ³κ²½ν νμΌ κ°μ μΆκ°
max_tile = chr(count_list.index(max_tile_num) + 65) #κ°μ₯ κ°μκ° λ§μ μνλ²³ return
for i in range(0, N - K+ 1, K):
for j in range(0, M - K + 1, K):
tiles[i + x][j + y] = max_tile # νμΌ λ³ν
κ°μ₯ λ§μ μνλ²³μ κ°μλ₯Ό μ΄μ©ν΄ λ³κ²½ν νμΌ κ°μλ₯Ό ꡬνλ€.
chr() ν¨μλ₯Ό μ¬μ©ν΄μ μνλ²³μ 리ν΄ν΄μ€λ€.