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

이명진·2022년 11월 26일
0

코드카타

목록 보기
52/69

이건 이전에 문제를 풀었다가 실패했던 문제였는데 오래간만에 다시 풀게 되었다.

문제요약

영어 끝말잇기가 있다. 끝말잇기는 다들 방법은 아니 넘어간다. 사람수와 끝말잇기 단어수가 정해졌을때
끝말잇기에서 틀린 사람의 넘버와 몇번째에서 틀렸는지를 리턴하면 되는 문제이다.

문제 풀이

첫번째 풀이

이전에 풀었던 문제를 다시한번 복기했다.

function solution(n, words) {
  	let turn = [];
let oneWords = words.filter(x=>{return x.length === 1})
		if(oneWords.length){
      return [0,0]
    }
		words.map(x=>{
      let prevWords = turn[turn.length-1]
      if(turn.length && x[0] !== prevWords[prevWords.length-1]){
        return;
      }
      let isSame = turn.includes(x)
  
      if(isSame){
        return;
      }
      turn.push(x)
      
    })
  if(turn.length===words.length){
    return [0,0]
  }
  let person = (turn.length+1)%n?(turn.length+1)%n:n;
  let lastTurn = Math.round((turn.length+1)/n)
 
  return [person,lastTurn]
  
}

일단 turn이라는 배열을 만들고 한단어를 체크해준다. 이전 조건에 한단어 일때의 조건이 있었나(?)
체크해주고 만약 있다면 [0,0] 을 리턴해준다..? 이전에 풀었던 풀이라서 잘해석은 못했지만 일단 넘어간다.
그리고 단어 배열을 map을 돌려준다. Turn 배열에 단어를 넣어주면서 마지막 단어를 빼서 이전단어임을 선언해주었다.
조건울 주어서 이전단어의 뒷자리와 지금 말한 단어의 앞자리가 같을 경우 리턴을 해준다. 또 같은 단어가 있을때 리턴해준다.
그리고 사람을 구해주고 몇번째 턴인지 구해준다.
확실히 이전의 풀이를 읽어보니 못풀긴했다.. 코드가 복잡한거 같기도 하다.
이 코드는 테케는 다 맞췄고 제출할때 몇문제가 틀린 코드이다.

이번에 새로 풀었는데 문제는 비슷하게 접근한것 같은데 왜틀린지 잘 모르겠다.

아래는 이번에 새로 풀고 통과한 풀이이다.

두번째 풀이

function solution(n, words) {
let answer = 0;
  let copyWords = [...words]
  let turn = 1;
  let sayWords = [];
  while(copyWords.length!==0){
    let say = copyWords.shift();
   
    if(!sayWords.length){
      sayWords.push(say);
    }else{
      let preSay = sayWords[sayWords.length-1];
      if(preSay[preSay.length-1]===say[0]&&!sayWords.includes(say)){
        sayWords.push(say);
      }else{
        break
      }
    }
    turn++
  }
  if(words.length===turn-1){
    return [0,0]
  }
  let person = turn%n ===0?n:turn%n
  
  return [person,Math.ceil(turn/n)]
  
}

이전 풀이와 비슷하게 풀었다. 이전 풀이를 안읽어보고 바로 새로운 느낌으로 푼건데 접근은 비슷하다.
일단 단어 배열을 복사해주고 que 방식으로 빼서 풀었다.
하나씩 배열에서 빼서 저장해주고 앞의 풀이와 같이 이전단어의 뒷자리와 지금 말한단어의 앞자리가 다를 경우, 그리고 같은 단어가 있을 경우
리턴을 해주도록 하였다. 그리고 사람을 구하고 턴을 구해주는 방법으로 풀었다.

이 방법으로 풀었는데 다 맞췄다.

다른사람의 풀이

function solution(n, words) {
    let answer = 0;
    words.reduce((prev, now, idx) => {
        answer = answer || ((words.slice(0, idx).indexOf(now) !== -1 || prev !== now[0]) ? idx : answer);
        return now[now.length-1];
    }, "")

    return answer ? [answer%n+1, Math.floor(answer/n)+1] : [0,0];
}

다른사람의 풀이인데 이렇게 짧게 풀수 있다는게 놀랍다.
reduce를 이용해서 풀었는데.
(words.slice(0, idx).indexOf(now) !== -1 이부분은 중복이 있나 체크하는 항목같다.
prev !== now[0] 이부분은 잘 모르겠다. 아마 앞자리와 뒷자리 가 같은지의 부분인것 같다. prev는 단어 형태일텐데 now[0]의 앞자리를 비교한다는게 말이 되는건가?

추가

직접 식에 콘솔을 찍어보니 prev는 단어가 아니었다. Return now[now.length-1]를 해줬기 때문에 뒷자리 가 나온것이었다.. 대단쓰.. 놀랍다.

아무튼 이렇게 idx를 뽑아서 answer 계산을 해줬다.
이렇게 해서 만약 걸린사람이 있을경우 answer 는 0이상의 숫자이고 아닐경우 0이다.

profile
프론트엔드 개발자 초보에서 고수까지!

0개의 댓글