▼ Why ?
일단 해시함수를 사용하는 것에 익숙해지기 위해 관련 문제를 계속 풀어보려고 한다
▼ 한 번 사용한 최초 문자
문제 정보
- 문자열에서 한번만 사용한 문자를 찾으려고 합니다.
- 매개변수 s에 문자열이 주어지면 한번만 사용한 문자 중 문자열에서 가장 먼저 나타난 문자의 인덱스 번호를 반환하는 프로그램을 작성하세요.
- 인덱스는 1부터 시작합니다.
- 한번만 사용한 문자가 없을 경우 -1를 반환하세요.
입출력 예
제한사항
- 문자열 s의 길이는 100을 넘지 않습니다.
- 문자열은 소문자로만 이루어져 있습니다.
어떻게 해결해야 할까?
- 일단 입력받은 문자열에서 ' charAt(int index) ' 메서드로 하나씩 꺼낸 문자를 키(key)로 받고, 해당 문자의 개수를 값(value)로 받을 HashMap class의 객체를 생성한다
- 객체에 값을 넣을 때 ' getOrDefault() ' 메서드를 이용하자
- 그리고 ' keySet() ' 메서드로 생성한 HashMap 객체에 저장돼있는 키(key)들을 하나씩 꺼내 값(value)이 1인 키(key)가 있는지 체크한다
- 단, 한 번만 사용한 문자들 중 문자열에서 가장 앞에 있는 문자의 인덱스 번호를 찾아야 하기 때문에, 값(value)가 1인 키(key) 발견하자마자 탐색을 멈추도록 한다
- 해당 키(key) 값을 char형 변수 ' oneCh ' 에 저장하고 입력받은 문자열에서 처음부터 탐색하고 해당 문자(key)의 위치를 찾아 반환하거나, char형 변수에 저장된 값이 없다면 '-1'을 반환하도록 한다
해결 코드
import java.util.*;
public class Solution {
public int solution(String s){
HashMap<Character, Integer> characters = new HashMap<>();
for(char ch : s.toCharArray()) {
characters.put(ch, characters.getOrDefault(ch, 0) + 1);
}
char oneCh = ' ';
int index = 0;
for(char key : characters.keySet()) {
if(characters.get(key) == 1 ) {
firstCh = key;
break;
}
}
if(oneCh != ' ') {
for(char ch : s.toCharArray()) {
index++;
if(ch == firstCh) break;
}
} else if(index == 0) index = -1;
return index;
}
}
▼ 정리
- 이번 문제도 쉬운 난이도의 문제였지만, getOrDefault() 메서드를 활용하여 더 쉽게 해결할 수 있었다
- HashMap과 관련한 문제들을 해결하기 위해선, 이처럼 ' toCharArray() ' 메서드를 이용하여 문자열에서 문자를 하나씩 꺼내 체크하는 방식에 익숙해지면 좋을 것 같다