0_ch4n
기계쟁이\n개발자
0_ch4n
0chn.xxx@gmail.com @0ch._.n
전체 방문자
오늘
어제

공지사항

  • All (282)
    • 🖥 CS (21)
      • 네트워크 (12)
      • 운영체제 (3)
      • 자료구조 (2)
      • Web (4)
    • 🧠 Algorithm (185)
      • [C] BOJ (93)
      • [JAVA] Programmers (91)
    • 📚 Study (69)
      • HTML&CSS (19)
      • MySQL (11)
      • JAVA (22)
      • Servlet&JSP (8)
      • Thymeleaf (2)
      • Spring (5)
      • JPA (2)
    • 📖 Book (1)
    • 📃 Certification (6)
      • 정보처리기사 (6)

인기 글

최근 글

최근 댓글

태그

  • java
  • 자바
  • kakao
  • 코딩테스트
  • Programmers
  • til
  • 프로그래머스
  • 코테
  • 카카오
  • CSS

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
0_ch4n

기계쟁이\n개발자

[49993번] 스킬트리
🧠 Algorithm/[JAVA] Programmers

[49993번] 스킬트리

2022. 6. 24. 15:09
반응형

Summer/Winter Coding (~2018)

 

✔️ 문제 설명

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

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

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

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

 

더보기

✔️ 입출력 예

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

 

✔️ 제한 조건

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

 

✔️ 코드 구상

skill은 꼭 지켜야하는 순서고 skill_trees에서 순서만 체크해주면 되는 문제같다.

예외처리가 좀 까다로울거 같은데..

  1. skill에 없는 것만으로 찍는 경우 순서를 지킬 필요가 없으니 정답으로 간주
  2. skill에 맨 처음만 찍고 다른걸로만 찍는 경우 순서를 지킬 필요가 없으니 정답으로 간주

나머지는 순서만 체크하면 될 것 같다.

우리가 필요한건 skill_tree 내의 skill의 순서와 존재 유무이기 때문에 stream의 filter, map으로

skill에 포함된 것 중 존재하는 것만 filter하고 filter된 요소가 skill에서의 위치로 다시 mapping한 후

그 중 인덱스 순서가 안맞는 것들만 오답처리하면 될 것이다.

 

✔️ 코드

import java.util.*;

public class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;

        for(String skill_tree : skill_trees) {
            int check = 0;
            int[] index = Arrays.stream(skill_tree.split(""))
                    .filter(skill::contains).map(skill::indexOf)
                    .mapToInt(Integer::intValue)
                    .toArray();

            for(int i = 0; i < index.length; i++) {
                if(i != index[i]) {
                    check = 1;
                    break;
                }
            }

            if(check != 1) {
                answer++;
            }
        }

        return answer;
    }
}

 

📄 원문

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

반응형
저작자표시 (새창열림)

'🧠 Algorithm > [JAVA] Programmers' 카테고리의 다른 글

[17680번] 캐시  (0) 2022.06.26
[42586번] 기능개발  (0) 2022.06.25
[72412번] 순위 검색  (0) 2022.06.23
[17679번] 프렌즈4블록  (0) 2022.06.22
[92341번] 주차 요금 계산  (0) 2022.06.21
    0_ch4n
    0_ch4n
    while(true) { study(); }

    티스토리툴바