알고리즘 입문 수업을 듣고 중요한 내용을 정리했습니다.
개인 공부 후 자료를 남기기 위한 목적이므로 내용 상에 오류가 있을 수 있습니다.
문제
[모래시계 모양의 곳감 합]
현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있다. 현수의 마당은 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
중요내용
- 특정 행에서 숫자들의 왼쪽 회전은 pop() 함수와 append() 함수를 사용하여 실행된다.
- 특정 행에서 숫자들의 오른쪽 회전은 insert() 함수와 pop() 함수를 사용하여 실행된다.
- 참고로, pop() 함수의 인자가 없는 경우에는 해당 리스트의 맨 마지막 데이터를 리스트에서 삭제한 후 가져온다.
- 또한, 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 |
댓글