https://school.programmers.co.kr/learn/courses/30/lessons/131130
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);
}
}
}
'Programmers' 카테고리의 다른 글
[프로그래머스][JAVA]Lv. 2 - 귤 고르기 (0) | 2024.02.19 |
---|---|
[프로그래머스][JAVA]Lv. 2 - 숫자 카드 나누기 (0) | 2024.01.31 |
[프로그래머스][JAVA]Lv. 2 - 할인 행사 (1) | 2024.01.14 |
[프로그래머스][JAVA]Lv. 2 - 두 큐 합 같게 만들기 (0) | 2024.01.14 |
[프로그래머스][JAVA]Lv. 2 - k진수에서 소수 개수 구하기 (0) | 2024.01.14 |