문제
https://school.programmers.co.kr/learn/courses/30/lessons/60062
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
코드
import java.util.*;
class Permutation {
private int n;
private int r;
private int[] now; // 현재 순열
private ArrayList<ArrayList<Integer>> result; // 모든 순열
public ArrayList<ArrayList<Integer>> getResult() {
return result;
}
public Permutation(int n, int r) {
this.n = n;
this.r = r;
this.now = new int[r];
this.result = new ArrayList<ArrayList<Integer>>();
}
public void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
public void permutation(int[] arr, int depth) {
// 현재 순열의 길이가 r일 때 결과 저장
if (depth == r) {
ArrayList<Integer> temp = new ArrayList<>();
for (int i = 0; i < now.length; i++) {
temp.add(now[i]);
}
result.add(temp);
return;
}
for (int i = depth; i < n; i++) {
swap(arr, i, depth);
now[depth] = arr[depth];
permutation(arr, depth + 1);
swap(arr, i, depth);
}
}
}
class Solution {
public int solution(int n, int[] weak, int[] dist) {
// 길이를 2배로 늘려서 원형을 일자로 변경
ArrayList<Integer> weakList = new ArrayList<>();
for (int i = 0; i < weak.length; i++) {
weakList.add(weak[i]);
}
for (int i = 0; i < weak.length; i++) {
weakList.add(weak[i] + n);
}
int answer = dist.length + 1;
// 친구 정보를 이용해 모든 순열 계산
Permutation perm = new Permutation(dist.length, dist.length);
perm.permutation(dist, 0);
ArrayList<ArrayList<Integer>> distList = perm.getResult(); // 순열 리스트
// 취약 지점의 각 위치를 출발점으로 설정
for (int start = 0; start < weak.length; start++) {
// 친구 이동 거리의 순열을 하나씩 테스트
for (int i = 0; i < distList.size(); i++) {
int cnt = 1; // 사용한 친구 수 (처음엔 1명으로 시작)
// 첫 번째 친구가 도달할 수 있는 마지막 위치 계산
int position = weakList.get(start) + distList.get(i).get(cnt - 1);
// 취약 지점들 하나씩 확인
for (int index = start; index < start + weak.length; index++) {
// 현재 친구가 도달할 수 없는 취약 지점이 나타나면
if(position < weakList.get(index)) {
cnt += 1; // 새로운 친구 추가
// 친구 수가 부족하면 종료
if (cnt > dist.length) {
break;
}
// 새로운 친구가 도달할 수 있는 마지막 위치 갱신
position = weakList.get(index) + distList.get(i).get(cnt - 1);
}
}
// 최소 인원 갱신
answer = Math.min(answer, cnt);
}
}
// 모든 경우 확인한 후, 친구가 부족하면 -1 반환
if (answer > dist.length) {
return -1;
}
// 최소 인원 반환
return answer;
}
}
'알고리즘' 카테고리의 다른 글
[백준] 경쟁적 전염 (0) | 2025.02.24 |
---|---|
[백준] 연구소 (0) | 2025.02.24 |
[백준] 특정 거리의 도시 찾기 (0) | 2025.02.24 |
[LeetCode] Valid Parentheses (0) | 2024.03.29 |
재귀호출 (Recursive Call) (1) | 2024.03.25 |