Coding Test/Programmers_JavaScript

[JavaScript/프로그래머스] 연습문제 - 카드 뭉치

  • -
728x90

문제 링크

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


 

초기 정답 코드

function solution(cards1, cards2, goal) {
  let answer = "Yes";
  // 여기에 이전 사용한 카드 뭉치 명 저장
  let lastCards = "cards2";

  // 여기에 만들어지는 문장 저장
  let sentence = [];

  // 각각의 카드들에서 하나씩 빼가면서 0번째 자리에 들어갈 수 있는 지 확인하는 로직
  goal.forEach((g) => {
    if (g === cards1[0] && cards1) {
      sentence.push(cards1[0]);
      cards1.shift();
    } else if (g === cards2[0] && cards2) {
      sentence.push(cards2[0]);
      cards2.shift();
    } else {
      return "No";
    }
  });
  return sentence.join("") === goal.join("") ? "Yes" : "No";
}

함수 소개

function solution(cards1, cards2, goal)

  • 이 함수는 카드 뭉치(cards1, cards2)와 목표 문장(goal)을 입력받아 목표 문장을 만들 수 있는지 여부를 반환합니다.

변수 설명

let answer = "Yes"

  • 목표 문장을 만들 수 있는지 여부를 저장하는 변수입니다. 초기값은 "Yes"로 설정합니다.

let lastCards = "cards2"

  • 이전에 사용한 카드 뭉치의 이름을 저장하는 변수입니다. 초기값은 "cards2"로 설정합니다.

let sentence = []

  • 만들어지는 문장을 저장할 배열입니다.

 

로직 설명

goal.forEach((g) => {...})

  • 목표 문장의 각 문자에 대해 반복문을 실행합니다.

if (g === cards1[0] && cards1)

  • 만약 목표 문자가 cards1의 첫 번째 카드와 같고, cards1이 비어있지 않다면,

sentence.push(cards1[0])

  • 만드는 문장(sentence)에 cards1의 첫 번째 카드를 추가합니다.

cards1.shift()

  • cards1의 첫 번째 카드를 제거합니다.

else if (g === cards2[0] && cards2)

  • 만약 목표 문자가 cards2의 첫 번째 카드와 같고, cards2가 비어있지 않다면,

sentence.push(cards2[0])

  • 만드는 문장(sentence)에 cards2의 첫 번째 카드를 추가합니다.

cards2.shift()

  • cards2의 첫 번째 카드를 제거합니다.

else

  • 목표 문자를 만들 수 없다면,

return "No"

  • "No"를 반환하고 함수를 종료합니다.

return sentence.join("") === goal.join("") ? "Yes" : "No"

  • 만들어진 문장(sentence)이 목표 문장(goal)과 같으면 "Yes"를 반환하고, 그렇지 않으면 "No"를 반환합니다.

 

이 로직을 사용하여 카드 뭉치 2개에서 카드를 차례대로 뽑아 목표 문장을 만들 수 있는지 여부를 확인할 수 있습니다.


 

1차 개선 - 변수 감소, 로직 개선

사용되지 않는 변수인 answer, lastCards를 삭제하였습니다.

함수를 종료하기 위해 return "No"를 사용하는 대신, answer 변수를 사용하였습니다.

-> 변수를 통해 결과를 추적하고 forEach 문을 완료한 후 반환하여 가독성을 높였습니다.

function solution(cards1, cards2, goal) {
  let answer = "Yes";
  let sentence = [];

  goal.forEach((g) => {
    if (g === cards1[0] && cards1) {
      sentence.push(cards1[0]);
      cards1.shift();
    } else if (g === cards2[0] && cards2) {
      sentence.push(cards2[0]);
      cards2.shift();
    } else {
      answer = "No";
    }
  });

  return answer === "Yes" && sentence.join("") === goal.join("") ? "Yes" : "No";
}

 


End

728x90
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.