영어 끝말잇기

.·2021년 8월 5일
0

알고리즘

목록 보기
10/21

패배조건
1. 끝글자 !== 첫글자
2. 앞에서 단어를 이미 사용했을 때

return 해야 하는것
누가 실패했는지, 몇번째 턴에서 실패했는지

나는 최대한 조건에 맞춰서 💩같은 코드를 작성했고 효율성 테스트도 💩이 나왔다 !

내가 작성한 💩같은 코드 설명

function solution(n, words) {
  var previousWords = [];
  const answer = [];
  let turn = 1;

  let flag = 1;
  for (let i = 0; i < words.length; i++) {
    let lastWord;
    let lastLetter;
    let firstLetter;
    
    if (previousWords.length > 0) {
      lastWord = previousWords[previousWords.length - 1];
      lastLetter = lastWord[lastWord.length - 1];
      firstLetter = words[i][0];
    }

    if (
      previousWords.indexOf(words[i]) > -1 ||
      (lastLetter && lastLetter !== firstLetter)
    ) {
      const currentPerson = (i + 1) % n === 0 ? n : (i + 1) % n;
      answer.push(currentPerson);
      answer.push(turn);
      flag = 0;
      break;
    }
    if ((i + 1) % n === 0) turn++;
    previousWords.push(words[i]);
  }

  return flag ? [0, 0] : answer;
}
  1. 중복을 확인하기 위해 for문 바깥에 배열을 만들어 주었다
  2. previousWords 라는 배열에 값이 있을 때만 마지막 글자를 변경해 주었고
  3. 1) 중복이 있을 때 2) 이전단어의 마지막 글자와 새단어의 첫번째 글자가 다를 때 for문을 종료하도록 만들었다
  4. turn도 따로 변수로 선언해 줬는데 1로 설정해 주고 한번 돌때마다 증가 시켜줘야 하니 index를 사람수로 나눴을때 0이 되면 === 끝사람이 되면 turn 을 증가시켜주었다
  5. 탈락자가 나와 종료될 때 현재사람은 1,2,3,4 이런식으로 index와 1차이가 나서
    const currentPerson = (i + 1) % n === 0 ? n : (i + 1) % n; 이렇게 작성해 주었다
  6. flag도 사용해 주었는데 탈락자가 나올경우 0으로 만들어줘서 최종적으로 return 할 때 flag가 존재하면 === 탈락자가 없다는 소리 [0,0] return해 주었다

나머지 사용을 시도한 나를 칭찬해 주고싶다.

이제 다른사람이 작성한 코드를 살펴보았다
reduce를 활용하셨는데 reduce는 단지 sum을 구하는 내장함수가 아니라는 글을 봤는데 이번에 확실하게 느꼈다

감명 받은 코드

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];
}
  1. reduce에 초기값을 세팅해주면 prev에 대입 되고
  2. return 값은 다음 prev에 할당된다
  • 만약 초기값을 세팅해 주지않으면 0번째 index가 now, 1번째 index가 cur이 된다 그래서 웬만하면 초기값을 셋팅해 주는 것이 좋다
  1. ⁉️ 여기서 의문점이 든것이 그럼 제일 처음것은 pre가 ""이고 now[0]과 필연적으로 다를텐데?????? 라는 생각이 들었는데
  • 그때는 answer에 현재 index인 0이 할당되어서 상관없었다..
  • 대신 초기값을 ""로 설정해 주지않으면 0번째 index 단어 전체!!와 1번째 index 단어의 첫글자와 비교해 줘서 오류가 뜨니 초기값을 설정해 줘야한다
profile
Divde & Conquer

0개의 댓글

관련 채용 정보