본문 바로가기
알고리즘

Algorithm - 모래시계 모양의 합

by DGK 2021. 11. 17.

 

알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.

 

문제

[모래시계 모양의 곳감 합]

 

현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있다. 현수의 마당은 N*N 격자판으로 이루어져 있으며,

현수는 각 격자단위로 말리는 감의 수를 정한다. 그런데 해의 위치에 따라 특정 위치의 감은 잘 마르지 않기 때문에,

격자의 행을 기준으로 왼쪽 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르도록 해야한다.

 

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

회전명령의 예시

 

첫 번째 수는 행번호이고 두 번째 수는 방향이며 0이면 왼쪽, 1이면 오른쪽이다. 마지막으로 세 번째 수는 회전하는

격자의 수이다. M개의 회전명령을 실행하고 난 후에 아래와 같이 모래시계 모양의 영역에는 감이 총 몇개가 있는지

출력하는 프로그램을 작성하시오.

현수의 마당(곳감 수)

 

 

*입력 설명

첫 줄에 자연수 N(3 ≤ N ≤ 20)이 주어지며, N은 홀수이다.

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

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

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

주어진다.

 

*출력 설명

총 감의 개수를 출력한다.

 

 


 

 

풀이(Python)

답안

import sys
sys.stdin = open('AA/input_18.txt', 'rt')
 
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]

m = int(input())
for i in range(m):
    h, t, k = map(int, input().split())
    if t == 0:
        for _ in range(k):
            a[h-1].append(a[h-1].pop(0))
    else:
        for _ in range(k):
            a[h-1].insert(0, a[h-1].pop())
res = 0
s = 0
e = n-1
for i in range(n):
    for j in range(s, e+1):
        res += a[i][j]
    if i < n // 2:
        s += 1
        e -= 1
    else:
        s -= 1
        e += 1
print(res)

 

input_18.txt(입력)

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

 

 

중요내용

  1. 특정 행에서 숫자들의 왼쪽 회전은 pop() 함수와 append() 함수를 사용하여 실행된다.
  2. 특정 행에서 숫자들의 오른쪽 회전은 insert() 함수와 pop() 함수를 사용하여 실행된다.
  3. 참고로, pop() 함수의 인자가 없는 경우에는 해당 리스트의 맨 마지막 데이터를 리스트에서 삭제한 후 가져온다.
  4. 또한, insert() 함수는 특정 데이터를 사용자가 원하는 리스트의 자리에 삽입할 수 있다. (insert() 함수의 첫 인자)

 

 

'알고리즘' 카테고리의 다른 글

Algorithm - 스도쿠 검사  (0) 2021.11.19
Algorithm - 봉우리 찾기  (0) 2021.11.17
Algorithm - 다이아몬드 모양의 합  (0) 2021.11.17
Algorithm - 격자판 최대합  (0) 2021.11.17
Algorithm - 수의 합  (0) 2021.11.07

댓글