Leetcode Java Pyramid Transition Matrix
업데이트:
문제
코드
class Solution {
public boolean pyramidTransition(String bottom, List<String> allowed) {
Map<String, List<Character>> map = new HashMap<>();
for (String s : allowed) {
String key = s.substring(0, 2);
map.putIfAbsent(key, new ArrayList<>());
map.get(key).add(s.charAt(2));
}
return this.dfs(map, bottom + "&", new HashSet<>());
}
private boolean dfs(Map<String, List<Character>> map, String s, Set<String> set) {
if (s.length() == 1) {
return true;
}
if (set.contains(s)) {
return false;
}
String prefix = s.substring(0, 2);
if (prefix.charAt(1) == '&') {
return this.dfs(map, s.substring(2) + '&', set);
}
for (char c : map.getOrDefault(prefix, new ArrayList<>())) {
if (this.dfs(map, s.substring(1) + c, set)) {
return true;
}
}
set.add(s);
return false;
}
}
결과
설명
- 가장 밑 바닥이 bottom으로 시작하는 피라미드를 allowed 내 삼각형을 이용하여 완성 가능한지 검증하는 문제이다.
- allowed[i] = “ABC”인 경우, 좌측의 “A”와 우측의 “B” 블록 위에 “C” 블록이 있는 삼각형을 나타낸다.
-
삼각형의 패턴을 저장할 map을 HashMap으로 초기화 하고, allowed의 모든 값을 이용하여 앞의 두 문자가 키이고 삼각형의 윗 블록인 마지막 문자가 값으로 넣어준다.
-
4번에서 정의한 dfs(Map<String, List
> map, String s, Set set) 메서드에 위의 map과 bottom에 피라미드 층간 구분 기호인 '&', 새 HashMap을 이용하여 수행한 결과를 주어진 문제의 결과로 반환한다. - DFS 방식으로 피라미드가 완성 가능한지 검증하기 위한 dfs(Map<String, List
> map, String s, Set set) 메서드를 정의한다. - s의 길이가 1인 경우, 구분 기호인 ‘&’인 경우이므로 true를 반환한다.
- set에 s가 포함된 경우, 이미 포함되지 않는 것으로 검증된 패턴이므로 false를 반환한다.
- prefix에 s의 앞 두 문자열을 넣어준다.
- prefix의 두 번째 문자가 구분 기호인 ‘&’인 경우, s의 앞 두 문자를 제거하고 ‘&’ 구분 문자를 붙여 재귀 호출한 겨로가를 반환한다.
- map의 prefix의 값을 가져와 c에 각각 넣어 아래를 반복한다.
- s의 첫 문자를 제거하고 c를 붙여 재귀 호출한 결과가 true인 경우, 피라미드에 포함되는 문자열 이므로 true를 반환한다.
- 위의 수행에 포함되지 않으면 s를 set에 넣어 피라미드에 포함되지 않는 문자열임을 저장한 후, false를 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기