본문 바로가기

컴퓨터/프로그래머스

프로그래머스 - 12981번: 영어 끝말잇기 [Java]

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

 

프로그래머스

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

programmers.co.kr

1. 코드

import java.util.*;
class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        Stack <String> s = new Stack<>();
        for(int i = 0; i < words.length; i++) {
            if(i % n == 0) answer[1]++;
            
            if(s.isEmpty()) s.push(words[i]);
            else if(s.indexOf(words[i]) != -1 || words[i].length() == 1 ||
                   s.peek().charAt(s.peek().length() - 1) != words[i].charAt(0)) {
                answer[0] = i % n + 1;
                break;
            }
            else s.push(words[i]);
            
            if(i + 1 == words.length) answer[1] = 0;
        }
        return answer;
    }
}

 

2. 설명

문제를 해결하기 위해 가장 최근에 입력한 내용과 이미 입력된 내용을 조회해야 하기에 Stack을 활용하여 문제를 해결하기로 했습니다.

for(int i = 0; i < words.length; i++) {
    if(i % n == 0) answer[1]++;

반복문을 통해서 words의 모든 문장에 접근하며 i의 수가 n으로 나눠지면 모든 사람들의 턴이 지난 뒤 다시 처음 순서대로 진행한다는 것을 의미하기에 answer[1]의 값을 증가를 통해서 표시해 줍니다.

if(s.isEmpty()) s.push(words[i]);
else if(s.indexOf(words[i]) != -1 || words[i].length() == 1 ||
       s.peek().charAt(s.peek().length() - 1) != words[i].charAt(0)) {
    answer[0] = i % n + 1;
    break;
}
else s.push(words[i]);

현재 Stack이 비어있는 상태라면 푸시를 진행합니다. s.indexOf() 메서드를 통해서 이미 입력된 단어인지 그리고 단어의 길이가 1이 아닌지, 마지막에 입력된 단어로 시작한 단어인지 확인을 해준 뒤 이 모든 경우가 아니라면 Stack에 푸시해 주는데 만약 한 가지라도 해당된다면 현재 차례를 answer[0]에 저장 후 반복문을 중단합니다.

if(i + 1 == words.length) answer[1] = 0;

만약 중단되지 않고 반복문이 끝까지 진행되었다면 answer[1]에 진행 횟수의 값을 0으로 저장합니다. 탈락자가 생기지 않으면 [0, 0]을 반환해야 하기 때문입니다.

3. 정리

  1. Stack을 사용한다.
  2. 진행 횟수는 반복문 시작 시 확인한다.
  3. Stack이 비어있다면 push하고 아니라면 조건들을 확인한다.
  4. 종료되는 조건이라면 어떤 사람의 순서에 중단되었는지 저장한다.
  5. 영어 끝말잇기가 끝까지 진행되면 진행 횟수의 값을 0으로 초기화한다.
출처: 프로그래머스 코딩 테스트 연습, 
https://school.programmers.co.kr/learn/challenges