문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131701
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.
![](https://blog.kakaocdn.net/dn/baeuaZ/btrTsmatqZ5/9VYuj2EskJJbJgCXKNtzV1/img.png)
원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 elements가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.
제한사항
- 3 ≤ elements의 길이 ≤ 1,000
- 1 ≤ elements의 원소 ≤ 1,000
입출력 예 설명
입출력 예 #1
길이가 1인 연속 부분 수열로부터 [1, 4, 7, 9] 네 가지의 합이 나올 수 있습니다.
길이가 2인 연속 부분 수열로부터 [2, 5, 10, 11, 16] 다섯 가지의 합이 나올 수 있습니다.
길이가 3인 연속 부분 수열로부터 [6, 11, 12, 17, 20] 다섯 가지의 합이 나올 수 있습니다.
길이가 4인 연속 부분 수열로부터 [13, 15, 18, 21] 네 가지의 합이 나올 수 있습니다.
길이가 5인 연속 부분 수열로부터 [22] 한 가지의 합이 나올 수 있습니다.
이들 중 중복되는 값을 제외하면 다음과 같은 18가지의 수들을 얻습니다.
[1, 2, 4, 5, 6, 7, 9, 10, 11, 12, 13, 15, 16, 17, 18, 20, 21, 22]
풀이
원형 수열 문제이다.
이런 원형 수열은 선형 리스트를 두 배로 늘리면 된다.
무슨 말이냐면 예시로 주어진 7,9,1,1,4가 원형 수열이라고 할 때 원형 수열의 특징은 마지막 원소인 4 이후에도 다시 첫 번째 원소인7로 돌아간 다는 점.
따라서 이를 7,9,1,1,4,7,9,1,1,4로 표현하면 원형 수열의 부분 수열을 모두 찾을 수 있다.
이렇게 늘린 리스트를 2Xelements라고 하자.
이제 문제에서 요구하는 대로 1부터 원형 수열의 길이 n까지를 길이로 하는 부분 수열을 모두 찾아야 한다.
for(len in 1 .. n)
그다음엔 부분 수열의 시작 지점을 잡아준다.
for(i in elements.indices)
이제 i부터 len길이의 부분 수열의 합을 구하여 set에 넣음으로 중복을 제거한다.
for(j in i until i + len)
sum += 2Xelements[j]
set.add(sum)
set의 사이즈를 출력하면 끝
코드
class Solution {
fun solution(temp: IntArray): Int {
val n = temp.size
val elements = IntArray(n * 2) {
temp[it % n]
}
val set = mutableSetOf<Int>()
for(len in 1 .. n){
for(i in temp.indices){
var sum = 0
for(j in i until i+len){
sum += elements[j]
}
set.add(sum)
}
}
return set.size
}
}
'알고리즘 문제 풀이 > 백준' 카테고리의 다른 글
백준 19949 영재의 시험 Kotlin (완전 탐색) (0) | 2022.12.19 |
---|---|
백준 15728 에리 - 카드 Kotlin (완전탐색) (0) | 2022.12.16 |
백준 9205 맥주 마시면서 걸어가기 Kotlin (bfs) (0) | 2022.12.07 |
백준 4991 로봇 청소기 Kotlin (완탐, 비트마스킹) (1) | 2022.12.05 |
백준 10942 팰린드롬? Kotlin (dp) (2) | 2022.12.04 |
댓글