중복 문자를 제거하는 방법 또한 수없이 많다.
Stream 클래스의 distinct, LinkedHashSet를 만들어 add를 하고 출력 등 갖가지 방법이 있으나
오늘은 indexOf를 이용한 풀이를 진행한다.
처음 문제를 봤을때는 String class의 replace를 이용한 풀이법을 생각했으나 쉽지 않았다.
그래서 푼 방법이 LinkedHashSet를 이용해 진행하였다.
중복 제거와 순서 저장 모두를 사용해야 하기 때문이다.
또한 이전에 포스팅했듯, String에 적재하는 방식은 스트링 풀에 계속 새로운 스트링 객체를 생성하기 때문에
메모리적으로도 좋지 않을것이라고 생각했다.
LinkedHashSet을 이용해 charAt를 저장하고, 나중에 한꺼번에 join으로 합쳤다.
조금 더 생각해보면, 훨씬 간편하면서도 나이브하게 문제를 풀 수 있다.
바로 indexOf를 사용하는 것이다.
예를 들어 apple이라는 글자가 있을때 i번째 인덱스와 charAt(i)의 인덱스는 다음과 같다
a | p | p | l | e | |
i | 0 | 1 | 2 | 3 | 4 |
indexOf(charAt(i)) | 0 | 1 | 1 | 3 | 4 |
indexOf는 가장 처음의 인덱스만 반환하기때문에 apple의 두번째 p부터는 p의 인덱스로 1을 가져가고,
이를 이용해 중복을 제거할 수 있다.
속도 또한 밑의 방식이 조금 더 빠르게 나온다.
'알고리즘 > 기타' 카테고리의 다른 글
Two pointers (0) | 2023.04.25 |
---|---|
[JAVA]지뢰 찾기 - 델타 배열을 이용한 방법 (0) | 2023.02.02 |
소수 찾기 - 외부 메서드 없이 탐색 (0) | 2023.02.02 |
문자열 전부뒤집기 - StringBuilder, toCharArray() (0) | 2023.01.27 |