프로그래머스 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/159994
문제 풀며 놓친 점
- 자바스크립트의 Object나 Array와 같은 iterator들은 값이 같은지 비교할 때 메모리 주소로 비교한다.
- 배열, 객체를 비교할 때는 비교하려는 대상은 JSON.stringify(array) 메서드를 이용해 문자열로 변환한 후 비교할 수 있다.
잘 못 이해한 부분
- 카드1과 카드2에서 각각 카드가 한장씩 뽑아 goal 배열과 맞는 순서로 나열하여 비교하는 문제인지 알았는데, 카드1과 카드2를 무조건 둘다 뽑아서 비교하는 문제가 아니라 하나만 뽑아서 비교하면 되는 문제였다. 문제를 잘 읽도록 하자.
[오답]처음 문제를 푼 방법
처음에 문제 이해를 잘 못해서 전부 두개씩 비교하여 함수를 작성했다. goal 배열의 요소가 홀수인 경우에 마지막 goal의 요소가 지워지지않고 그대로 남아있어. 예외처리를 하지 못하는 경우가 발생하였다. 다시 함수를 고민하며 문제를 읽어보던 중 잘못 이해한 것을 깨달았다. 문제를 다시 이해하고 두개씩 비교하던 함수를 하나씩 비교하는 함수로 변경하였다.
function solution(cards1, cards2, goal) {
let answer = '';
const words = [];
for (i=0; i< goal.length; i++){
const target = JSON.stringify([goal[0],goal[1]])
console.log(target);
if(JSON.stringify([cards1[i],cards2[i]]) === target){
words.push(cards1[i],cards2[i]);
goal.shift()
goal.shift()
} else if(JSON.stringify([cards2[i], cards1[i]]) === target) {
words.push(cards2[i],cards1[i]);
goal.shift()
goal.shift()
} else if(goal.length !==0 ) {
return answer = "No";
}
}
console.log(goal);
if (goal.length === 0) return answer="Yes"
return answer;
}
[정답]수정된 함수 풀이
function solution(cards1, cards2, goal) {
const n = goal.length;
for(let i=0; i<= n; i++){
if(goal[0] === cards1[0]){
goal.shift();
cards1.shift();
}
else if(goal[0] === cards2[0]){
goal.shift();
cards2.shift();
}
}
return (goal.length === 0) ? "Yes" : "No";
}
큐 구현해서 문제 풀기
class Queue {
items = [];
first = 0;
rear = 0;
constructor (array) {
this.items= array;
this.rear = array.length;
}
push (item) {
this.items.push(item);
this.rear++;
}
pop () {
return this.items[this.first++];
}
front(){
return this.items[this.first];
}
isEmpty () {
return this.first === this.rear;
}
}
function solution(cards1, cards2, goal) {
cards1 = new Queue(cards1);
cards2 = new Queue(cards2);
goal = new Queue(goal);
while (!goal.isEmpty()){
if(!cards1.isEmpty() && cards1.front() === goal.front()) {
cards1.pop();
goal.pop();
} else if(!cards2.isEmpty() && cards2.front() === goal.front()) {
cards2.pop();
goal.pop();
} else {
break;
}
}
return goal.isEmpty() ? "Yes": "No";
}
정답 코드 비교
class로 Queue를 구현해서 그런지 확실히 큐로 구현한 정답코드가 3배정도 느렸다. 하지만 이번 문제로 자바스크립트로 큐를 구현하는 방법과 어떻게 실행되는지에 대한 이해가 확실히 된 것 같다. 단순한 문제일 경우에는 이렇게 다른 방법으로 풀 수 있지만 테스트 코드가 더 늘어난다면 큐로 풀이하는게 더 안정적으로 테스트를 통과할 수 있을 거 같다.
'Studieeeeee~. > JS Algorism Test' 카테고리의 다른 글
js 알고리즘 테스트 환경 VS code로 세팅하기 (0) | 2024.08.22 |
---|---|
[코테 합격자되기 Js] 문제 16 기능 개발 (0) | 2024.08.14 |
큐 (0) | 2024.08.13 |
이진 트리 binary tree (0) | 2024.08.13 |
해시 개념 정리 (0) | 2024.08.13 |