Skip to content

Latest commit

 

History

History
84 lines (59 loc) · 4.25 KB

11.md

File metadata and controls

84 lines (59 loc) · 4.25 KB

카드 뭉치

아이디어 정리

생각의 흐름 정리

스위칭

처음에 문제를 마주하고 나서 바로 떠오른 생각은 스위칭이였다.

카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.

문제 조건 중 일부

카드 뭉치가 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++) {
    // 확인로직
  }
}

대충 위와 같은 코드로 시작해서 아래와 같은 로직을 구현하고자 하였다.

  1. 현재 카드 뭉치 접근 : map[current]
  2. 현재 단어가 카드 뭉치에 있는지 확인 : map[current].includes(goals[i]) → 있으면 삭제, 없으면 끝('No' 반환)
  3. 삭제 후 다른 카드 뭉치로 변경(스위칭), 1번부터 반복

그런데 위 로직에는 몇가지 문제가 있었다.

  1. 언제 스위칭이 일어나야하는가? 카드 뭉치에서 단어가 반드시 번갈아가며 하나씩만 사용되는 것은 아니였다. 언제 카드 뭉치를 스위칭 해야할지 체크를 해야했다.
  2. 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다. 라는 조건을 망각했다. 위 코드에서 includes를 사용하면 카드 뭉치에 어떠한 위치에 있어도 관계없게 된다. 그렇기때문에 저런식으로 체크하면 오류가 발생한다.
  3. 체크하기 위한 로직이 복잡해지는데, 꼭 저렇게 체크를 해야할까?

스위칭이 포인트가 아닌거 같다!

다시 한 번 조건을 보고 나서 정리를 해봤다.

  카드 뭉치에서 카드는 몇 개가 사용되든 관계없지만, 반드시 순서대로 사용되어야하며 카드 뭉치가 번갈아가며 사용되어야한다.

여기서 내가 생각한 포인트는 반드시 순서대로 사용되어야한다는 점 이였다. 카드 뭉치는 항상 앞에서부터만 사용된다. 즉 카드 뭉치에서 카드를 삭제한다고 가정하면, 카드 뭉치의 인덱스가 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';
}

정리

이번 문제는 오래걸릴 것 같았지만 다르게 접근해 볼까 라는 불연듯 든 생각으로 인해 잘 풀린 것 같다. 이번 생각의 흐름을 적으면서 느낀 점은, 나의 생각이지만 그 흐름을 정리하는게 쉽지않다는 점이였다. 각각의 흐름의 과정에서 왜 이렇게 넘어왔는지를 적는 것을 표현하는 것이 어려웠다. 분명히 어떠한 이유가 있었는데... 그 모든걸 글로 표현하는게 쉽지않았다. (방금 푼 문제임에도...) 그래도 계속 이런 식으로 내가 구현하는 생각의 방식을 정리하는 습관을 가지도록 해봐야겠다. 이러한 과정이 나의 논리를 좀 더 체계적으로 만들어 줄 수 있을것 같다. 🙏🏻