250x250
Notice
Recent Posts
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
관리 메뉴

일상 코딩

[python] 17406번 배열 돌리기 4 백준 온라인 알고리즘 풀이 본문

코딩테스트/백준 online Judge

[python] 17406번 배열 돌리기 4 백준 온라인 알고리즘 풀이

polarcompass 2021. 10. 12. 02:06
728x90

https://www.acmicpc.net/problem/17406

 

17406번: 배열 돌리기 4

크기가 N×M 크기인 배열 A가 있을때, 배열 A의 값은 각 행에 있는 모든 수의 합 중 최솟값을 의미한다. 배열 A가 아래와 같은 경우 1행의 합은 6, 2행의 합은 4, 3행의 합은 15이다. 따라서, 배열 A의

www.acmicpc.net

from copy import deepcopy
N,M,K = map(int,input().split())
A = [ list(map(int,input().split())) for _ in range(N) ]
Q = [ tuple(map(int,input().split())) for _ in range(K)]
dx, dy = [1,0,-1,0], [0,-1,0,1]

ans = 10000

def min_row(arr):
    return min([ sum(i) for i in arr ])

def convert(arr, qry):
    r,c,s = qry
    r,c = r-1, c-1
    new_arr = deepcopy(arr)
    for i in range(1,s+1):
        sr, sc = r-i, c+i
        for w in range(4):
            for _ in range(i*2):
                nr, nc = sr + dx[w], sc + dy[w]
                new_arr[nr][nc] = arr[sr][sc]
                sr, sc = nr, nc
    return new_arr                

def dfs(arr,qry):
    global ans, Q
    if sum(qry) == K:
        ans = min(ans, min_row(arr))
        return

    for i in range(K):
        if qry[i]:
            continue
        new_arr = convert(arr, Q[i])
        qry[i] = 1
        dfs(new_arr, qry)
        qry[i] = 0

dfs(A,[0 for i in range(K)])
print(ans)

주어진 입력 양식

5 6 2
1 2 3 2 5 6
3 8 7 2 1 3
8 2 3 1 4 5
3 4 5 1 1 1
9 3 2 1 4 3
3 4 2
4 2 1

정답

12

6x6 배열일때 예시

0행, 0열 부터 시작이 아닌

1행, 1열을 예시로 들었고, 주어지는 쿼리도 함수를 돌릴땐, 아래 코드를 적용해줘야 한다.

r, c = r-1, c-1

중심을 A[3][4] 로 놨을때, 

대각선 방향으로 1칸 이동시 회전하고,

대각선 방향으로 2칸 이동하여 회전하는 것을 코드로 나타내면, 아래와 같이 나타낼 수 있다.

dx, dy = [1,0,-1,0], [0,-1,0,1]

for i in range(1,s+1):
        sr, sc = r-i, c+i
        for w in range(4):
            for _ in range(i*2):
                nr, nc = sr + dx[w], sc + dy[w]
                new_arr[nr][nc] = arr[sr][sc]
                sr, sc = nr, nc

또한, 배열을 돌면서 방향을 바꿔줘야 하기에 방향 벡터 dx, dy도  설정해준다.

대각선 방향으로 1칸 이동시 한 방향 벡터마다 2번 이동을하고

대각선 방향으로 2칸 이동시 한 방향 벡터마다 4번을 이동하므로

(i * 2)를 해주어 한 변의 이동을 나타내준다.

sr, sc = nr, nc

시작(start) index와  다음(next) index를 서로 바꿔줌으로써 다음칸 이동을 나타낸다.

728x90