알고리즘/PROGRAMMERS
대충 만든 자판(Lv.1)
현대타운301
2024. 4. 11. 17:48
문제 설명
입출력 예시
요약
주어진 keymap의 문자열에 들어있는 문자들을 최대한 적게 눌러서 targets에 있는 단어 만들기
풀이
접근 방식
1. targets의 문자열을 이루고 있는 문자를 하나씩 keymap에서 조사
→ .indexOf() 메소드로 주어진 keymap을 모두 조사해 최소값을 찾는다.
2. keymap에 없는 문자를 포함하는 경우 -1을 return
→ 스트림의 최종 처리 기능인 .orElse() 메소드를 통해 -1을 리턴
코드리뷰
import java.util.*;
public class Solution {
public int[] solution(String[] keymap, String[] targets) {
List<Integer> list = new ArrayList<>();
for(int i = 0; i < targets.length; i++) {
int min = 0;
int index = 0;
for(int j = 0; j < targets[i].length(); j++) {
char c = targets[i].charAt(j); // targets의 첫 번째 문자열의 첫 번째 문자부터 조사 시작
index = Arrays.stream(keymap) // keymap으로 스트림 생성
.mapToInt(s -> s.indexOf(c)) // String -> int 형변환
.filter(s -> s >= 0) // indexOf()의 결과가 0 이상인 경우만 필터링
.min() // 필터링된 스트림을 순회하며 최소값 찾기
.orElse(-1); // .min()은 Optional 타입이기 때문에 .orElse()를 통해 못 찾는 경우 -1로 고정
min += index + 1; // index는 0부터 시작하기 때문에 +1
if(index == -1) break; // 만들지 못하는 문자열의 경우 break
}
if(index == -1) list.add(-1); // 만들 수 없는 문자열의 경우 -1 저장
else list.add(min); // 만들 수 있으면 최소값 저장
}
return list.stream().mapToInt(s -> s).toArray();
}
}