[Programmers]혼자 놀기의 달인/JS

문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/131130#

접근방법

문제가 길어서 문제 읽는 것부터 힘들었다..
테스트 케이스에는 [8, 6, 3, 7, 2, 5, 1, 4]가 입력으로 들어온다.
먼저 첫번째를 선택했을 때, 두번째를 선택했을 때 ... 다 손으로 써봤다.
첫번째를 선택했다 해보자. 그리고 인덱스가 0이 아닌 1부터 시작한다고 가정한다.

  • 인덱스를 기준으로 1 -> 8 -> 4 -> 7 이렇게 4개의 상자를 거치고,
    1, 8, 4, 7 중 어떤 것을 먼저 선택하든 똑같이 4개를 거친다.
  • 그리고 처음 선택한 인덱스의 값이 나올 때까지 반복한다!

정답코드

function solution(cards) {
  let answer = 0;
  let visit = Array(cards.length).fill(false);
  let box = [];

  for (let i = 0; i < cards.length; i++) {
    if (visit[i]) continue;

    if (visit[i] == false) {
      let temp = i;
      let count = 0;

      do {
        visit[temp] = true;
        temp = cards[temp]-1;
        count++;
      } while (temp !== i);
      box.push(count);
    }
  }

  box.sort((a, b) => {
    return b - a;
  });

  answer = box.length == 1 ? 0 : box[0] * box[1];
  return answer;
}

방문여부를 확인하는 visit 배열을 하나 만들어 주고,
for문을 돌면서 방문하지 않은 곳이면 상자를 열어준다.
1번 상자 그룹의 상자의 수, 2번 상자 그룹의 상자의 수를 구해서 box 배열에 넣어준다.
for문이 종료되면 내림차순 정렬을 해준다.
만약 box 배열의 길이가 1이라면 0점이고, 아니라면 최고 점수를 구해야하므로
내림차순 정렬된 배열의 가장 큰 값 * 그 다음 큰 값을 해줘서 answer에 저장하면 된다.

 

그리 어렵지 않게 풀어서 뿌듯👏

 

'Algorithm' 카테고리의 다른 글

[Programmers]롤케이크 자르기/JS  (0) 2024.02.24
[Programmers]문자열 압축/JS  (0) 2024.02.23
[Programmers]삼각 달팽이/JS  (1) 2024.02.01
[Programmers]땅따먹기/JS  (0) 2024.02.01
[Programmers]가장 큰 정사각형 찾기/JS  (1) 2024.01.28