아이디어 정리
처음에 문제를 마주하고 나서 바로 떠오른 생각은 스위칭
이였다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
문제 조건 중 일부
카드 뭉치가 2개가 있는데, 이를 번갈아가며 1개 이상씩 사용하면 되기 때문에, 어떤 카드 뭉치를 처음 시작하는지, 현재 어떤 카드 뭉치에서 카드를 사용했는지 등을 확인하도록 코드를 구현해야겠다고 생각했다.
function solution(cards1, cards2, goal) {
const map = {
cards1,
cards2,
};
let current = card1.includes(goal[0])
? 'cards1'
: card2.includes(goal[0])
? 'cards2'
: '';
for (let i = 0; i < goals.length; i++) {
// 확인로직
}
}
대충 위와 같은 코드로 시작해서 아래와 같은 로직을 구현하고자 하였다.
- 현재 카드 뭉치 접근 :
map[current]
- 현재 단어가 카드 뭉치에 있는지 확인 :
map[current].includes(goals[i])
→ 있으면 삭제, 없으면 끝('No' 반환) - 삭제 후 다른 카드 뭉치로 변경(
스위칭
), 1번부터 반복
그런데 위 로직에는 몇가지 문제가 있었다.
- 언제 스위칭이 일어나야하는가? 카드 뭉치에서 단어가 반드시 번갈아가며 하나씩만 사용되는 것은 아니였다. 언제 카드 뭉치를 스위칭 해야할지 체크를 해야했다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
라는 조건을 망각했다. 위 코드에서includes
를 사용하면 카드 뭉치에 어떠한 위치에 있어도 관계없게 된다. 그렇기때문에 저런식으로 체크하면 오류가 발생한다.- 체크하기 위한 로직이 복잡해지는데, 꼭 저렇게 체크를 해야할까?
다시 한 번 조건을 보고 나서 정리를 해봤다.
카드 뭉치에서 카드는 몇 개가 사용되든 관계없지만, 반드시 순서대로 사용되어야하며 카드 뭉치가 번갈아가며 사용되어야한다.
여기서 내가 생각한 포인트는 반드시 순서대로 사용되어야한다는 점
이였다. 카드 뭉치는 항상 앞에서부터만 사용된다. 즉 카드 뭉치에서 카드를 삭제한다고 가정하면, 카드 뭉치의 인덱스가 0인 것만 확인하면 되는 것이였다.
이제까지 나는 goals의 단어가 카드 뭉치의 어디에 위치하는지를 중심으로 생각했었다. 그런데 포인트는 카드 뭉치에 카드가 순서대로 위치하는지
를 확인하는 것이였다. 그래서 카드 뭉치의 인덱스를 중심으로 생각하게 되었다. 즉 진행중인 카드 뭉치의 인덱스와 현재 체크해야할 카드가 카드 뭉치에서 위치한 인덱스가 같은지 여부를 체크하는 것이였다.
또 한가지 포인트는 번갈아가는 것은 내가 생각할 필요가 없다는 점이였다. 어차피 카드 뭉치 안에 카드들이 순서대로
뽑을 수 있게 위치한다면 번갈아가는 것은 자연스럽게 이루어질 수 있는 부분이 된다.
그 결과 아래와 같은 코드가 완성되었다.
function solution(cards1, cards2, goal) {
let c1Idx = 0,
c2Idx = 0;
for (let i = 0; i < goal.length; i++) {
if (cards1.indexOf(goal[i]) === c1Idx) c1Idx++;
else if (cards2.indexOf(goal[i]) === c2Idx) c2Idx++;
else return 'No';
}
return 'Yes';
}
이번 문제는 오래걸릴 것 같았지만 다르게 접근해 볼까
라는 불연듯 든 생각으로 인해 잘 풀린 것 같다. 이번 생각의 흐름을 적으면서 느낀 점은, 나의 생각이지만 그 흐름을 정리하는게 쉽지않다는 점이였다. 각각의 흐름의 과정에서 왜 이렇게 넘어왔는지를 적는 것을 표현하는 것이 어려웠다. 분명히 어떠한 이유가 있었는데... 그 모든걸 글로 표현하는게 쉽지않았다. (방금 푼 문제임에도...) 그래도 계속 이런 식으로 내가 구현하는 생각의 방식을 정리하는 습관을 가지도록 해봐야겠다. 이러한 과정이 나의 논리를 좀 더 체계적으로 만들어 줄 수 있을것 같다. 🙏🏻