👀 문제
https://programmers.co.kr/learn/courses/30/lessons/49993
👊 도전
1. 설계
- skill의 각 문자를 K, 인덱스를 V로 하여 해시맵에 넣는다.
- 해시맵을 이용해 스킬트리의 문자가 스킬이라면 value(인덱스)를 확인하여 순서대로 진행되는지 본다.
2. 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
/**
*
* @author HEESOO
*
*/
class Solution {
public int solution(String skill, String[] skill_trees) {
int answer = 0;
HashMap<Character, Integer> map=new HashMap<>();
for(int i=0;i<skill.length();i++){ // 해시맵에 스킬과 인덱스 저장
map.put(skill.charAt(i), i);
}
for(String s:skill_trees){
int n=s.length();
int idx=0; // 학습해야 할 스킬 인덱스
boolean flag=true;
for(int i=0;i<n;i++){
int val=map.getOrDefault(s.charAt(i), -1);
if(val==-1) continue; // 해당 문자가 스킬이 아니면 패스
// 스킬일 경우
if(idx==val) idx++; // 학습할 스킬이라면 학습
else { // 아니라면 잘못된 문자열이므로 break
flag=false;
break;
}
}
if(flag) answer++;
}
return answer;
}
}
3. 결과
🤟 성공 🤟
4. 설명
- 해시맵에 스킬의 순서를 저장한다
- K: 스킬 문자, V: 인덱스(스킬 순서)
- 인덱스 순서대로 스킬이 진행된다는 뜻이다.
- 스킬 문자를 숫자로 치환해줬다고 생각하면 쉽다.
- 스킬트리의 문자를 하나씩 확인한다
- idx는 배워야 할 스킬 단어를 뜻한다.
- val은 map에서 i번째 문자열의 인덱스를 가져온다. map에 없다면 -1을 반환한다.
- i번째 문자가 map에 없다면(-1) 배울 수 있는 문자이므로 continue
- map에 존재한다면 idx를 체크하여 스킬 순서에 맞는지 확인해야 한다.
- idx==val이면 스킬 학습이 가능하므로 idx++하여 다음 배워야 할 스킬을 가리키도록 한다.
- idx!=val이라면 idx 뒤의 문자를 가지고 온 것이므로 flag를 통해 잘못된 스킬트리임을 표시하고 break한다.
- for문 탈출 후 flag가 true여야 가능한 스킬트리라는 뜻이므로 answer++한다.