하루를살자

2022 부스트캠프 자가진단 함수구현 문제 본문

Algorithm Practices

2022 부스트캠프 자가진단 함수구현 문제

Kai1996 2022. 6. 13. 02:46

문제

자연수가 들어있는 배열 arr가 매개변수로 주어집니다. 배열 arr안의 숫자들 중에서 앞에 있는 숫자들부터 뒤에 중복되어 나타나는 숫자들 중복 횟수를 계산해서 배열로 return 하도록 solution 함수를 완성해주세요. 만약 중복되는 숫자가 없다면 배열에 -1을 채워서 return 하세요.

▶입출력 예 #1

arr = [1, 2, 3, 3, 3, 3, 4, 4]에서 3은 4번, 4는 2번씩 나타나므로 [4, 2]를 반환합니다.

▶입출력 예 #2

arr = [3, 2, 4, 4, 2, 5, 2, 5, 5]이면 2가 3회, 4가 2회, 5가 3회 나타나므로 [3, 2, 3]를 반환합니다.

▶입출력 예 #3

[3, 5, 7, 9, 1]에서 중복해서 나타나는 숫자는 없으므로 [-1]을 반환합니다.

##### 제한사항

- 배열 arr의 길이는 1 이상 100 이하의 자연수입니다.

- 배열 arr의 원소는 1 이상 100 이하의 자연수입니다.

문제 요약

  • 주어진 배열에 중복된 요소가 있다면 그 요소가 얼마나 많이 불렸는지 카운트 하고, 중복된 숫자들를 카운트한 갯수를 반환하는 함수를 만들어라.
  • 이때 중복된 요소 순서대로 카운트 값을 반환해야한다.

문제 공략

자료구조

  • 시간복잡도를 낮추려면 딕셔너리를 사용해서 사용하는게 좋을것같다.
  • 주어진 배열의 순서를 기억하기 위한 방법을 찾아야할것같다.

접근방식

  • 주어진 array 를 돌면서 valueIdentifingDict value 값이 있는지 체크해준다.

    • 체크해주는 것으로, 배열에 중복된 요소가 있는지 없는지 체크할수있다.
    • 중복된 요소가 없다면 valueIdentifingDict 의 값으로 배열의 인덱스를 지정해준다.
    • 중복된 요소가 있다면, result 배열에 중복된 요소의 인덱스를 에 +1 해준다.
  • 주어진 배열에 크기와 같은 result 배열을 초기값을 1로 가진채로 만든다. (중복 숫자는 카운트는 숫자한개 부터 1로 시작하기때문)

  • 마지막으로 result 중 1이상이 요소들만 걸러내는 filter 작업을거치고, 빈 배열일시 [-1] 리턴.

func getDuplicatedOccurrence(arr: [Int]) -> [Int] {
   var valueIdentifingDict:[Int: Int] = [:]
   var result : [Int] = Array(repeating: 1, count: arr.count)

    for (index, value) in arr.enumerated() {
        if valueIdentifingDict[value] == nil {
            valueIdentifingDict[value] = index
        }else{
            result[countDict[value]!] += 1
        }
    }

    return result.filter({$0 > 1}).isEmpty ? [-1] : result.filter({$0 > 1})
}
Comments