본문 바로가기
🐣 알고리즘

[부스트캠프 - Q1] Swift - 함수구현

by @Eddy 2023. 6. 3.
728x90

https://blog.naver.com/boostcamp_official/223085597916

 

[8기 모집] 코딩테스트 유형을 공유합니다.

안녕하세요, 부스트캠프입니다. 부스트캠프 웹・모바일 8기 모집일정이 공개되었습니다. 2023.5.2(화) - 6....

blog.naver.com

 

네이버 부스트캠프에 있는 문제를 풀어봤다.

 

풀이1

func solution1(_ arr: [Int]) -> [Int] {
    var result = [Int]()
    
    // 배열에 요소가 1개이면 중복이 없음.
    if arr.count > 1 {
        let arr = arr.sorted()
        var count = 1

        for i in 1..<arr.count {
            // 이전 배열과 같으면 count + 1
            if arr[i-1] == arr[i] {
                count += 1
            } else {
                // 이전 배열과 다르면 count 초기화
                count = 1
            }

            result.append(count)
        }

        // 중복횟수 외에는 1로 초기화
        for j in 1..<result.count {
            if result[j-1] < result[j] {
                result[j-1] = 1
            }
        }

        // 중복횟수로만 재배열
        result = result.filter { $0 != 1 }
    }
    return result.count > 0 ? result : [-1]
}

Dictionary보다 Array가 익숙해서 Array를 활용해 풀었다.

arr의 element의 전후 비교를 통해 중복횟수를 count하고

중복된 값만 재배열하여 값을 출력했다.

 

아래 풀이는 for문을 1번만 사용하고 싶어서 조금 수정해봤는데, (사실 filter에도 for문이 있는것과 같기에 3번에서 2번으로 줄인 것)

풀이2

func solution2(_ arr: [Int]) -> [Int] {
    var result = [Int]()

    if arr.count > 1 {
        let arr = arr.sorted()
        var count = 1

        for i in 1..<arr.count {
            if arr[i-1] == arr[i] {
                count += 1

                if i == (arr.index(before: arr.endIndex)) {
                    result.append(count)
                }
            } else {
                if count > 1 {
                    result.append(count)
                }

                count = 1
            }
        }

        result = result.filter { $0 != 1 }
    }

    return result.count > 0 ? result : [-1]
}

 

순서에 상관없다고 생각하면, 아래와 같은 풀이가 가능하다.

결과값이 어떤 순서로 정렬되어야한다는 조건이 없어 조금 모호한 감이 있다.

예제에서는 작은 수부터 큰수로 정렬된 것으로 보이지만, 수의 크기와 상관없이 동시에 등장한 값 순서로 정렬되었다고 해석할 여지가 있다.

풀이3

func solution3(_ arr: [Int]) -> [Int] {
    var dict = [Int: Int]()

    for n in arr {
        if dict[n] != nil {
            dict[n]! += 1
        } else {
            dict[n] = 1
        }
    }

    return dict.values.filter{$0 != 1}
}

 

속도로만 따졌을 때는 3번 풀이가 가장 빠를 것이다.

array를 인덱스로 접근하게 되면 속도는 O(k)일테지만, dictionary는 Key값으로 접근하기에 O(1)이기 때문이다.

또 메모리관점에서도 큰 차이는 없겠지만 3번풀이가 가장 효율적이다.

반응형

댓글