프로그래머스 Level 1 연습문제 > 카드 뭉치

문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열이 주어진다. cards1과 cards2에 포함된 단어들로 goal 배열에 저장된 문자열로 만들 수 있으면 "Yes"를, 만들 수 없다면 "No"를 return하는 Solution 함수를 작성하는 문제다.
cards1 배열과 cards2 배열의 index number를 각각 0으로 초기화 해준 후, goal 배열을 반복한다. 만약 goal 배열의 요소가 cards1에 포함되어 있으면 answer에 push해주고 cards1의 index number1에 1을 더해준다. 마찬가지로 cards2에 포함되어 있으면 answer에 push 한 후 index number2에 1을 더해주도록 코딩했다.
또한, 각각의 index number는 cards 배열의 길이를 넘지 않도록 하며, 길이를 넘게 되면 break로 반복문을 탈출한다.
마지막으로 반복문이 종료되면 answer 배열과 goal 배열을 비교하여 맞으면 "Yes", 틀리면 "No"를 return 하였다.
배열 비교 함수를 따로 작성했다.
function arraysAreEqual(arr1, arr2) {
return arr1.length === arr2.length && arr1.every((value, index) => value === arr2[index]);
}
function solution(cards1, cards2, goal) {
const answer = [];
let idx1 = 0;
let idx2 = 0;
for(let i = 0; i < goal.length; i++) {
if (idx1 > cards1.length || idx2 > cards2.length) {
break;
}
if (goal[i] === cards1[idx1]){
answer.push(goal[i]);
idx1++;
}
else if (goal[i] === cards2[idx2]){
answer.push(goal[i]);
idx2++;
}
}
if (arraysAreEqual(answer, goal)) {
return "Yes";
}
else return "No";
}
처음엔 answer에 push 해주고 마지막에
if (goal == answer) {
return "Yes";
}
else return "No";
를 했는데, answer에 담긴 배열은 ['1','2'] 형식이며, goal에 담긴 배열은 ["1", "2"] 형식이라 두 배열은 모두 길이가 2이고 요소가 같지만 따옴표의 종류에 따라 다른 배열이다.
따라서 배열 비교 함수인 arraysAreEqual(arr1, arr2)를 추가하였는데 이는 arr1과 arr2를 매개변수로 받는다. arr1과 arr2의 길이가 같으며, arr1의 모든 배열 요소가 arr2에 있는 경우에 true, 그렇지 않은 경우 false를 return 하도록 하였다.

코드에 대한 지적이나 조금 더 나은 방법을 알려주시면 정말 감사히 듣겠습니다 !!