https://school.programmers.co.kr/learn/courses/30/lessons/160586
문제 접근
문제를 풀 때 생각해야 될 부분 중에서 여러 키에서 원하는 문자를 만들 수 있을 때 어느 키를 누르는 게 최소 횟수인지 구해야하는데 이 부분에서 시간을 많이 잡아먹어 풀지 못하고 다른 분들의 풀이를 보았다.
이 부분을 제외하면 key와 만드려는 문자들을 하나씩 비교해가며 같을 경우 숫자로 카운팅하여 return, 카운팅 숫자가 0이면 만들 수 없는 문자열이라 -1을 return하는 방식으로 접근하였다.
다른 사람 풀이
1) 내가 접근한 방식과 비슷한 형태로 이 분은 최소 횟수 구하는 부분을 따로 메서드로 만들어서 구하였다.
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
for (int i = 0; i < targets.length; i++) {
int sum = 0;
for (int j = 0; j < targets[i].length(); j++) {
int count = minPress(keymap, targets[i].charAt(j)); // press 메서드는 구하려는 문자를 키를 최소로 눌러서 구한 횟수를 return
if (count == -1) { // press 메서드는 keymap과 targets의 문자들을 하나씩 비교해서 같은 문자가 없으면 -1 return해줌
sum = -1;
break;
}
sum += count; // targets의 한 요소에 있는 문자들의 최소 횟수를 다 구한 뒤 합산
}
answer[i] = sum;
}
return answer;
}
private int minPress(String[] keymap, char c) {
int min = -1;
for (int i = 0; i < keymap.length; i++) {
for (int j = 0; j < keymap[i].length(); j++) {
if (keymap[i].charAt(j) == c) {
if (min == -1) { // 구하려는 문자와 처음으로 같은 문자를 찾았을 경우
min = j+1;
}
else if (min > j) { // 같은 문자라도 최소 횟수를 위해서 더 앞에 있는 문자의 순서 저장
// min > j+1이 아닌 이유 → j+1과 비교하면 바로 다음 순서에 오는 같은 문자는 연산을 못함
min = j+1;
}
break; // 만드려는 한 문자의 최소 횟수 구했으니 다음 문자로
}
}
}
return min;
}
}
2) indexOf() 메서드가 원하는 인덱스의 위치를 찾아주고 원하는 인덱스가 없으면 -1 return 해주는 기능이라 이 문제에 유용하다 느껴졌다.
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
Set<String> set = new HashSet<>(Arrays.asList(keymap)); // keymap 배열을 List로 변경한 걸 초기값으로 삽입
set.remove(""); // 뭘까.. 없어도 정답인데 제출할 때 지우는 걸 깜빡한건가?
for (int i = 0; i < targets.length; i++) { // targets
for (int l = 0; l < targets[i].length(); l++) { // char
int k = 101; // 키의 원소의 길이가 100이하라 101로 잡은 듯?
for (String j : set) { // set
int index = j.indexOf(targets[i].charAt(l)); // indexOf()는 문자열에서 특정 인덱스를 찾는 메서드, 못찾으면 -1 반환
// 만들 수 있는 문자열인지 쉽게 확인 가능
// indexOf()는 앞에서 부터 탐색, lastIndexof()는 뒤에서 부터 탐색
if (index == -1) continue;
else if (index < k) k = index; // 같은 문자가 나왔을 경우 k에 저장해둔 값과 비교하여 더 빠른 순서의 문자를 저장
}
if (k == 101) { // 101일 경우 만들 수 없는 문자열이라 -1 저장
answer[i] = -1;
break;
}
else answer[i] += (k + 1); // 만들 수 있는 문자일 경우 배열의 한 요소에 k값들 저장
}
}
return answer;
}
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / 바탕화면 정리 / JAVA] (0) | 2023.03.06 |
---|---|
[프로그래머스 / 두 개 뽑아서 더하기 / JAVA] (0) | 2023.03.04 |
[프로그래머스 / 로또의 최고 순위와 최저 순위 / JAVA] (0) | 2023.02.25 |
[프로그래머스 / 카드 뭉치 / JAVA] (0) | 2023.02.22 |
[프로그래머스 / 신고 결과 받기 / JAVA] (0) | 2023.02.16 |
댓글