| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
Tags
- 동적계획법
- 컴퓨터비전
- level3
- JavaScript
- cpp
- 컴퓨터 비전
- dfs
- kotlin
- java
- 다이나믹 프로그래밍
- 자바
- lv2
- 백준
- c++
- 구현
- Stack
- 그리디
- 우선순위큐
- dp
- level2
- 코틀린
- 프로그래머스
- 통신 인터페이스
- 누적합
- BFS
- 이분탐색
- 임베디드
- 2018 KAKAO BLIND RECRUITMENT
- 다이나믹프로그래밍
- C
Archives
- Today
- Total
코드를 느껴바라
1106번 : 호텔 [JAVA] 본문
문제 링크
성공 여부(걸린 시간): 성공 (33분 20초)
아이디어
이 문제는 일단 BFS로 풀면 간단하게 풀릴 수 있는 문제이다.
그런데 처음에 단순 최단거리를 구하는 것이 아니기에 DFS로 해볼까 하다가
최악의 경우인 20마을 전체에 C는 1000이고 각 마을에는 고객이 한명씩만 존재한다는 가정에서는
수많은 재귀호출이 발생할 것이라는 생각을 하였고 DP또는 BFS로 하면 되겠다고 생각이 들었다.
문제에서 정수 배수만큼 한꺼번에 처리할 수 있다는 그런 말이 있는데
여기서 오해하면 안되는 것이 한번에 최대로 고객 끌어올 수 있을 만큼만 처리하면
올바른 결과가 결코 나오지 않는다. 그래서 나는 무조건 1배수로 광고를 하기로 했다.
일단 BFS 동작에서의 핵심은 이렇다.
- 방문처리 -> visited[고객 수] = 비용 저장
- C를 초과하는 것도 성공했다고 봐야함 -> 이번 연산의 customer수가 C이상이면 결과 비교 후 저장
정답 코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int C = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
ArrayList<int []> info = new ArrayList<>();
for(int i=0; i<N; i++){
st = new StringTokenizer(br.readLine());
info.add(new int[]{Integer.parseInt(st.nextToken()),Integer.parseInt(st.nextToken())});
}
ArrayDeque<int []> q = new ArrayDeque<>();
int [] visited = new int[C+1002];
Arrays.fill(visited, Integer.MAX_VALUE);
q.add(new int[]{0, 0});// 비용, 고객 수
while (!q.isEmpty()){
int [] cur = q.poll();
int cost = cur[0];
int customer = cur[1];
if(customer>=C){
visited[C] = Math.min(cost, visited[C]);
continue;
}
for (int [] x: info){
int dx = x[0]+cost;
int dy = x[1]+customer;
if(dy<=C+1001 && visited[dy]>dx){
visited[dy] = dx;
q.add(new int []{dx, dy});
}
}
}
System.out.print(visited[C]);
}
}반응형
'PS > 백준(Baekjoon)' 카테고리의 다른 글
| 10653번 : 마라톤 2 [JAVA] (0) | 2025.12.02 |
|---|---|
| 2638번 : 치즈 [JAVA] (0) | 2025.11.09 |
| 14867번 : 물통 [JAVA] (0) | 2025.10.30 |
| 13549번 : 숨바꼭질 3 [JAVA] (0) | 2025.10.28 |
| 1956번 : 운동 [JAVA] (0) | 2025.10.27 |
