본문 바로가기
공부/알고리즘

[프로그래머스] 영어 끝말잇기

by yeaseul912 2022. 6. 4.
728x90

1.  문제 설명

더보기

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.

  1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
  2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
  3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
  4. 이전에 등장했던 단어는 사용할 수 없습니다.
  5. 한 글자인 단어는 인정되지 않습니다.

다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.

tank → kick → know → wheel → land → dream → mother → robot → tank

위 끝말잇기는 다음과 같이 진행됩니다.

  • 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
  • 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
  • 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
  • 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
  • (계속 진행)

끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.

사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

2. 제한사항

더보기
  • 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
  • words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
  • 단어의 길이는 2 이상 50 이하입니다.
  • 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
  • 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
  • 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
  • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

3. 입출력예

n words result
3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3]
5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]
2 ["hello", "one", "even", "never", "now", "world", "draw"] [1,3]

4. 풀이

Solution 1

1. 탈락조건 

  1-1. 앞 글자의 마지막 글자와 현재 글자의 첫번째 글자가 같은지 비교(substring 활용)

  1-2. 등장했던 글자인지 확인하기 위하여 List생성

          List에 앞에 나왔던 글자를 넣고, 현재글자가 앞에 나왔던 글자들과 중복되는게 있는지 확인.

2. 몇 번째 사람인지 = (i%n) + 1

3. 몇 번째 게임인제 = (i/n) + 1

Hint : 탈락 조건에 걸린 후, break를 안해주면 틀린다. 이걸 찾느라 한참 고생함.

import java.util.*;
class Solution {
    public int[] solution(int n, String[] words) {
        int[] answer = new int[2];
        
        List<String> list = new ArrayList<>();
        list.add(words[0]);
        
        // 탈락인지 통과인지 -> 전글자의 마지막 글자와 현재 글자의 첫번째 글자 비교 & 나왔던 글자인지 확인
        for(int i=1; i<words.length; i++){
            String now = words[i];
            String lastWord = words[i-1].substring(words[i-1].length()-1);
            String firstWord = now.substring(0,1);
            
            if(list.contains(now) || !lastWord.equals(firstWord)){
                answer[0] = (i%n) + 1;
                answer[1] = (i/n) + 1;
                break; // Hint : 이놈!!
            }else{
                list.add(now);
            }
        }
        return answer;
    }
}

5. 풀이 설명

이 문제에서 헷갈리는건 answer 구할 때 이다. (적어도 나는 그랬다.)

이러케 !! 이러케 된다!!!

6. 결과 

Solution 1

7. 마치며

와 break .. 와~

오늘은 python으로 스크래핑을 하다가 <a 태그 안에 span태그가 있니?> 라는 조건문을 어떻게 써야할지 몰라서 구글링을 했다.

처음에는 라이브러리 내에 뭔가 메서드가 있지 않을까 하고 Document를 보다가 python에서 if문 쓰는거를 뒤져봐가지고 찾아서 했다.

일단 모르는건 당연히 구글링을 하는건데 처음에는 javaString.contains(String) 처럼 boolean형으로 반환해주는 조건식이 python에도 있지 않을까? 라고 생각하고 접근한게 썩 괜찮았던것같다. 

그냥 나의 문제해결능력?랄까 내가 오늘 만났던 문제를 어떻게 헤쳐나갔었지? 싶어서 적어본다.

반응형

'공부 > 알고리즘' 카테고리의 다른 글

[프로그래머스] 예산  (0) 2022.06.06
[프로그래머스] 주식가격  (0) 2022.06.05
[프로그래머스] 프린터  (0) 2022.06.02
[프로그래머스] 전화번호 목록  (0) 2022.06.01
[프로그래머스] 짝지어 제거하기  (0) 2022.05.25

댓글