🗃️javascript/코테 프레임 문제

2-3 가위 바위 보(24년)[reduce문 acc를 빈 배열로 초기화한 예시]

하얀성 2023. 9. 21. 09:35

<제출 답안>

풀리긴 풀리는데.... 너무 길고, 가독성도 떨어진다.

function solution(a, b){
  for(let i=0; i<a.length; i++){
    if(a[i] > b[i]){
      if(a[i]===3 && b[i]===1){
        console.log('B')
      }else{
        console.log('A')
      }
    }else if(a[i] < b[i]){
      if(a[i]===1 && b[i]===3){
        console.log('A')
      }else{
        console.log('B')
      }
    }else{
      console.log('D');
    }
  }
}

let a=[2, 3, 3, 1, 3];
let b=[1, 1, 2, 2, 3];
console.log(solution(a, b));

<답안>

조건문을 짤 때는 조건을 잘 따져봐야 한다.

이 가위바위 보의 경우 두 사람 밖에 없으므로 한쪽의 결과만 있으면 다른 한쪽의 결과는 자연스럽게 정해진다.

a의 결과만 다 따져주고 b는 else로 처리해도 된다는 것이다. 훨씬 더 코드가 간단해지고 보기도 편해질것이다.

function solution(a, b){
  let answer='';
  for(let i=0; i<a.length; i++){
    if(a[i]===b[i]) answer+="D ";
      else if(a[i]===1 && b[i]===3) answer+="A ";
      else if(a[i]===2 && b[i]===1) answer+="A ";
      else if(a[i]===3 && b[i]===2) answer+="A ";
      else answer+="B ";
  }
  return answer;
}

let a=[2, 3, 3, 1, 3];
let b=[1, 1, 2, 2, 3];
console.log(solution(a, b));

24.4.12 업데이트.

 

일단 조건문은 너무 엉망이다. 사실 reduce에 대해서 좀 신경쓰고 있었다. 

여태껏 초기화 해주는 게 현재값(fightA)에서의 첫번째 요소를 지정하는 줄 알았는데 그게 아니었다.

final이라는 축적값의 공간을 초기화 해주는 것이었다. (초기화 하지 않을시 첫번째 배열 요소 사용)

 

하지만 이번 예시처럼 배열을 축적값으로 사용할 때는 빈 배열로 따로 선언해주어야 한다.final을 맨처음에는 []에서 시작해야 하는데 빈배열로 선언해주니 않으면 에러가 생긴다.


callback의 최초 호출에서 첫 번째 인수에 제공하는 값. 초기값을 제공하지 않으면 배열의 첫 번째 요소를 사용합니다. 빈 배열에서 초기값 없이 reduce()를 호출하면 오류가 발생합니다.

출처 : https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

function solution(a, b) {
  const checkWinner = a.reduce((final, fightA, i) => {
    if (fightA === b[i]) {
      final.push("D");
    } else {
      if (fightA === 1) {
        if (b[i] === 2) {
          final.push("B");
        } else {
          final.push("A");
        }
      } else if (fightA === 2) {
        if (b[i] === 3) {
          final.push("B");
        } else {
          final.push("A");
        }
      } else {
        if (b[i] === 1) {
          final.push("B");
        } else {
          final.push("A");
        }
      }
    }
    return final;
  }, []);
  return checkWinner.join("\n");
}

let a = [2, 3, 3, 1, 3];
let b = [1, 1, 2, 2, 3];
console.log(solution(a, b));

느낀점

이번 코테 풀기에서는 느끼는게 내가 map, forEach, reduce 등에 대해서 잘 활용을 못하고 쓰고 있었다는 생각이 많이 든다. 다시 기초로 돌아오길 너무 잘한것 같다.