본문 바로가기
CodeSignal

firstDuplicate

by Doromi 2023. 11. 17.
728x90
반응형
 배열 a에 있는 숫자 중에서 두 번 이상 나타난 숫자 중에서, 두 번째 등장한 순서의 인덱스가 최소인 숫자를 찾는 문제입니다.

예를 들어, 주어진 배열이 [2, 1, 3, 5, 3, 2]인 경우:

2는 두 번 등장했지만 두 번째 등장한 2의 인덱스는 5이므로 고려하지 않습니다.
1은 한 번만 등장하므로 고려하지 않습니다.
3은 두 번 등장하고, 두 번째 등장한 3의 인덱스는 4입니다.
5는 한 번만 등장하므로 고려하지 않습니다.
따라서 이 경우에는 3이 문제의 답이 됩니다.

각 경우에 대해 어떤 숫자가 두 번 이상 나타났고, 그 중 두 번째 등장한 인덱스가 최소인지 확인하면서 답을 찾을 수 있습니다. 만약 그러한 숫자가 없다면 -1을 반환합니다.

 

int solution(int[] a) {
    Dictionary<int,int> dic = new Dictionary<int,int>();
    Dictionary<int,int> count = new Dictionary<int,int>();
    for(int k = 0;k<a.Length;k++){
        if(count.ContainsKey(a[k]) && count[a[k]]==1){
            dic[a[k]] = k;
            count[a[k]]++;
        }
        else if(!count.ContainsKey(a[k])){
             dic[a[k]] = k;
            count[a[k]]=1;
        }
    }
    Array.Sort(a);
    int maxIdx = 100001;
    int ret = -1;
    for(int i = 0;i<a.Length-1;i++){
        if(a[i] == a[i+1]){
            if(maxIdx > dic[a[i]]){
                maxIdx = dic[a[i]];
                ret = a[i];
            }
        }
    }
    return ret;
}
주어진 배열 a에서 두 번 이상 등장한 숫자 중에서, 두 번째 등장한 순서의 인덱스가 최소인 숫자를 찾는 함수를 구현한 것입니다. 코드는 다음과 같은 단계로 동작합니다:

dic: 숫자가 처음 등장한 인덱스를 저장하는 Dictionary입니다.
count: 각 숫자가 몇 번 등장했는지를 저장하는 Dictionary입니다.
배열 a를 순회하면서 각 숫자에 대한 처리를 수행합니다.
만약 count에 해당 숫자가 이미 등장했고, 그 숫자가 한 번 등장했다면(count[a[k]]==1), 해당 숫자의 등장한 인덱스를 dic에 저장하고, count를 증가시킵니다.
만약 count에 해당 숫자가 등장한 적이 없다면, 해당 숫자의 등장한 인덱스를 dic에 저장하고, count를 1로 초기화합니다.
배열 a를 정렬합니다.

정렬된 배열을 순회하면서 두 번 이상 등장한 숫자 중에서 두 번째 등장한 순서의 인덱스가 최소인 숫자를 찾습니다. 이때, dic에서 해당 숫자의 인덱스를 가져와서 비교합니다.
찾은 숫자를 반환합니다.
이 코드는 배열을 한 번 순회하면서 각 숫자의 등장 인덱스를 기록하고, 그 후에 정렬된 배열을 순회하면서 조건에 맞는 숫자를 찾아 반환합니다. 최종적으로 찾은 숫자가 문제에서 원하는 조건을 만족하는 결과를 반환하는 구조입니다.
728x90
반응형

'CodeSignal' 카테고리의 다른 글

commonCharacterCount  (0) 2023.11.28
All Longest Strings  (0) 2023.11.27
matrixElementsSum  (0) 2023.11.25
Almost Increasing Sequence  (0) 2023.11.25
Make Array Consecutive 2  (0) 2023.11.22