- [소프티어] 택배 마스터 광우2025년 02월 05일 17시 13분 19초에 업로드 된 글입니다.작성자: do_hyuk
https://softeer.ai/practice/6273
Softeer - 현대자동차그룹 SW인재확보플랫폼
softeer.ai
이 문제는 레일의 순서를 임의로 변경 가능하기 때문에 각각의 경우의 수를 모두 찾아서 그 중 최소값을 찾는 문제라고 생각했고, 백트래킹을 사용하면 된다고 판단했다.
백트래킹을 사용하기 전 시간복잡도를 먼저 알아보자면
레일의 개수는 최대 10개이고, 일의 시행 횟수는 최대 50이기 때문에 worst case 여도 10 x 50 = 500번 정도 이기 때문에
충분히 O(n^2) 작업도 가능하다.
1. 만들어질 수 있는 모든 레일의 경우의 수를 구한다.
2. 각각의 경우 마다 광우가 들 수 있는 택배의 무게를 구한다.
3. 각 경우의 수마다 구해진 택배 무게 중 최소값을 찾는다.
1. 레일의 모든 경우의 수 탐색 및 택배 최소 무게 찾기
백트래킹을 통해 모든 경우의 수를 찾는다.
// bfs(0, new int[n]) <- bfs 초기값 private static void bfs(int count, int[] boxSeq) { if (count == n) { int w = calculateWeight(boxSeq); minWeight = Math.min(minWeight, w); return; } for (int i=0; i<n; i++) { if(!visit[i]) { visit[i] = true; boxSeq[count] = boxs[i]; bfs(count+1, boxSeq); visit[i] = false; } } }
2. 광우가 들 수 있는 택배의 총 무게를 구한다.
private static int calculateWeight(int[] boxSeq) { int result = 0; int idx = 0; for (int t=0; t<k; t++) { int curWeight = 0; while (curWeight + boxSeq[idx] <= m) { curWeight += boxSeq[idx]; idx = idx + 1 == n ? 0 : idx + 1; } result += curWeight; } return result; }
전체 코드
import java.io.*; import java.util.*; public class Main { private static int n,m,k,minWeight = 987654321; private static int[] boxs; private static boolean[] visit; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()," "); n = Integer.parseInt(st.nextToken()); m = Integer.parseInt(st.nextToken()); k = Integer.parseInt(st.nextToken()); boxs = new int[n]; visit = new boolean[n]; st = new StringTokenizer(br.readLine()," "); for (int i=0; i<n; i++) { boxs[i] = Integer.parseInt(st.nextToken()); } bfs(0, new int[n]); System.out.println(minWeight); } private static void bfs(int count, int[] boxSeq) { if (count == n) { int w = calculateWeight(boxSeq); minWeight = Math.min(minWeight, w); return; } for (int i=0; i<n; i++) { if(!visit[i]) { visit[i] = true; boxSeq[count] = boxs[i]; bfs(count+1, boxSeq); visit[i] = false; } } } private static int calculateWeight(int[] boxSeq) { int result = 0; int idx = 0; for (int t=0; t<k; t++) { int curWeight = 0; while (curWeight + boxSeq[idx] <= m) { curWeight += boxSeq[idx]; idx = idx + 1 == n ? 0 : idx + 1; } result += curWeight; } return result; } }
'코딩문제' 카테고리의 다른 글
[백준] 쉬운 최단거리 (0) 2025.02.09 [소프티어] 나무조경 (1) 2025.02.06 [소프티어] 출퇴근길 (1) 2025.02.03 [소프티어] 징검다리 (0) 2025.01.24 [소프티어] 성적평균 (1) 2025.01.23 댓글