*문제 본문은 강의 내용과 관련되어 있어 자세하게 적지 않았습니다.
문제
현수는 곶감을 만들기 위해 감을 깎아 마당에 말리고 있습니다. 현수의 마당은 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여서 아래의 코드에서 add나 removeAt 같은게 안된다는 것을 알게 되었다.
** 리스트에 값 추가 (맨 뒤로)
(1) Python : append(값)
(2) Kotlin : add(값)
*** 리스트에서 특정 인덱스로 값 추가
(1) Python : insert(인덱스, 값)
(2) Kotlin : add(인덱스, 값)
'💻 코딩테스트 > 파이썬 알고리즘 문제풀이' 카테고리의 다른 글
[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 스도쿠 검사 (0) | 2023.05.03 |
---|---|
[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 봉우리 (0) | 2023.05.02 |
[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 사과나무(다이아몬드) (1) | 2023.04.28 |
[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 격자판 최대합 (1) | 2023.04.28 |
[파이썬 알고리즘 문제풀이 입문] 탐색&시뮬레이션 - 수들의 합 (투포인터 알고리즘) (0) | 2023.04.28 |