정수 n
, left
, right
가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.
i = 1, 2, 3, ..., n
에 대해서, 다음 과정을 반복합니다.i
행 i
열까지의 영역 내의 모든 빈 칸을 숫자 i
로 채웁니다.n
행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.arr
이라 할 때, arr[left]
, arr[left+1]
, ..., arr[right]
만 남기고 나머지는 지웁니다.정수 n
, left
, right
가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.
n
≤ left
≤ right
< right
- left
< class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
val list = List(n) { col -> List(n) { row -> if (col > row) col+1 else row+1 } }
val len = (right - left).toInt()
val (startCol, startRow) = Pair((left / n).toInt(), (left % n).toInt())
val (endCol, endRow) = Pair((right / n).toInt(), (right % n).toInt())
val t = list.slice(startCol..endCol).flatten().slice(startRow..startRow+len)
return t.toIntArray()
}
}
제한사항을 무시한 나는 메모리 초과와 시간 초과라는 결과를 만나게 되었다.
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
val len = (right - left).toInt()
val cols = (right/n - left/n).toInt()
val realStart = (left % n).toInt()
val list = List(cols+1) { col -> List(n) { row -> if (left/n+col > row) (left/n+col+1).toInt() else row+1 } }
return list.flatten().slice(realStart..realStart+len).toIntArray()
}
}
최대값을 구할 때 조건문 말고 max()
를 사용하는 방법이 있겠지만, 일단 그냥 풀어보았다. 문제 풀이에는 성공했지만 마음에 드는 풀이는 아니었다. 배열을 초기화하는데 사용되는 변수들이 너무 많고, 정수형 배열로 변환해주어야 하는 것도 마음에 안들었다.
내가 너무 어렵게 생각했던 걸까? 다른 사람들의 풀이를 보니 생각보다 간단히 풀리는 문제였다. 내가 미처 생각하지 못했던 건, i번째 칸의 값을 배열의 초기화 없이 구할 수 있다는 것이다.
i / n + 1
이다. i % n + 1
이다.문제에서 2차원 배열을 만들고.. 1차원으로 만들고.. left부터 right까지 자르고.. 하는 과정으로 설명했다보니까 너무 거기에 갇혀있었던 것 같다.
import kotlin.math.max
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
return (left..right).map {
max(
it / n + 1,
it % n + 1
).toInt()
}.toIntArray()
}
}
정말 간단한 문제였는데.. 너무 돌아돌아 푼 것 같다. 심지어 두 번째 풀이에서 left와 right를 이용해 행과 열의 번호도 구했으면서!! 왜 눈치채지 못했을까!! 너무 아쉽다. 그렇지만 이 문제 덕분에 2차원 배열을 초기화하는 걸 연습할 수 있어서 좋았다. 언젠가 쓰일 날이 오겠지.