# 문제
간단하게 말하면 중복값을 제거한 후 나머지 유니크한 값을 리턴해주는 함수를 만드는 것이다.
예를 들어
A[0] = 9 A[1] = 3 A[2] = 9
A[3] = 3 A[4] = 9 A[5] = 7
A[6] = 9
위와 같은 배열이 들어오면
인덱스 0, 2가 9의 값으로 중복이므로 삭제
인덱스 1, 3가 3의 값으로 중복이므로 삭제
인덱스 4, 6가 9의 값으로 중복이므로 삭제
나머지 7의 값이 유니크 값이므로 7을 리턴해 줌
이런식으로 소스코드를 구현해 주면 된다.
# 초기 소스코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public int solution(int[] A) { int index = 0; String ValueTxt = ""; // 배열의 값을 저장하는 변수 String Separator = ";;"; // 문자열 구분자 for(int i = 0; i < A.length; i++){ if(ValueTxt.indexOf(Integer.toString(A[i]) + Separator) >= 0){ // 값이 존재하는 경우 문자열에서 값 삭제 ValueTxt = ValueTxt.replace(Integer.toString(A[i]) + Separator, ""); }else{ // 값이 존재하지 않는경우 구분자와 함께 값 추가 ValueTxt += Integer.toString(A[i]) + Separator; } } // 구분자 삭제후 정수로 변경 return Integer.parseInt(ValueTxt.replace(Separator, "")); } } | cs |
처음 문제를 받고 풀 때 소스코드다.
하지만 이렇게 풀게 되면 시간복잡도에서 문제가 생기고
배열이 string 할당 공간보다 넘어가는 경우 오류가 발생한다.
그래서 좀더 최적화된 소스코드를 찾아보니 아래와 같은 코드를 발견했다.
# 최적 소스 코드
1 2 3 4 5 6 7 8 9 10 11 12 | class Solution { public int solution(int[] A) { int result = 0; for(int i = 0; i < A.length; i++){ // XOR 비트 연산자로 중복값 삭제 result = result ^ A[i]; } return result; } } | cs |
나는 위 소스를 보고 놀라움을 느꼈다.
학부 시절 비트연산자를 배울 때 그렇게 중요하다고 못느꼈다.
하지만 이번에 알고리즘을 공부하다 보니
비트연산자의 중요성을 알게 되었다.
# 마무리
위 포스트는 제가 직접 제작한 것 입니다.
그렇기 때문에 틀린점이나 설명이 엉성한 점이 존재할 수 있습니다.
만약 틀린점이나 설명이 엉성한 부분이 존재하면 댓글로 알려주세요.
빠른 처리 하도록 하겠습니다.
티스토리 앱으로는 댓글 이용이 불가능 하므로 웹 브라우저로 봐 주세요
(URL : http://junprogramer.tistory.com/)
읽어주셔서 감사합니다.
'잡다한 기술' 카테고리의 다른 글
우아한 형제들 1차 코딩 테스트 (0) | 2018.05.19 |
---|---|
[코딜리티/Codility] CyclicRotation 문제 (0) | 2018.05.18 |
[코딜리티/Codility]이진 갭(Binary Gap) 알고리즘 (0) | 2018.05.15 |
[자바스크립트(javascript)]가장 기본적인 아이디 가져오는 방법 document.getElementById() (0) | 2018.03.28 |
2018년 3월 4주차 주기 (0) | 2018.03.25 |