Devtraces
개발자취
Devtraces
전체 방문자
오늘
어제
  • 분류 전체보기
    • Baekjoon
    • Programmers

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Queue
  • stack
  • Kakao
  • Set
  • map
  • two pointer
  • floyd-warshall
  • java
  • level4
  • level3
  • 백준
  • greedy
  • prime number
  • math
  • Dijkstra
  • dfs
  • union-find
  • BFS
  • 그리디 알고리즘
  • GCD
  • programmers
  • binary search
  • PriorityQueue
  • recursive
  • DP
  • level2
  • Trie
  • Matrix
  • sort
  • Tree

최근 댓글

최근 글

티스토리

Devtraces
[프로그래머스 Level.2] 스킬트리 (Summer/Winter Coding(~2018)) (Java)
Programmers

[프로그래머스 Level.2] 스킬트리 (Summer/Winter Coding(~2018)) (Java)

2022. 12. 13. 18:21

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/49993

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

코딩테스트 연습 > Summer/Winter Coding(~2018) > 스킬트리

 

 

문제 설명

 

 

선행 스킬이란 어떤 스킬을 배우기 전에 먼저 배워야 하는 스킬을 뜻합니다.

 

예를 들어 선행 스킬 순서가 스파크 → 라이트닝 볼트 → 썬더일때, 썬더를 배우려면 먼저 라이트닝 볼트를 배워야 하고, 라이트닝 볼트를 배우려면 먼저 스파크를 배워야 합니다.

 

위 순서에 없는 다른 스킬(힐링 등)은 순서에 상관없이 배울 수 있습니다. 따라서 스파크 → 힐링 → 라이트닝 볼트 → 썬더와 같은 스킬트리는 가능하지만, 썬더 → 스파크나 라이트닝 볼트 → 스파크 → 힐링 → 썬더와 같은 스킬트리는 불가능합니다.

 

선행 스킬 순서 skill과 유저들이 만든 스킬트리1를 담은 배열 skill_trees가 매개변수로 주어질 때, 가능한 스킬트리 개수를 return 하는 solution 함수를 작성해주세요.

 

 

 

제한 조건
  • 스킬은 알파벳 대문자로 표기하며, 모든 문자열은 알파벳 대문자로만 이루어져 있습니다.
  • 스킬 순서와 스킬트리는 문자열로 표기합니다.
    • 예를 들어, C → B → D 라면 "CBD"로 표기합니다
  • 선행 스킬 순서 skill의 길이는 1 이상 26 이하이며, 스킬은 중복해 주어지지 않습니다.
  • skill_trees는 길이 1 이상 20 이하인 배열입니다.
  • skill_trees의 원소는 스킬을 나타내는 문자열입니다.
    • skill_trees의 원소는 길이가 2 이상 26 이하인 문자열이며, 스킬이 중복해 주어지지 않습니다.

 

 

입출력 예
skil lskill_trees return
"CBD" ["BACDE", "CBADF", "AECB", "BDA"] 2

 

입출력 예 설명
  • "BACDE": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트립니다.
  • "CBADF": 가능한 스킬트리입니다.
  • "AECB": 가능한 스킬트리입니다.
  • "BDA": B 스킬을 배우기 전에 C 스킬을 먼저 배워야 합니다. 불가능한 스킬트리입니다.

 

 

 

 

나의 코드

class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        
        for(int i=0; i<skill_trees.length; i++) {
            StringBuilder sb = new StringBuilder();
            
            for(int j=0; j<skill_trees[i].length(); j++) {
                String str = String.valueOf(skill_trees[i].charAt(j));
                if(skill.contains(str)) {
                    sb.append(str);
                }
            }
            
            for(int j=0; j<=skill.length(); j++) {
                if(skill.substring(0, j).equals(sb.toString())) {
                    answer++;
                    break;
                }
            }
        }
        
        return answer;
    }
}

 

풀이

  1. 문자열을 다루는 문제로 skill_trees 배열을 for문을 돌면서 각각 확인해야 한다.
  2. 순서에 주어지지 않은 알파벳(스킬)은 상관 없으므로 StringBuilder 객체 sb를 하나 생성하고 skill 순서에 주어진 알파벳만 append 한다.
  3. 이렇게 되면 스킬 순서에 있는 알파벳으로만 되어있거나 원래 스킬순서와 상관없던 알파벳(스킬)으로만 되어있어서 append 시킨게 하나도 없는 sb 둘 중 하나가 된다. 예를들면 아래의 경우처럼 된다.
    1. skill="ABC" , skill_trees[i]="AECB"  ==> sb="ACB"
    2. skill="ABC" , skill_trees[i]="EF" ==> sb=""  (공백)
  4. 그리고 이렇게 나온 sb가 skill 순서에 맞게 되어있는지 확인하면 된다.
  5. 처음에 skill.contains(sb.toString())으로 하여 확인을 했는데 이렇게 되면 선행스킬을 배우지 않고 뒤의 알파벳만 배워도 가능한 경우로 체크하기 때문에 결국 다시 skill 순서를 for문을 돌리면서 substring을 이용하여 처음부터 해당 index까지 잘랐을 때 포함하는지를 확인해야 한다. sb가 공백인 경우도 있기 때문에 substring(0, 0)까지 포함시켜서 확인해야 한다.

 

 

 

 

'Programmers' 카테고리의 다른 글

[프로그래머스 Level.2] 타겟 넘버 (깊이/너비 우선 탐색(DFS/BFS)) (Java)  (0) 2022.12.14
[프로그래머스 Level.2] 피로도 (완전탐색) (Java)  (0) 2022.12.13
[프로그래머스 Level.2] 위장 (해시) (Java)  (0) 2022.12.13
[프로그래머스 Level.2] 튜플 (2019 카카오 개발자 겨울 인턴십) (Java)  (0) 2022.12.13
[프로그래머스 Level.2] 예상 대진표 (2017 팁스타운) (Java)  (0) 2022.12.13
    'Programmers' 카테고리의 다른 글
    • [프로그래머스 Level.2] 타겟 넘버 (깊이/너비 우선 탐색(DFS/BFS)) (Java)
    • [프로그래머스 Level.2] 피로도 (완전탐색) (Java)
    • [프로그래머스 Level.2] 위장 (해시) (Java)
    • [프로그래머스 Level.2] 튜플 (2019 카카오 개발자 겨울 인턴십) (Java)
    Devtraces
    Devtraces

    티스토리툴바