Lumpy Space Princess - Adventure Time
코딩테스트/파이썬 알고리즘 문제풀이 입문

[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 곶감(모래시계)

yaebb_82 2023. 4. 29.

*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.

 

 

 

문제

현수는 곶감을 만들기 위해 감을 깎아 마당에 말리고 있습니다. 현수의 마당은 N*N 격자판으로 이루어져 있으며, 현수는 각 격자 단위로 말리는 감의 수를 정합니다. 그런데 해의 위치에 따라 특정 위치의 감은 잘 마르지 않습니다. 그래서 현수는 격자의 행을 기준으로 왼쪽, 또는 오른쪽으로 회전시켜 위치를 변경해 모든 감이 잘 마르게 합니다.
만약 회전 명령 정보가 2 0 3 이면 '2번째 행을 왼쪽으로 3만큼 회전'시키는 명령입니다.
(첫 번째 수는 행 번호, 두 번째 수는 방향인데 0이면 왼쪽, 1이면 오른쪽, 세 번째 수는 회전하는 격자의 수 입니다.)
M개의 회전 명령을 실행하고 난 후 모래시계 모양의 영역에는 감이 총 몇 개가 있는지 출력하는 프로그램을 작성하세요.

 

 

 

풀이

• 답안 : Python

import sys
input = sys.stdin.readline

N = int(input())
psm = [list(map(int, input().split())) for _ in range(N)]

M = int(input())
for i in range(M):
    a, b, c = map(int, input().split())

    if b == 0:
        for _ in range(c):
            psm[a-1].append(psm[a-1].pop(0))
    else:
        for _ in range(c):
            psm[a-1].insert(0, psm[a-1].pop())

total = 0
start = 0
end = N-1

for i in range(N):
    for j in range(start, end+1):
        total += psm[i][j]
        
    if i < N//2:    
        start += 1
        end -= 1
    else:
        start -=1
        end += 1

print(total)

• 답안 : Kotlin (내가 바꿔본 것 / 정확X)

import java.io.*
import java.util.*

fun main(args: Array<String>) = with(BufferedReader(InputStreamReader(System.`in`))){
    var N = readLine().toInt()
    var psm : MutableList<MutableList<Int>> = mutableListOf()
    for(i in 0 until N) {
        psm.add((readLine().split(" ").map { it.toInt() }).toMutableList())
    }

    var M = readLine().toInt()
    for(i in 0 until M) {
        var (a, b, c) = readLine().split(" ").map { it.toInt() }

        if(b == 0) {
            for(i in 0 until c) {
                psm[a-1].add(psm[a-1][0])
                psm[a-1].removeAt(0)
                
            }
        } else {
            for(i in 0 until c) {
                psm[a-1].add(0, psm[a-1].last())
                psm[a-1].removeAt(psm[a-1].lastIndex)   
            }
        }
    }

    var total = 0
    var start = 0
    var end = N-1

    for(i in 0 until N) {
        for(j in start until end+1) {
            total += psm[i][j]
        }
        if(i < N/2) {
            start += 1
            end -= 1
        } else {
            start -= 1
            end += 1
        }
    }

    print(total)
}

 

- 모래시계 모양대로 합을 구하는 것은 이전 문제와 풀이 방식이 비슷해서 코드를 금방 짤 수 있었는데, 왼쪽 또는 오른쪽 방향으로 회전시키는 코드를 생각해내지 못했다.

- 왼쪽 방향으로 회전 (b==0) : 맨 처음의 값을 빼내서 → 맨 으로 추가

- 오른쪽 방향으로 회전 (b==1) : 맨 의 값을 빼내서 → 맨 처음으로 추가

- Kotlin에서 readline().split(" ").map { it.toInt() } 의 반환값이 List여서 아래의 코드에서 addremoveAt 같은게 안된다는 것을 알게 되었다.

 

 

 

** 리스트에 값 추가 (맨 뒤로)

(1) Python : append(값)

(2) Kotlin : add(값)

 

*** 리스트에서 특정 인덱스로 값 추가

(1) Python : insert(인덱스, 값)

(2) Kotlin : add(인덱스, 값)

 

 

 

반응형

댓글