[알고리즘] 곳감(모래시계)

(문제) 곳감(모래시계)


현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다.

현수의 마당은 N * N 격자판으로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다.

그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다.

그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다.

만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령입니다.



첫 번째 수는 행번호, 두 번째 수는 방향인데 0이면 왼쪽, 1이면 오른쪽이고, 세 번째 수는 회전하는 격자의 수입니다.

M개의 회전명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감 이 총 몇개가 있는지 출력하는 프로그램을 작성하세요.



입력설명

첫 줄에 자연수 N(3<=N<=20) 이 주어며, N은 홀수입니다.

두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.

이 자연수는 각 격자안에 있는 감의 개수이며, 각 격자안의 감의 개수는 100을 넘지 않는다.

그 다음 줄에 회전명령의 개수인 M(1<=M<=10)이 주어지고, 그 다음 줄부터 M개의 회전명령 정보가 M줄에 걸쳐 주어집니다.

출력설명

총 감의 개수를 출력합니다.

테스트케이스

입력예제 출력예제
5
10 13 10 12 15
12 39 30 23 11
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19
3
2 0 3
5 1 2
3 1 4
362
7
74 10 31 26 59 16 89
78 44 49 1 64 33 15
9 95 70 18 22 25 40
62 77 28 3 78 75 23
82 38 20 16 42 1 79
1 24 2 25 95 26 79
4 35 46 94 70 44 83
3
2 0 3
5 1 2
3 1 4
1304
9
64 8 59 87 94 71 66 4 9
38 21 30 24 33 65 7 79 27
99 10 78 74 84 32 33 74 30
4 6 69 53 100 15 23 15 88
22 88 8 3 62 75 46 4 41
39 64 7 75 91 26 83 32 41
100 98 20 100 18 39 90 60 56
56 30 94 29 81 76 96 50 11
66 88 88 95 13 56 29 13 31
5
1 0 5
3 0 6
2 1 5
6 0 7
5 0 8
2539

해결방법

회전을 하는 것은 pop 과 append 혹은 insert를 이용하여 회전 시킨다.

모래시계는 반복문을 통해서 감소 시키거나 증가 시킨다.
(이 경우, 규칙적인 + 1 이라던지 + i 같은게 있는데, 반대로 하고 싶은 경우는 len 즉 시작 개수에서 빼는 형식으로 생각하면 쉽다)


코드

n = int(input())

arr = [list(map(int, input().split())) for i in range(n)]

# 회전 하는 식
for _ in range(int(input())):
    # s : 행번호 / d : 방향 0 왼쪽, 1 오른쪽 / m : 회전 번 수
    s, d, m = map(int, input().split())

    if d == 1:
        # 오른쪽으로 회전
        for _ in range(m):
            arr[s-1].insert(0, arr[s-1].pop())
    else:
        # 왼쪽으로 회전
        for _ in range(m):
            arr[s-1].append(arr[s-1].pop(0))

_sum = 0

mid = n // 2

# 감을 더하는 식
for i in range(n):
    if mid >= i:
        for j in range(i, n-i):
            _sum = _sum + arr[i][j]
    else:
        for j in range(n-(i+1), i+1):
            _sum = _sum + arr[i][j]

print(_sum)

댓글남기기