알고리즘 문제 풀이/다시 봐야할 것들
백준 - 배열 돌리기1(Kotlin) 답지 보고 품
가나무마
2022. 2. 20. 01:01
본 알고리즘 풀이는 Routine Study에서 진행하고 있습니다.
https://github.com/ROUTINE-STUDY/Algorithm
저를 포함한 구성원이 대부분 초보이므로, 원하시는분은 언제라도 들어오셔도 좋습니다.
GitHub - ROUTINE-STUDY/Algorithm: 초보 알고리즘 스터디 / 누구나 참여 가능
초보 알고리즘 스터디 / 누구나 참여 가능 :runner:. Contribute to ROUTINE-STUDY/Algorithm development by creating an account on GitHub.
github.com
문의는 댓글 바람.
문제 출처 :https://www.acmicpc.net/problem/16926
[문제 설명]
풀기 싫어서 미루고 미룬 문제인데 어려웠습니다.
일단 돌리는 방법을 상상도 못한 게 가장 큽니다.
다음에 다시 풀어봐야겠습니다.
[접근 방법]
import java.io.BufferedReader
import java.io.InputStreamReader
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val dy = intArrayOf(0,1,0,-1)
val dx = intArrayOf(1,0,-1,0)
val (N,M,R) = readLine().split(" ").map {it.toInt()}
val array = Array(N){IntArray(M)}
repeat(N) {
array[it] = readLine().split(" ").map { it.toInt()}.toIntArray()
}
var cntOfRepeatedSquare = N.coerceAtMost(M)/2
var k = 0
while (cntOfRepeatedSquare-- > 0) {
var remainRotateNum = R
val rowSize = N-1-k
val columnSize = M-1-k
while (remainRotateNum > 0) {
val firstNum = array[k][k]
var currentY = k
var currentX = k
var directionIdx = 0
while (directionIdx < 4) {
val nextDy = currentY + dy[directionIdx]
val nextDx = currentX + dx[directionIdx]
// 범위 안이면 이동
if (nextDy in k..rowSize && nextDx in k..columnSize) {
array[currentY][currentX] = array[nextDy][nextDx]
currentX = nextDx
currentY = nextDy
} else {
directionIdx++
}
}
array[k+1][k] = firstNum
remainRotateNum--
}
k++
}
val sb = StringBuilder()
array.forEachIndexed{ index, ints ->
ints.forEach {
sb.append(it).append(" ")
}
sb.append("\n")
}
println(sb)
}
[내 답안 수정하기]