코드노트

원형 연결리스트 알고리즘 문제 풀이 본문

Code note/자바스크립트 알고리즘 문제풀이

원형 연결리스트 알고리즘 문제 풀이

코드노트 2022. 9. 14. 00:33

이번 연결리스트는 원형연결리스트의 문제이다.

일반 연결리스트와 다르게 원형으로 연결되어 있다보니깐 신경써야할 게 더 많았다.

 

문제 설명

입력값 8, 2, 3

출력 값 2, 5, 8, 4, 1, 7, 3, 6 

 

- n = 8, m = 2, k = 3

- 1, 2, 3, 4, 5, 6, 7, 8 로 n의 사람이 있을 때 m = 2번부터 시작하여 k = 3번의 간격으로 이동해서 나오는 숫자들을 출력 해야한다.

 

그림으로 보면 이렇게 한 방향으로 돌면서 3칸씩 이동하며 숫자를 하나씩 추가하여 순차적으로 출력하면 된다.

 

연결리스트를 처음 봤을 때는 이해가 안되었는데 이제 어느 정도 이해도가 높아진거 같다.

우선 4가지로 나누었다.

1. n = 8 개의 node를 만들어서 원형 연결리스트를 만든다.

2. 첫 시작 head를 m = 2로 초기화해준다.

3. 원형연결리스트를 순회하면서 3칸씩 이동시키며, 결과값에 추가한다.

4. 마지막 남은 node를 추가해준다.

 

 

/* user code */
function Node(data) {
  this.data = data;
  this.next = null;
}

function LinkedList() {
  this.head = null;
}

function answer(n, m, k) {
  let result = [];
  
  // 1. Circular Linked List 만들기
  let ll = new LinkedList();
  let current, prev;

  for (let i = 1; i <= n; i++) { // n만큼 for문을 돌면서 currnet에 node를 넣어준다.
    current = new Node(i);
    if (i === 1) {
      ll.head = current;
    } else {
      prev.next = current;
    }
    prev = current;
  }
  current.next = ll.head; // 마지막 node를 첫 heal와 연결해주어 원형 연결리스트를 완성한다.

  // 2. Start node 위치 설정
  current = ll.head; // current에 첫 head로 시작
  while (--m) { // m - 1회 만큼 반복하면 시작하는 node에 맞게 이동한다.
    prev = current;
    current = current.next;
  }

  // 3. k만큼 움직이면서 제거 / 한개만 남을 때까지
  let count; // k를 증감을 하게 되면 k값이 사라지기 때문에 k값을 가지고 있을 변수를 설정
  
  while (current.next !== current) { // current값을 만날 때까지 반복
    result.push(current.data); // current값을 하나씩 result에 추가한다.
    prev.next = current.next; // 이전 node의 Next를 현재 node의 Next로 연결한다.
                              // result에 추가한 node를 제외하고 원형연결리스트를 그대로 유지한다.
    count = k;    
    while (count--) { // count값 만큼 계속해서 이동한다.
      prev = current;
      current = current.next;
    }
  }

  // 4. 혼자 남은 후보 번호를 result에 추가
  result.push(current.data);

  return result;
}

- 우선적으로 원형연결리스트를 만들어야한다.

- 그 후 while문을 통해서 prev와 current.next로 이동을 시켜주며 순회하게 하는걸 확인해야한다.

 

원형연결리스트에서 기본적인 문제같이 느껴졌다..

앞으로 더 응용을 할 수 있어야할텐데 걱정이 먼저 앞선다..