[알고리즘] 곳감(모래시계)
(문제) 곳감(모래시계)
현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다.
현수의 마당은 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)
댓글남기기