알고리즘/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();
    }
}