https://school.programmers.co.kr/learn/courses/30/lessons/142086
문자열 s가 주어졌을 때, s의 각 위치마다 자신보다 앞에 나왔으면서, 자신과 가장 가까운 곳에 있는 같은 글자가 어디 있는지 알고 싶습니다.
예를 들어, s="banana"라고 할 때, 각 글자들을 왼쪽부터 오른쪽으로 읽어 나가면서 다음과 같이 진행할 수 있습니다.
따라서 최종 결과물은 [-1, -1, -1, 2, 2, 2]가 됩니다.
문자열 s이 주어질 때, 위와 같이 정의된 연산을 수행하는 함수 solution을 완성해주세요.
s | result |
---|---|
"banana" | [-1, -1, -1, 2, 2, 2] |
"foobar" | [-1, -1, 1, -1, -1, -1] |
import java.util.*;
class Solution {
public int[] solution(String s) {
//문자를 하나씩 넣을 ArrayList 생성
ArrayList<String> list = new ArrayList<>();
//주어진 String을 char 배열로 변환
char[] chars = s.toCharArray();
int[] answer = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
//char 배열의 원소가 list에 포함 여부에 따라 answer 배열에 결과 추가
if (list.contains(String.valueOf(chars[i]))) {
answer[i] = list.size() - list.lastIndexOf(String.valueOf(chars[i]));
} else {
answer[i] = -1;
}
//첫 문자는 무조건 -1 값이 나와야 하므로 for문 마지막에 list에 추가
list.add(String.valueOf(chars[i]));
}
return answer;
}
}
import java.util.*;
class Solution {
public int[] solution(String s) {
int[] answer = new int[s.length()];
HashMap<Character, Integer> map = new HashMap<>();
for(int i = 0; i < s.length(); i++){
char ch = s.charAt(i);
answer[i] = i - map.getOrDefault(ch, i + 1);
map.put(ch, i);
}
return answer;
}
}
나와 다르게 HashMap을 사용하였고
getOrDefault 메서드를 이용해 결과값을 추가하였다.
ArrayList 클래스의 lastIndexOf 메서드를 활용해 쉽게 풀 수 있었다.
추천 수가 높은 풀이에서는 HashMap을 사용하였는데
내가 Map에 익숙치 않아서인지 직관적으로 와닿지는 않는다.
그래도 값이 없으면 따로 반환하는 값을 설정할 수 있는 HashMap 클래스의 getOrDefault 메소드는 유용해 보인다.