본문 바로가기

알고리즘 삽질장

[인프런] 곳감(모래시계)

반응형


문제설명

현수는 곳감을 만들기 위해 감을 깎아 마당에 말리고 있다. 현수의 마당은 N by N 격자판으로 이루어져 있으며, 현수는 각 격자단위로 말리는 감의 수를 정한다. 그런데 해의 위치에 따라 특정 위치의 감은 잘 마르지 않는다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 한다. 만약 회전명령 정보가 2, 0, 3 이면 2번째 행을 왼쪽(0)으로 3만큼 아래 그림처럼 회전시키는 명령이다.

 

 

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

 

입력조건

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

출력조건

  • 총 감의 개수를 출력한다.

사고과정

  • 왼쪽, 오른쪽 입력 방향 정보에 따라 칸 수를 이동시켜야 한다. 이 때 나누기 % 연산을 활용해서 move라는 함수를 따로 구현했다. 그리고 모래시계 영역은 저번에 못 푼 사과나무 문제를 교훈삼아 해결할 수 있었다. 시작, 끝 인덱스를 설정해서 행이 늘어남에 따라 인덱스를 더해주거나 빼주었다.
  • 강의 풀이를 보니 왼쪽, 오른쪽으로 칸을 이동하는 것을 리스트 내장함수의 pop과 append, insert를 사용했다. 해당 함수를 사용할 것이라고는 생각 못했다. 입력 데이터 범위가 적으니 사용해도 괜찮은 것 같다!

풀이

- 나의 풀이

def move(row, direction, k):
    new_row = [0] * n
    # 왼쪽
    if direction == 0:
        for i in range(n):
            if (i-k) < 0:
                new_row[(i-k) % n] = row[i]
            else:
                new_row[i-k] = row[i]
    # 오른쪽
    else:
        for i in range(n):
            if (i+k) >= n:
                new_row[(i+k) % n] = row[i]
            else:
                new_row[i+k] = row[i]
    return new_row
    
n = int(input())
arr = [list(map(int, input().split())) for _ in range(n)]
m = int(input())
for _ in range(m):
    row, direction, k = map(int, input().split())
    arr[row-1] = move(arr[row-1], direction, k)
res = 0
s, e = 0, n-1
for i in range(n):
    for j in range(s, e+1):
        res += arr[i][j]
    if i < n//2:
        s += 1
        e -= 1
    else:
        s -= 1
        e += 1
print(res)

- 강의 풀이

# 강의 Solution -> list의 내장함수 pop, insert(idx, value)을 사용한 풀이
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, e = 0, 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)
반응형

'알고리즘 삽질장' 카테고리의 다른 글

[인프런] 스도쿠 검사  (0) 2021.11.12
[인프런] 봉우리  (0) 2021.11.12
[인프런] 사과나무(다이아몬드)  (0) 2021.11.12
[BOJ] 1748번 - 수 이어 쓰기 1  (0) 2021.11.05
[BOJ] 6064번 - 카잉 달력  (0) 2021.11.05