n^2배열 자르기
n행의 n열크기의 2차원배열에서 i행 i열까지의 빈칸의 값을 i로 채운다.
2차원배열을 1차원배열로 만들고 left부터 right까지의 요소들을 1차원배열로 반환해야한다.
처음엔 2차원배열을 만들어서 각좌표의 가장 큰 값을 해당 값으로 넣어주고 1차원 배열로 만들어 left부터 right까지의 index를 가져와 answer의 넣어 반환해주려고 했는데 n의 값이 n
≤ 10^7 이기 때문에 n의 값이 너무 커져 2차원배열을 만들때 메모리초과 오류가 나온다.
그래서 다른방법을 생각해보려고 각 좌표를 계산해보니 해당 좌표의 값은 (x, y)에서 x와 y좌표 중 가장 큰값의 +1이 해당 좌표의 값이 된다. 그래서 left와 right사이에 있는값 i 와 n에서 i / n
은 x의 좌표가 되고 i % n
은 y의 좌표가 된다.(i/n
, i%n
) 해당 좌표를 구하는 법을 이용해 i / n
이 크면 answer에 i / n + 1
을 추가해주고 i % n
이 크면 answer에 i % n + 1
을 추가해주고 answer list를 intArray로 바꿔 반환해준다.
나의풀이
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
var answer: IntArray = intArrayOf()
var arr = Array(n) { IntArray(n) }
var count = 1
for(i in arr.indices){
for(j in arr.indices){
if(i > j){
arr[i][j] = i
} else {
arr[i][j] = j
}
}
}
var arr2 = arr.map{ it.toList()}.flatten()
for(i in left..right){
answer += arr2[i.toInt()] + 1
}
return answer
}
}
처음 2차원배열을 만들어 풀어보려고 했을때 메모리초과
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
var answer: IntArray = intArrayOf()
for(i in left..right){
if(i / n >= i % n ){
answer = answer.plus((i/n).toInt() + 1)
}else{
answer = answer.plus( (i % n).toInt() + 1)
}
}
return answer
}
}
통과가 되긴 했는데 시간이 너무 크게 나왔다. (4236.02ms, 375MB)
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
var answer = mutableListOf<Int>()
var arr = Array(n) { IntArray(n) }
for(i in left..right){
if(i / n >= i % n ){
answer.add((i / n).toInt() + 1)
} else {
answer.add((i % n).toInt() + 1)
}
}
return answer.toIntArray()
}
}
위 코드처럼 answer를 list로 바꾸었는데도 메모리 초과 오류가 계속 났었는데 알고보니 n크기로 2차원배열을 만드는 부분을 삭제해주지 않아 생기는 문제였다. 그래서 해당 배열선언 부분을 삭제해주니 해결됐다.
(32.99ms, 76.6MB)
import kotlin.math.max
class Solution {
fun solution(n: Int, left: Long, right: Long): IntArray {
return (left..right).map { (max(it / n, it % n) + 1).toInt() }.toIntArray()
}
}
주의
- res의 하위폴더들은 지정된 폴더명을 사용해야 한다.
- 각 리소스폴더에 다시 하위폴더를 정의 할수 없다.
- 리소스 파일 명에는 알파벳 대문자를 사용할수없다.
- 소문자 a~z, 0~9, "_" (underscore)만 포함가능
string 값을 따로 정의해 리소스를 불러오는 이유는 다국어 지원을 위해서 사용한다.
앱을 빌드할때 어떤 모듈을 포함할지 Gradle에 알
려줌
대부분의 프로젝트에서 다음코드만을 포함 include ':app'
compileSdkVersion 28
- 컴파일시 sdk 28버전을 사용minSdkVersion 26
- 앱이 지원하는 최소 API 버전을 26으로 설정targetSdkVersion 28
- 앱을 테스트하기 위해 사용할 API버전을 28로 설정dependencies
- 모듈자체를 빌드하기 위해 요구되는 종속성을 명세, 외부저장소에서 해당 라이브러리를 다운 받아와 빌드