[파이썬 알고리즘 문제풀이] - Section3 / 탐색 & 시뮬레이션 -8

Chooooo·2023년 1월 25일
0

🎈 곳감(모래시계)

현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다. 현수의 마당은 N*N 격자판으
로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다.
그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을
기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다.
만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령
입니다.
1행 10 13 10 12 15
2행 12 39 30 23 11
3행 11 25 50 53 15
4행 19 27 29 37 27
5행 19 13 30 13 19

10 13 10 12 15
23 11 12 39 30
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

첫 번째 수는 행번호, 두 번째 수는 방향인데 0이면 왼쪽, 1이면 오른쪽이고, 세 번째 수는 회
전하는 격자의 수입니다.
M개의 회전명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감 이 총 몇
개가 있는지 출력하는 프로그램을 작성하세요.

10 13 10 12 15
23 11 12 39 30
11 25 50 53 15
19 27 29 37 27
19 13 30 13 19

▣ 입력설명
첫 줄에 자연수 N(3<=N<=20) 이 주어며, N은 홀수입니다.
두 번째 줄부터 N줄에 걸쳐 각 줄에 N개의 자연수가 주어진다.
이 자연수는 각 격자안에 있는 감의 개수이며, 각 격자안의 감의 개수는 100을 넘지 않는다.
그 다음 줄에 회전명령의 개수인 M(1<=M<=10)이 주어지고, 그 다음 줄부터 M개의 회전명령
정보가 M줄에 걸쳐 주어집니다.

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

import sys
# sys.stdin = open("input.text", "rt")

N = int(input())
data = [list(map(int, input().split())) for _ in range(N)]

#회전
M = int(input())
for i in range(M):
    row, r, num = map(int, input().split()) #행, 방향, 회전 횟수
    row -= 1

    # pop(), append(), insert()를 통해서 
    if r == 0: #왼쪽
        for _ in range(num):
            temp = data[row].pop(0) #맨 앞에 있는거 떼서 뒤에 붙임
            data[row].append(temp)
    else: #오른쪽
        for _ in range(num):
            temp = data[row].pop() #마지막에 있는거 떼어 앞에 붙임
            data[row].insert(0, temp)

s = 0
e = N-1
sum_data = 0
for i in range(N):
    for j in range(s,e+1):
        sum_data += data[i][j]
    if i < N //2:
        s += 1
        e -= 1
    else:
        s -= 1
        e += 1

print(sum_data)

🎃 코멘트
방향별 회전 pop(), append(), insert()를 통해서 앞에서 떼어 뒤에서 붙이든 뒤에서 떼어 앞으로 붙이든 내장 메서드 활용해서 하면 쉬웠다.

profile
back-end, 지속 성장 가능한 개발자를 향하여

0개의 댓글