Link : judge.koreatech.ac.kr/problem.php?id=1007
1. 문제
- 텔동 한쪽에 있는 마을 "짝" 에는 모든 숫자들이 두개씩 쌍을 이루어 존재하고 있습니다. 하지만 어디에도 솔로는 존재하듯, 이곳에도 짝을 이루지 못한 숫자 하나가 있지요. 그나마 다행인건 단 하나의 숫자만 짝이 없을 뿐, 나머지는 짝이 있어요.
짝을 만들어주기 위하여 단 하나만 있는 숫자를 찾아 주세요.
2. 문제의 조건
- 1 <= N <= 100001 인 홀수
- K ∈ singed int
- 반드시 짝이아닌 유일한 정수가 존재함
더보기
3. 문제 접근
- 시간 복잡도
시간 제한 1초에 n의 범위는 100001이므로 O(N^1.6) 이내의 시간안에 풀면 되므로 "O(N log N)의 시간이면 충분하지 않을까?" 하고 생각했습니다.
- 아이디어
정렬이 되어있으면 짝을 판별하기에 편하다고 생각하여 정렬을 진행 하였습니다.
그 후 0번째부터 0과 1이 짝인지 비교하고 짝이라면 2과 3을 비교합니다. 즉, 0 2 4 6 ... n 까지 진행합니다.
1과 2를 비교할 필요 없는 이유는 0과 1이 짝이라면 1과 2는 당연히 짝이 아니기때문에 2씩 뛰어넘습니다.
만약 다르다면 그게 정답이므로 바로 출력하고 IndexOutOfRange 오류가 난다면 그것은 arr[-1] 맨 끝자리가 유일한 정수 이므로 그것을 출력하면 됩니다.
즉, n log n + n / 2 이므로 O(N log N)의 시간으로 해결할 수 있습니다.
4. 풀이 방법
- 데이터를 오름차순으로 정렬한다.
- i = 0부터 len(arr)까지 2씩 증가하며 탐색한다.
- 만약 arr[i]와 arr[i+1]이 다르면 그것이 짝이 아닌 수이다.
- 만약 i가 len(arr) - 1 까지 접근하여 if 의 arr[i+1]가 IndexOutOfRagne 오류가 난다면, 맨 끝 원소가 유일한 수이므로 그것을 출력한다.
5. 소스코드
cjw.git@gmail.com
'알고리즘 > koreatech' 카테고리의 다른 글
1011: 징검다리 (0) | 2020.12.09 |
---|---|
1010: 접두 소수 (0) | 2020.12.09 |
1004: 뒤집어 더하기 (0) | 2020.12.08 |
1003: 0을 만들자 - Small (0) | 2020.12.08 |
1107: 실습시험 연습문제 - 모음 문자 수 (0) | 2020.12.08 |
댓글