Swift랑 친해지기/programmers 풀기

[프로그래머스] 연속된 부분 수열의 합 (Swift)

데브킹덕 2023. 9. 6. 15:40

https://school.programmers.co.kr/learn/courses/30/lessons/178870

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나만의 풀이 방법)

- 왼쪽 인덱스 left 와 오른쪽 인덱스 right 지점을 정한다.

- left부터 right 구간에 속한 값들을 모두 더한 것이 sum이다. 

- 만약 sum이 k보다 작다면 right 값을 1증가시키고 sequence[right] 를 sum에 더해준다.

이유: 구간의 합이 k보다 적기 때문에 다음 인덱스값을 더함

*이때 right값이 sequence배열의 갯수 보다 크면 out of range 에러가 나기 때문에 구간설정해줌

-> 더 이상 right값을 늘리기 어려울때 left를 증가시켜 while문을 종료시킬 수 있도록 하였음 (left가 증가하지 않아 무한반복) 

 

- 반대로 sum이 k보다 크다면 sequence[left] 값을 먼저 빼주고 left를 1증가시켜주었음

(이때 while문에 조건으로 left값은 sequence의 개수 -2 이므로 따로 처리하지 않음)

 

- left나 right를 조정하여 sum이 k와 같을 경우

  • 반환할 result의 값이 비어있다면 [left,right] 값을 반환하도록 하였음
  • result가 값을 가지고 있을 경우
    • result의 인덱스 차이와 left, right 인덱스 차이를 비교하여 left,right 거리가 더 적으면 result를 갱신하도록함  
    • right 값을 1증가시키고 sequence[right] 를 sum에 더해줘 다음 반복문에서 left 인덱스를 조절할 수 있도록 함

 

 

 

 

import Foundation

func solution(_ sequence:[Int], _ k:Int) -> [Int] {
   
    var left = 0
    var right = 0
    var sum = sequence[left]
    var result = [Int]()
    
    while left < sequence.count-1{
        if k < sum{
            sum -= sequence[left]
            left += 1
        }
        
        else if k > sum{
            if right < sequence.count-1{
                right += 1
                sum += sequence[right]
            }else{
                sum -= sequence[left]
                left += 1
            }
        }
        
        if k == sum {
            if result.isEmpty{
                result = [left,right]
            }
            else{
                if result[1] - result[0] > right - left{
                    result = [left,right]
                }else{
                    sum -= sequence[left]
                    left += 1
                }
            }
            if right < sequence.count-1{
                right += 1
                sum += sequence[right]
            }
        }
    }
    
    return result
}