컴퓨터/프로그래머스

프로그래머스 - 49993번: 스킬트리 [Java]

이상한 나그네 2023. 11. 6. 00:36

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int solution(String skill, String[] skill_trees) {
        int answer = 0;
        for(String s : skill_trees) {
            Map <Character, Integer> map = new HashMap<>();
            for(int i = 0; i < s.length(); i++)
                map.put(s.charAt(i), i + 1);

            Stack <Integer> stack = new Stack<>();
            for(int i = 0; i < skill.length(); i++) {
                if(map.containsKey(skill.charAt(i)))
                    stack.push(map.get(skill.charAt(i)));
                else
                    stack.push(0);
            }
            while(!stack.isEmpty() && stack.peek() == 0)
                stack.pop();
            int n = 0;
            if(!stack.isEmpty())
                n = stack.pop();

            while(!stack.isEmpty()) {
                if(n <= stack.peek() || stack.peek() == 0)
                    break;
                else
                    n = stack.pop();
            }
            if(stack.isEmpty())
                answer++;
        }
        return answer;
    }
}

2. 설명

int answer = 0;
for(String s : skill_trees) {
    Map <Character, Integer> map = new HashMap<>();
    for(int i = 0; i < s.length(); i++)
        map.put(s.charAt(i), i + 1);

for-each문을 통해서 skill_trees를 하나씩 접근합니다. 그리고 문자열 s에서의 각 문자에 대한 인덱스 값을 HashMap에 저장합니다.

    Stack <Integer> stack = new Stack<>();
    for(int i = 0; i < skill.length(); i++) {
        if(map.containsKey(skill.charAt(i)))
            stack.push(map.get(skill.charAt(i)));
        else
            stack.push(0);
    }

반복문을 통해서 스택에 skill의 각 문자가 skill_trees의 인덱스 값을 HashMap의 값을 이용하여 push 합니다. 만약 HashMap에 존재하지 않으면 0을 push 해줍니다.

    while(!stack.isEmpty() && stack.peek() == 0)
        stack.pop();
    int n = 0;
    if(!stack.isEmpty())
        n = stack.pop();

스택이 비어있지 않고 stack의 peek 값이 0이라면 pop을 하여 0을 제거합니다. 그리고 만약 stack이 비어있지 않으면 n에 stack값을 pop 해줍니다.

    while(!stack.isEmpty()) {
        if(n <= stack.peek() || stack.peek() == 0)
            break;
        else
            n = stack.pop();
    }
    if(stack.isEmpty())
        answer++;

스택이 비어질 때까지 반복해 주는데 만약 스택의 peek 값이 n보다 크거나 stack의 값이 0이라면 반복문을 종료합니다. 그 이유는 스킬 트리가 지켜지지 않았다는 것을 의미하기 때문입니다.

만약 아니라면 n에 stack의 값을 pop 해주며 진행됩니다. 그리고 이 모든 과정이 마치고 스택이 비어있다면 answer를 추가해 줍니다.

3. 정리

  • 스택이 비어있는지 확인만 잘한다면 쉽게 해결 가능하다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges