티스토리 뷰
코드카타
연속 부분 수열 합의 개수
문제
주어진 원형 배열의 모든 부분 배열 합을 구하는 문제이다.
입출력 예시
2중 for문을 돌려 모든 부분 수열의 합을 구하고 중복되는 값을 제거해줘야 한다.
풀이
class Solution {
fun solution(elements: IntArray): Int {
// 부분배열 합의 중복을 제거하기 위해 가변형 set 선언
val set = mutableSetOf<Int>()
// 이중 for문을 통한 부분 배열 생성
for (i in 1..elements.size)
for (j in elements.indices) {
var sum = 0
// 부분배열의 합 계산
for (k in j until i + j) {
// 원형 배열의 특성을 고려하여 인덱스 계산
sum += elements[k % elements.size]
}
set.add(sum) // 계산된 합을 set에 추가
}
}
// set의 크기(중복되지 않는 모든 부분 배열 합의 개수)를 반환
return set.size
}
}
3중 for문을 통해 주어진 원형배열에서 모든 부분배열의 합을 구한 뒤
중복을 제거한 부분배열 합의 수를 반환하는 문제였다.
부분 배열 생성 로직
// 어떤식으로 부분배열이 생성되는지 확인하기 위해서
// 길이가 n일 때마다 생성되는 모든 부분배열을 출력하는 로직을 짰다.
fun main() {
val elements = intArrayOf(7, 9, 1, 1, 4)
for (i in 1..elements.size) {
print("길이 $i: ")
for (j in elements.indices) {
var res = mutableListOf<Int>()
for (k in j until i + j) {
res.add(elements[k % elements.size])
}
print("$res ")
}
println()
}
}
i는 (1 ~ elements 배열 크기)의 값을 가지고
j는 elements의 인덱스 범위를 값으로 가진다.
해당구문에서 k는 j ~ (i + j -1) 의 범위를 가지는데
이는 부분 배열을 구성하는 요소의 인덱스에 해당한다.
// 위 main함수 실행 결과
길이 1: [7] [9] [1] [1] [4]
길이 2: [7, 9] [9, 1] [1, 1] [1, 4] [4, 7]
길이 3: [7, 9, 1] [9, 1, 1] [1, 1, 4] [1, 4, 7] [4, 7, 9]
길이 4: [7, 9, 1, 1] [9, 1, 1, 4] [1, 1, 4, 7] [1, 4, 7, 9] [4, 7, 9, 1]
길이 5: [7, 9, 1, 1, 4] [9, 1, 1, 4, 7] [1, 1, 4, 7, 9] [1, 4, 7, 9, 1] [4, 7, 9, 1, 1]
해당 3중 for문은 주어진 배열의 모든 가능한 부분 배열을 구하기 위해
배열크기가 n이라고 할 때, n^2번 반복해서 모든 가능한 부분 배열의 합을 구한다.
원형 배열의 특성 고려
sum += elements[k % elements.size]
원형 배열은 배열의 끝에 도달했을 때 다시 배열의 처음으로 돌아간다.
배열의 경계를 넘어가는 경우, 즉 k가 주어진 배열크기보다 큰 값을 가진 경우를 고려한다.
회고
2중 for문을 사용하는 로직은 머릿속으로 구현할만한데
3중 for문부터는 이해하기도 어려운 느낌이다.
수열의 규칙성을 찾아내는 dp문제인 줄 알았는데
3중 for문을 통해 모든 부분배열의 합을 구하는 문제였다.
아직 문제풀이 경험이 부족함을 느꼈기에 더 많은 문제를 풀어봐야겠다.
'Android 국비지원' 카테고리의 다른 글
TIL 24일차 (n^2 배열 자르기 - Kotlin | 안드로이드 앱 개발 입문 2주차 정리) (0) | 2024.06.19 |
---|---|
TIL 23일차 (H-Index - Kotlin | 안드로이드 앱 개발 입문 1주차 정리, 잘못된 풀이 분석하기) (0) | 2024.06.18 |
TIL 21일차 (괄호 회전하기 - Kotlin) (1) | 2024.06.16 |
TIL 20일차 (귤 고르기 - Kotlin) (0) | 2024.06.15 |
TIL 19일차 (멀리 뛰기 - Kotlin | 키오스크 Lv4 구현) (0) | 2024.06.14 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 그룹화
- 레이아웃
- 행렬의 내적
- 프로그래머스
- 뷰
- 국비지원
- 안드로이드 스튜디오
- 코틀린
- 위젯
- 무스마
- 개발블로그
- 스파트타 코딩클럽
- kakao api
- shared_preferences
- 플러터
- 파이썬
- 귤 고르기
- 프로그래머스 #코틀린 #map
- 9 to 9
- android 부트캠프
- 기초 문제
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함