본문 바로가기
알고리즘?/기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)

8. 곶감(모래시계) pop(),append(), 7번문제 응용

by 몰라닉네임 2023. 5. 10.

[문제설명]

첫번째 구현은 아이디어 + pop append 활용

두번째 구현은: 7번 활용 문제

 

 

[문제 사과나무 (다이아몬드)]

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

그런데 해의 위치에 따라 특정위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다.

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

 

10 13 10 12 15

12 29 30 23 11

11 25 50 53 15

19 27 29 37 27

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

 

(모래시계 영역

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개의 회전 명령을 실행하고 난 후 아래와 같이 마당의 모래시계 모양의 영역에는 감이 총 몇개가 있는지 출력하는 프로그램을 작성하세요

 

-입력설명

첫 줄에 자연수 N(홀수)이 주어진다. (3<=N<=20)

두 번째 줄부터 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

2 0 3

5 1 2

3 1 4

 

-출력예제1

362

 

 

[풀이]

1. (변환먼저

0   1   2   3   4  (인덱스 번호)

10 13 10 12 15

12 29 30 23 11

11 25 50 53 15

19 27 29 37 27

19 13 30 13 19

 

젤 뒤로 민다고 생각해라 (오른쪽 회전)

-> 제일 첫번째 인덱스 뽑아내고 a.pop(0), 다시 리스트에 append(), 

제일 뒤에서 꺼내 앞으로 넣는다고 생각해면(왼쪽으로 회전)

-> 제일 마지막 인덱스 뽑아내고 a.pop(),  0번째 리스트에 isert a.insert(0,변)

 

2. (모래시계 영역)

10 13 10 12 15  0행의 01234 , s=0 e=5

23 11 12 39 30  1행의 123  ,  s=1 e=4

11 25 50 53 15  2행의 3,  s=2 e=3

19 27 29 37 27  3행의 123,  s=1 e=4

19 13 30 13 19  4행의 01234,  s=0 e=5

 

import sys
#sys.stdin=open("input.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)) # 제일 앞의 값을 빼냈다가()제일 뒤에 append (회전)
    else:
        for _ in range(k):
            a[h-1].insert(0,a[h-1].pop()) # 제일 뒤의 값을 빼냈다가() 0번 자리에 넣는다.  (역회전)

#모래시계 출력 부분
res=0
s=0
e=n
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)

 

 

*본 문제는 인프런 김태원 강사님의 파이썬 알고리즘 문제풀이 강의에 기반합니다.  

 

'알고리즘? > 기본3 탐색&시뮬레이션(string, 1차원 2차원 리스트 탐색)' 카테고리의 다른 글

10. 스도쿠  (0) 2023.05.12
9. 봉우리  (0) 2023.05.11
7. 사과나무 (다이아몬드 )  (0) 2023.05.10
6. 격자판 최대합  (1) 2023.05.10
5. 수들의 합  (0) 2023.05.09