본문 바로가기

Programmers

[프로그래머스][JAVA]Lv. 2 - 혼자 놀기의 달인

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1~n까지의 숫자를 가진 카드를 상자 하나씩에 넣고 섞은 뒤에 일렬로 놓았을 때, 상자 안에 있는 카드를 확인하고 그 숫자의 순서를 가진 상자 안에 있는 카드를 확인하는 행위를 반복하는 문제

그렇게 반복하여 이미 열려 있는 상자가 지목되었을 때, 여태 열린 상자를 1번 그룹으로 하고 남은 카드 상자를 다시 임의의 상자를 골라 위의 행위를 반복한다

이 과정에서 1번 그룹 이외의 상자가 남지 않는다면 획득 점수를 0점으로 한다

정답으로는 1번 그룹과 2번 그룹 수의 곱을 출력한다

while (start_number != n) {
    n = start_number;
    func(start_number, cards);
    for (int i = 0; i < visit.length; i++) {
        if (!visit[i]) start_number = i+1;
    }
    m++;
}

public static void func(int start_number, int[] remain_cards) {
    if (visit[start_number - 1]) {
        al.add(0);
    } else {
        visit[start_number-1] = true;
        al.add(remain_cards[start_number-1]);
        func(remain_cards[start_number-1], remain_cards);
    }
}

 

먼저 위의 내용처럼 시작 번호와 남은 카드를 함수에 넣었다

만약 이미 열어본(방문한) 상자라면 arrayList al에 0을 추가하고 방문하지 않았다면 boolean으로 된 배열 visit을 true로 해주고 al에 상자 안의 카드 숫자를 추가해 주고 이를 반복시켰다

for (int j = 0; j < al.size(); j++) {
    if (al.get(j) != 0) {
        k++;
    } else if (al.get(j) == 0) {
        arr[l] = k;
        l++; k=0;
    }
}

작업이 끝나면 al를 탐색하며 해당 숫자가 0이 아니라면 k를 증가시키다가 0인 순간 배열 arr에 k를 넣어주고 k를 다시 0으로 하였다

이렇게 arr에 각 그룹의 카드 확인 횟수를 구했다

Arrays.sort(arr);
if (arr.length == 1) {
    answer = 0;
} else {
    answer = arr[arr.length-1] * arr[arr.length-2];
}
return answer;

arr 배열을 정렬 시켜주고 arr길이가 1이라면 0을, 아니라면 배열 arr의 끝부분과 끝부분-1을 곱하여 정답을 출력하였다

import java.util.ArrayList;
import java.util.Arrays;
 class Solution {
    static boolean[] visit;
    static ArrayList<Integer> al;
    public static int solution(int[] cards) {
        visit = new boolean[cards.length];
        int answer;
        int start_number = 1;
        al = new ArrayList<>();

        int n = 0;
        int m = 0;
        while (start_number != n) {
            n = start_number;
            func(start_number, cards);
            for (int i = 0; i < visit.length; i++) {
                if (!visit[i]) start_number = i+1;
            }
            m++;
        }
        int[] arr = new int[m];

        int k = 0;
        int l = 0;
        for (int j = 0; j < al.size(); j++) {
            if (al.get(j) != 0) {
                k++;
            } else if (al.get(j) == 0) {
                arr[l] = k;
                l++; k=0;
            }
        }
        Arrays.sort(arr);
        if (arr.length == 1) {
            answer = 0;
        } else {
            answer = arr[arr.length-1] * arr[arr.length-2];
        }
        return answer;
    }

    public static void func(int start_number, int[] remain_cards) {
        if (visit[start_number - 1]) {
            al.add(0);
        } else {
            visit[start_number-1] = true;
            al.add(remain_cards[start_number-1]);
            func(remain_cards[start_number-1], remain_cards);
        }
    }
}