😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BAEKJOON python] 17822_μ›νŒ 돌리기 λ³Έλ¬Έ

πŸ¦₯ μ½”ν…Œ/BAEKJOON

[BAEKJOON python] 17822_μ›νŒ 돌리기

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 4. 9. 13:58
728x90
λ°˜μ‘ν˜•
μ›νŒ λŒλ¦¬κΈ°
λ°˜μ§€λ¦„μ΄ 1, 2, ..., N인 μ›νŒμ΄ ν¬κΈ°κ°€ μž‘μ•„μ§€λŠ” μˆœμœΌλ‘œ λ°”λ‹₯에 λ†“μ—¬μžˆκ³ 
μ›νŒμ˜ μ€‘심은 λͺ¨λ‘ κ°™λ‹€
μ›νŒμ˜ λ°˜μ§€λ¦„이 i이면, κ·Έ μ›νŒμ„ i번째 μ›νŒ
각각의 μ›νŒμ—λŠ” M개의 μ •μˆ˜κ°€ μ ν˜€μžˆκ³ , i번째 μ›νŒμ— μ νžŒ j번째 μˆ˜μ˜ μœ„μΉ˜λŠ” (i, j)

수의 μœ„μΉ˜
(i, 1)은 (i, 2), (i, M)κ³Ό μΈμ ‘
(i, M)은 (i, M-1), (i, 1)κ³Ό μΈμ ‘
(i, j)λŠ” (i, j-1), (i, j+1)κ³Ό μΈμ ‘ (2 ≤ j ≤ M-1)
(1, j)λŠ” (2, j)와 μΈμ ‘
(N, j)λŠ” (N-1, j)와 μΈμ ‘
(i, j)λŠ” (i-1, j), (i+1, j)와 μΈμ ‘ (2 ≤ i ≤ N-1)

μ›νŒμ˜ νšŒμ „은 λ…λ¦½μ μœΌλ‘œ μ΄λ£¨μ–΄μ§„λ‹€
2번 μ›νŒμ„ νšŒμ „ν–ˆμ„ λ•Œ, λ‚˜λ¨Έμ§€ μ›νŒμ€ νšŒμ „ν•˜μ§€ μ•ŠλŠ”λ‹€
μ›νŒμ„ νšŒμ „μ‹œν‚¬ λ•ŒλŠ” μˆ˜μ˜ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ ν•˜λ©°, νšŒμ „μ‹œν‚¨ ν›„μ˜ μˆ˜μ˜ μœ„μΉ˜λŠ” νšŒμ „μ‹œν‚€κΈ° μ „κ³Ό μΌμΉ˜

μ›νŒμ„ μ•„λž˜μ™€ κ°™μ€ λ°©λ²•μœΌλ‘œ μ΄ T번 νšŒμ „
μ›νŒμ˜ νšŒμ „ λ°©λ²•μ€ λ―Έλ¦¬ μ •ν•΄μ Έ μžˆκ³ , i번째 νšŒμ „ν• λ•Œ μ‚¬μš©ν•˜λŠ” λ³€μˆ˜λŠ” xi, di, ki
1) λ²ˆν˜Έκ°€ xi의 λ°°μˆ˜μΈ μ›νŒμ„ diλ°©ν–₯으둜 kiμΉΈ νšŒμ „
    0인 κ²½μš°λŠ” μ‹œκ³„ λ°©ν–₯, 1인 κ²½μš°λŠ” λ°˜μ‹œκ³„ λ°©ν–₯
2) μ›νŒμ— μˆ˜κ°€ λ‚¨μ•„ μžˆμœΌλ©΄, μΈμ ‘ν•˜λ©΄μ„œ μˆ˜κ°€ κ°™μ€ κ²ƒμ„ λͺ¨λ‘ μ°ΎλŠ”λ‹€
    κ·ΈλŸ¬ν•œ μˆ˜κ°€ μžˆλŠ” κ²½μš°μ—λŠ” μ›νŒμ—μ„œ μΈμ ‘ν•˜λ©΄μ„œ κ°™μ€ μˆ˜λ₯Ό λͺ¨λ‘ μ§€μš΄λ‹€
    μ—†λŠ” κ²½μš°μ—λŠ” μ›νŒμ— μ νžŒ μˆ˜μ˜ ν‰κ· μ„ κ΅¬ν•˜κ³ , ν‰κ· λ³΄λ‹€ ν° μˆ˜μ—μ„œ 1을 λΉΌκ³ , μž‘은 μˆ˜μ—λŠ” 1을 λ”ν•œλ‹€
3) μ›νŒμ„ T번 νšŒμ „μ‹œν‚¨ ν›„ μ›νŒμ— μ νžŒ μˆ˜μ˜ ν•©

첫째 μ€„에 N, M, T이 μ£Όμ–΄μ§„λ‹€
λ‘˜μ§Έ μ€„λΆ€ν„° N개의 μ€„에 μ›νŒμ— μ νžŒ μˆ˜κ°€ μ£Όμ–΄μ§„λ‹€
    i번째 μ€„μ˜ j번째 μˆ˜λŠ” (i, j)에 μ νžŒ μˆ˜λ₯Ό μ˜λ―Έ
λ‹€μŒ T개의 μ€„에 xi, di, ki
from collections import deque

# n개의 μ›νŒ, μ›νŒμ—λŠ” M개의 μ •μˆ˜, t번 νšŒμ „
n, m, t = map(int, input().split())
graph = [list(map(int, input().split())) for _ in range(n)]
# 동, μ„œ, 남, 뢁
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

def rotate(x, d, k) :
    queue = deque()
    queue.extend(graph[x])
    # 0인 κ²½μš°λŠ” μ‹œκ³„ λ°©ν–₯, 1인 κ²½μš°λŠ” λ°˜μ‹œκ³„ λ°©ν–₯
    if d == 0 :
        # μ‹œκ³„λ°©ν–₯으둜 kλ°° 만큼 돌리기
        queue.rotate(k)
    else :
        # λ°˜μ‹œκ³„λ°©ν–₯으둜 kλ°° 만큼 돌리기
        queue.rotate(-k)
    graph[x] = list(queue)

def change_arg() :
    arg_cnt = 0
    all_sum = 0
    for i in range(n) :
        for j in range(m) :
            # 처음 λͺ¨λ“  제거된 숫자(0)을 μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 숫자의 κ°―μˆ˜μ™€ 
            # κ·Έ μˆ«μžλ“€μ˜ 합을 κ³„μ‚°ν•œ ν›„,
            # λ§Œμ•½ λͺ¨λ“  μˆ«μžκ°€ 0이라면 평균을 κ³„μ‚°ν•˜μ§€ μ•Šκ²Œ 리턴
            if graph[i][j] != 0 :
                arg_cnt += 1
                all_sum += graph[i][j]
            
    if arg_cnt == 0:
        return False
    # 평균을 κ³„μ‚°ν–ˆλ‹€λ©΄ λͺ¨λ“  μ›νŒμ— λ“€μ–΄μžˆλŠ” μˆ«μžλ“€μ— κ°’κ³Ό 비ꡐ
    avg = all_sum / arg_cnt
    for i in range(n) :
        for j in range(m) :
            if graph[i][j] != 0 :
                # 평균 값보닀 크닀면 -1, 평균값보닀 μž‘λ‹€λ©΄ +1
                if graph[i][j] > avg :
                    graph[i][j] -= 1
                elif graph[i][j] < avg :
                    graph[i][j] += 1
    return True

# μΈμ ‘ν•œ 곳에 μˆ«μžκ°€ 같은지 νŒŒμ•…ν•΄μ„œ λ§Œμ•½ μˆ«μžκ°€ κ°™λ‹€λ©΄ μ›νŒμ— 숫자λ₯Ό 제거(0으둜 λ³€κ²½)
# i번째 μ›νŒμ—λŠ” 즉, 0번 μ—΄κ³Ό m-1 열은 이어져 μžˆμœΌλ―€λ‘œ 인접 4λ°©ν–₯을 μ‚΄ν•„ λ•Œ, 값을 잘 λ³€κ²½ν•΄μ€˜μ„œ λͺ¨λ“  μ›νŒμ— μΈμ ‘ν•œ 곳을 λ°©λ¬Έ
def solve(x, y) :
    queue = deque()
    queue.append((x, y))
    visited[x][y] = True
    
    value = graph[x][y]
    graph[x][y] = 0
    cnt = 0
    while queue :
        x, y = queue.popleft()
        for i in range(4) :
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 > ny or ny >= m :
                if y == 0 :
                    ny = m -1
                elif y == m - 1:
                    ny = 0
            if 0 <= nx < n and 0 <= ny < m :
                if not visited[nx][ny] :
                    if graph[nx][ny] == value :
                        cnt += 1
                        graph[nx][ny] = 0
                        visited[nx][ny] = True
                        queue.append((nx, ny))
    if cnt == 0 :
        graph[x][y] = value
    return cnt

for _ in range(t) :
    # λ²ˆν˜Έκ°€ xi의 배수인 μ›νŒμ„ diλ°©ν–₯으둜 kiμΉΈ νšŒμ „
    x, d, k = map(int, input().split())
    check_sum = 0
    for i in range(n) :
        check_sum += sum(graph[i])
        if (i+1) % x == 0 :
            rotate(i, d, k)
    if check_sum == 0 :
        break
    else :
        visited = [[False] * m for _ in range(n)]
        cnt = 0
        for i in range(n) :
            for j in range(m) :
                if not visited[i][j] and graph[i][j] != 0 :
                    cnt += solve(i, j)
        if cnt == 0 :
            change_arg()
answer = 0
for i in range(n) :
    answer += sum(graph[i])
print(answer)

예제 μž…λ ₯

4 4 1
1 1 2 3
5 2 4 2
3 1 3 5
2 1 3 2
2 0 1

예제 좜λ ₯

30

 

 

 

μ“°μ•΅λ‹˜ μ–΄λ ΅μŠ΅λ‹ˆλ‹€.

https://developer-ellen.tistory.com/65

728x90
λ°˜μ‘ν˜•
Comments