Notice
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- ANR이란
- 안드로이드 레트로핏 사용법
- 서비스 쓰레드 차이
- 객체
- 안드로이드 유닛 테스트 예시
- 안드로이드 라이선스
- rxjava cold observable
- 멤버변수
- android retrofit login
- 안드로이드 유닛테스트란
- Rxjava Observable
- 클래스
- 안드로이드 유닛 테스트
- jvm이란
- ar vr 차이
- 서비스 vs 쓰레드
- android ar 개발
- rxjava disposable
- 플러터 설치 2022
- rxjava hot observable
- jvm 작동 원리
- 스택 큐 차이
- 안드로이드 라이선스 종류
- 안드로이드 레트로핏 crud
- 스택 자바 코드
- 2022 플러터 설치
- 자바 다형성
- 안드로이드 os 구조
- 2022 플러터 안드로이드 스튜디오
- 큐 자바 코드
Archives
- Today
- Total
나만을 위한 블로그
[Algorithm] 프로그래머스 - 2차원으로 만들기 (Kotlin) 본문
728x90
반응형
정수 배열 num_list, 정수 n이 매개변수로 주어진다. num_list를 2차원 배열로 바꿔 리턴하는 solution()을 완성하라
num_list의 길이를 n으로 나눈 값만큼 배열을 만들고, num_list에서 n개씩 요소를 빼내 만든 배열에 넣는다.
주먹구구식으로 로직을 짰더니 아래처럼 되었다.
class Solution {
fun solution(numList: IntArray, n: Int): Array<IntArray> {
var count = 0
val answer = Array(numList.size / n) { IntArray(n) }
for (i in 0 until (numList.size / n)) {
for (j in 0 until n) {
answer[i][j] = numList[count]
count++
}
}
return answer
}
}
count는 num_list에서 값을 빼올 인덱스다. i, j는 처음엔 0부터 시작하고 j for문이 끝나야 i for문이 작동하니까 이렇게 작동하도록 짰다.
- i, j는 모두 처음에 0이니 j for문 안의 answer[i][j]는 answer[0][0]을 가리킨다
- count는 처음에 0으로 선언했으니, answer[0][0]에 num_list의 0번 값을 가져와 넣는다
- 이후 count++가 호출되어 count 변수값이 0에서 1로 증가한다
- j도 +1 되어 이제 answer[0][1]을 가리키게 되고, num_list의 1번 값을 가져와 answer[0][1]에 넣는다
- j for문이 모두 끝났다. 이제 i for문으로 돌아가서 i가 +1 되고 j는 다시 0이 되어 answer[1][0]을 가리키게 된다
- i가 +1 되면 answer[1][0]에 num_list의 2번 값인 3을 가져와 넣는다
- 그리고 j도 +1 되고 count도 +1되어 answer[1][1]에 num_list의 3번 값인 4를 가져와 넣는다
- j for문이 끝나고 i for문으로 돌아가 i가 +1 된다. 이후 같은 동작을 반복한다
그러나 이 코드는 O(n^2)의 시간복잡도를 갖는다. 좀 더 간단하게 쓸 수 있는 방법은 없을까 고민하다가 영 생각나질 않아서 다른 사람의 풀이를 참고했다.
class Solution {
fun solution(num_list: IntArray, n: Int) = num_list.toList().chunked(n)
}
chunked()가 뭐길래 저렇게 코드가 짧아지는지 공식 홈페이지를 확인해 봤다.
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/chunked.html
이 컬렉션을 각각 지정된 크기를 초과하지 않는 List<List<T>>로 분할한다. 결과 리스트의 마지막 리스트에는 지정된 크기보다 적은 요소가 있을 수 있다
public fun <T> Iterable<T>.chunked(size: Int): List<List<T>> {
return windowed(size, size, partialWindows = true)
}
리턴형이 List<List<T>>라서 매개변수인 num_list를 리스트로 만들고 호출하면 자동으로 2중 리스트로 만들어준다. 또 좋은 함수를 알아가게 되는 문제였다.
반응형
'알고리즘 문제 풀이 > 프로그래머스' 카테고리의 다른 글
[Algorithm] 프로그래머스 - 배열 회전시키기 (Kotlin) (0) | 2022.12.28 |
---|---|
[Algorithm] 프로그래머스 - 공 던지기 (Kotlin) (0) | 2022.12.27 |
[Algorithm] 프로그래머스 - 점의 위치 구하기 (Kotlin) (0) | 2022.12.27 |
[Algorithm] 프로그래머스 - 구슬을 나누는 경우의 수 (Kotlin) (0) | 2022.12.27 |
[Algorithm] 프로그래머스 - 가위바위보 (Kotlin) (0) | 2022.12.26 |
Comments