[문제] 곶감(모래시계)
현수는 곳감을 만들기 위해 감을 깍아 마당에 말리고 있습니다. 현수의 마당은 N*N 격자판으
로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정합니다.
그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을
기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다.
만약 회전명령 정보가 2 0 3이면 2번째 행을 왼쪽으로 3만큼 아래 그림처럼 회전시키는 명령
입니다.
1행 10 13 10 12 15 10 13 10 12 15
2행 12 39 30 23 11 23 11 12 39 30
3행 11 25 50 53 15 => 11 25 50 53 15
4행 19 27 29 37 27 19 27 29 37 27
5행 19 13 30 13 19 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줄에 걸쳐 주어집니다.
출력 설명
총 감의 개수를 출력합니다.
입력예제 1
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
362
문제 접근
- 첫 줄에 격자판 자연수 N개를 입력받고, 두 번째 줄부터 N줄에 N개의 자연수를 a리스트로 받습니다.
- 회전 명령의 개수인 M을 입력받고 for문을 n번 만큼 돌려서 회전 명령인 row, rot, amo를 받습니다.
- row : 행, rot : rotation, amo : amount
- if rot == 0 즉 왼쪽인 경우와 else 오른쪽인 경우로 분기를 구분한다.
- 왼쪽인 경우는 맨 왼쪽 0번 인덱스의 값을 해당 행에 맨 끝으로 보낸다.
- 오른쪽 경우는 맨 오른쪽 -1 인덱스의 값을 해당 행에 맨 앞으로 보낸다.
- 모래시계 모양으로 접근 하기 위해서는 이차 for문을 사용해서 start, end 변수로 포인터를 이동하면서 접근해서 total에 더해준다.
- total을 출력한다.
풀이
나의 코드
- 10행, 14행 : 리스트 슬라이싱으로 해결
n = int(input())
a = [list(map(int, input().split())) for _ in range(n)]
m = int(input())
for i in range(m):
row, rot, cnt = map(int, input().split())
# 왼쪽
if rot == 0:
for _ in range(cnt):
a[row-1] = a[row-1][1:] + a[row-1][:1]
# 오른쪽
else: # rot == 1
for _ in range(cnt):
a[row-1] = a[row-1][-1:] + a[row-1][:-1]
s = 0
e = n
res = 0
for i in range(n):
for j in range(s, e):
res += a[i][j]
# 모래시계 모양의 중간까지 연산
if i < n // 2:
s += 1
e -= 1
# 모래시계 모양의 중간부터 끝
else:
s -= 1
e += 1
print(res)
정답 코드
- 11행 : a[h-1].pop(0)은 a[h-1]행의 첫 번째 인덱스의 값을 꺼낸다.
- 17행 : a[h-1].insert(0, a[h-1].pop())은 insert는 해당하는 인덱스에 값을 넣는다. pop()은 맨 오른쪽 즉 마지막 값을 꺼낸다.
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):
# insert(index, value) => 0번 자리에 a[h-1]행의 맨 오른쪽의 값을 추가
a[h-1].insert(0, a[h-1].pop())
s = 0
e = n
res = 0
for i in range(n):
for j in range(s, e):
res += a[i][j]
if i < n // 2:
s += 1
e -= 1
else:
s -= 1
e += 1
print(res)
'코딩테스트 > Algorithm' 카테고리의 다른 글
[Algorithm][Python] 자릿수의 합 (0) | 2021.05.19 |
---|---|
[Algorithm][Python] 정다면체 (0) | 2021.05.13 |
[Algorithm][Python] 대표값 (0) | 2021.05.13 |
[Algorithm][Python] K번째 큰 수 (0) | 2021.05.13 |
[Algorithm][Python] K번째 작은수 (0) | 2021.05.13 |
[Algorithm][Python] K번째 약수 (0) | 2021.05.13 |