[프로그래머스] 스킬트리(49993)

lhs's avatar
Nov 26, 2024
[프로그래머스] 스킬트리(49993)
 

1. 문제 풀이 아이디어

  • 스킬트리의 문자들을 스킬에서 찾아 알맞은 순서인지 확인하면 문제를 해결할 수 있다.

2. 나의 정답 코드

class Solution { public int solution(String skill, String[] skill_trees) { int answer = skill_trees.length; for (int i = 0; i < skill_trees.length; i++) { int cur = 0; for (char c : skill_trees[i].toCharArray()) { int index = skill.indexOf(c); if (index == -1) continue; if (index != cur) { answer--; break; } cur++; } } return answer; } }

3. 정리

  • 모든 스킬트리가 유효하다고 가정하고, answerskill_trees의 크기로 초기화한다.
  • 각 스킬트리를 순회할 때 현재 스킬 순서를 나타내는 변수 cur0으로 초기화한다.
  • skill_trees[i]의 각 문자를 하나씩 가져와 skill에서 해당 문자의 위치를 index에 저장한다.
  • index1이면, 해당 문자가 skill에 포함되지 않은 것이므로 다음 문자로 넘어간다.
  • indexcur와 다르면 올바른 순서가 아니므로 answer를 감소시키고 반복을 종료한다.
  • indexcur와 같으면 올바른 순서이므로 cur를 증가시킨다.

4. 더 좋은 코드 리뷰

class Solution { public static int solution(String skill, String[] skill_trees) { String regex = "[^" + skill + "]"; return (int) Arrays.stream(skill_trees) .filter(tree -> skill.startsWith(tree.replaceAll(regex, ""))).count(); } }
  • 스킬 문자열(skill)에 포함되지 않은 문자들을 제외하기 위해 정규 표현식을 생성하고, 이를 regex에 저장한다.
  • skill_trees 배열에서 stream을 사용하여 각 스킬트리를 순회하며, replaceAll 메서드로 regex에 해당하는 문자를 제거하여 skill에 포함된 문자만 남긴다.
  • 남은 문자열이 skill의 시작 문자열(skill.startsWith(...))과 일치하는 경우만 필터링하여, 조건에 맞는 스킬트리의 개수를 카운트하고 결과로 반환한다.
 
Share article

LHS's Study Space