[JavaScript][Programmers] 입실퇴실

조준형·2021년 9월 14일
0

Algorithm

목록 보기
139/142
post-thumbnail

🔎 입실퇴실

❓ 문제링크

https://programmers.co.kr/learn/courses/30/lessons/86048

📄 제출 코드

function solution(enter, leave) {
  let answer = [];
  for (let i = 0; i < enter.length; i++) {
    answer.push(new Set);
  }
  let lidx = 0;
  let eidx = 0;
  let room = [];
  
  while (true) {
    if (lidx == leave.length) break;
    else {
      if (room.indexOf(leave[lidx]) != -1) {
        let tmp = Array.from(room);
        for (let i = 0; i < room.length; i++) {
          for (let j = 0; j < tmp.length; j++) {
            if (tmp[j] != room[i])
              answer[room[i] - 1].add(tmp[j]);
          }
        }
        room.splice(room.indexOf(leave[lidx]), 1);
        lidx++;
      } else {
        room.push(enter[eidx]);
        eidx++;
      }
    }
  }

  answer = answer.map(el => {
    return el = Array.from(el).length;
  })
  return answer;
}
let enter = [1, 4, 2, 3]
let leave = [2, 1, 3, 4]
// let enter = [1, 3, 2]
// let leave = [1, 2, 3]
console.log(solution(enter, leave));

위클리 챌린지 7주차 문제이다.
처음엔 문제 이해를 잘못해 시간을 소비했다. 1 3 2 / 1 2 3경우에 1 3 2가 다 들어오고, 1 2 3차례대로 나가면 결국 다보는거아닌가? 라고 생각했고, 테스트케이스 풀이를 보면서 이해하려고 했다.
내가 생각한경우로도 올 수 있지만, 풀이처럼 다른경우인 경우 무조건 만났다는 보장이 없다.
그래서 무조건 보는 경우가 뭘까 생각했다.
답은 방안에 leave가 있으면 해당 숫자를 빼낼텐데 그때 방안에 있는 사람들은 무조건 만나는 것이다.
아래 경우를 살펴보자.

enter [1,4,2,3] / leave [2,1,3,4]의 경우
처음 방을 나가는 사람은 2번이다.
하지만 2번이 들어오기 전까지 방안에 있는사람은 1,4번이므로 1, 4, 2는 서로를 무조건 만난다.

이제 구현만 하면된다.
구현은 while문으로 반복을하면서 lidx와 eidx를 사용하였다.
lidx가 leave길이만큼되면 모두 나갔다는 것이니 반복을 종료한다.
그다음 room에 leave[lidx]가 있으면 answer의 해당 번째 숫자에 만난 친구들을 저장한다.
그리고 room에서 leave[lidx]를 제거하고, lidx를 증가시킨다.
하지만 구현이 생각처럼 안됐고 console로 하나하나 단계마다 room과 answer의 상태를 보면서 오류를 찾았다.
첫번째 문제는 answer에서 발생했다. 지난번에 Array.from이 얕은복사를 한다는걸 봤었는데 이번에도 그 문제였다. answer[0]에 값을 수정하니 0번째 1번째 ,,, 끝번째 까지 모두 한번에 값이 변했다.
그래서 반복문을 이용하여 하나하나 push하는 형태로 바꿧다.
그 다음은 일부만 통과하고, 일부는 실패하여 무엇이 문제인가 찾아보았다.
처음 구현할때 room에 먼저 enter를 넣고, 방안에 있는지 검사했는데 다음의 경우 문제가 발생했다.

enter [1,4,2,3] / leave [2,1,3,4]에서
2가 제거된 다음 1이나가고 3이들어와야하는데 3이 들어오고 1이 빠져나가서 값이 이상해진다.

그래서 room에서 leave[idx]를 못찾은 경우에만 enter를 push하는 것으로 변경하엿더니 통과하였다.

profile
깃허브 : github.com/JuneHyung

0개의 댓글