
문제분석
정확히 백준 2569 짐정리와 같은 문제이다
solved.ac에 적용이 안되어 이유를 보니, 이 문제와 같은 문제여서 2569가 등록이 안되더라. 그래서 코드 일부(long)만 수정하여 푼 문제로 등록하였다.
해결과정
완벽하게 2569와 같은 문제(long 신경 써 줘야 하는것 제외하면)이다. 따라서 아래 글을 참고하면 된다.
https://chabin37.tistory.com/99
[JAVA] 백준 2569 짐정리
https://www.acmicpc.net/problem/2569 그리디가 메인인 문제인 줄 알고 풀었으나, 알고보니 사이클 관련 문제였다...그래도 그리디가 있긴 하지만..뭔가 찜찜..문제분석처음엔 그리디에 초점을 두고, 최소
chabin37.tistory.com
문제에서 2^30까지 신경써야 한다고 명시해줬으므로, int 대신 long을 사용하였다.
import java.util.*;
import java.io.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int N = Integer.parseInt(br.readLine());
StringTokenizer st = new StringTokenizer(br.readLine());
long[][] arr = new long[N][2]; // [[짐 무게, 정렬 전 인덱스], ...]
for(int i = 0; i < N ; i++){
long lug = Long.parseLong(st.nextToken());
arr[i][0]=lug;
arr[i][1]=i;
}
Arrays.sort(arr,(a,b)->Long.compare(a[0], b[0]));
long[] visited = new long[N];
Arrays.fill(visited,0);//0이면 미방문, 1이면 방문
long price = 0;
for(int i = 0; i < N; i++){
if(visited[i]==1){
continue;
}else{
int next = i;
int cycle = 0;
while(visited[next]==0){
price += arr[next][0];
visited[next]=1;
next = (int)arr[next][1];
cycle += 1;
}
price += Math.min(arr[i][0] * (cycle - 2), arr[0][0] * (cycle+1) + arr[i][0]);
}
}
bw.write(String.valueOf(price));
bw.newLine();
bw.flush();
bw.close();
}
}

'알고리즘&PS > PS' 카테고리의 다른 글
| [JAVA] 백준 16946 벽 부수고 이동하기 4 (2) | 2025.07.15 |
|---|---|
| [JAVA] 백준 2667 단지번호붙이기 (0) | 2025.07.14 |
| [JAVA] 백준 1715 카드 정렬하기 (0) | 2025.07.08 |
| [JAVA] 백준 2569 짐정리 (1) | 2025.07.08 |
| [JAVA] 백준 1700 멀티탭 스케줄링 (1) | 2025.07.06 |