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

ZZEON·2024년 1월 4일
0

문제 설명

1부터 n까지 번호가 붙어있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
이전에 등장했던 단어는 사용할 수 없습니다.
한 글자인 단어는 인정되지 않습니다.
다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
(계속 진행)
끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.
사람의 수 n과 사람들이 순서대로 말한 단어 words 가 매개변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해주세요.

제한 사항

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

풀이 작성

일단 문제가 너무 길어서 보고 놀랬다.. 허거걱
그리고 어떻게 풀어야 할 지 감이 잘 안왔던 것 같다.
이렇게 생각하면 저게 문제고 저렇게 생각하면 이게 문제였다. 그래도 차근히.. 내가 풀 수 있는 선에서 문제를 풀어본다.

용기만 가득해서 for문으로 어떻게 해보겠다고 만들어 낸 코드이다.
보기가 너무 안좋고 더 나은 방법이 있을 거 같은데.. 라고 생각하게 만든다. 이거 짜는데도 시간이 오래 걸렸다. 분발해야지..

내가 짠 코드

function solution(n, words) {
    // n은 사람 수
    // words : 단어 개수
  
  	//정답을 담기 위한 배열
    var answer = [0, 0];
  	//마지막 글자가 담길 곳. 첫 단어의 마지막 글자를 넣어놓으면 처음부터 에러가 발생하기 때문에 처음에 첫 단어의 첫 글자를 넣어두고, 첫 단어의 첫 글자와 비교하게 된다.
    var lastWord = words[0].slice(0,1);
  	//중복된 단어 반별을 위한 배열
    var same = [];
    
 	//끝까지 돌기 위한 for문
    for(let i=0; i < words.length; i++){
      	// 중복된 단어가 있는지 알아보기 
        for(let j=0; j < same.length; j++){
          	//same 배열에 들어있는 단어 중 하나라도 같은 단어가 나온다면
            if(same[j] === words[i]){
                answer = [ (i % n)+1, Math.floor(i/n)+1]
                return answer;
            }
        }
      
      	//지금 단어 첫 글자가 이전 단어의 마지막 글자와 같지 않다면
        if(words[i].slice(0, 1) !== lastWord){
            answer = [ i % n + 1, Math.floor(i/n)+1]
            return answer;
        }
      	//이전 단어 마지막 글자로 저장되어 있는 lastWord를 지금 단어의 마지막 글자로 바꿔주기
        lastWord = words[i].slice(-1);
      	//지금 단어를 same 배열에 넣기
        same.push(words[i]);
    }
    return answer;
}

이게 최선일까 싶어 다른 사람이 짠 코드를 보니까.. 메소드를 정말 잘 이용하셨다.. 나도 이렇게 이용할 수 있는 사람이 되어야겠다고 생각했다. 그렇기 위해선 아직 공부가 많이 필요한 거 같다. 아자아자!

다른 사람이 짠 코드

let lastWord = words[0].slice(0,1);
    let answer = [0, 0]
    var same = []
    words.every((word, idx) => {
        if(same.includes(word)){
            answer = [ idx % n + 1, Math.floor(idx / n) + 1]
            return false
        }
        if(word[0].slice(0, 1) !== lastWord){
            answer = [ idx % n + 1, Math.floor(idx / n) + 1]
            return false
        }

        lastWord = word.slice(-1);
        same.push(word)
        return true;
    })
    return answer;
}

참고 링크
https://school.programmers.co.kr/questions/51632

profile
프론트엔드 개발과 디자인을 좋아합니다

0개의 댓글