🔺 문제
18114번: 블랙 프라이데이
첫 번째 줄에 물건의 개수 N과 제시하는 무게 C가 공백으로 구분되어 주어진다. (1 ≤ N ≤ 5,000, 1 ≤ C ≤ 108, N과 C는 양의 정수) 다음 줄에는 N개의 물건 각각의 무게 w가 공백으로 구분되어 주어진
www.acmicpc.net
🔺 코드
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
import java.util.*;
import java.io.*;
public class Main {
static int N, C;
static List<Integer> w = new ArrayList<>(); // 물건 무게 리스트
static boolean exists = false;
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());
C = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine(), " ");
for(int i = 0 ; i < N ; i++) {
w.add(Integer.parseInt(st.nextToken()));
if(w.get(i) == C) {
System.out.println(1);
return;
}
}
Collections.sort(w); // 이진 탐색 위해 오름차순 정렬
int start = 0;
int end = N - 1;
int weight;
while(start < end) {
weight = w.get(start) + w.get(end); // 물건 2개 골라놓은 상태
if(weight > C) {
end--;
}
else if(weight == C) {
System.out.println(1);
return;
}
else {
if(start < w.indexOf(C - weight) && w.indexOf(C - weight) < end) { // 물건들의 합이 C가 될 수 있는지만 확인
System.out.println(1);
return;
}
start++;
}
}
System.out.println(0);
}
}
|
cs |
🧩 해결 아이디어
• 이진 탐색
1. 리스트에 물건들의 무게 값을 저장한다.
2. 리스트를 오름차순 정렬한다. (이진탐색 목적)
3. 이진 탐색을 통해 물건을 2개 골라둔다.
이 때 물건 2개의 값이 목표 무게보다 크다면 끝 범위를 줄이고,
작다면 목표 무게에서 현재 2개의 무게 값을 빼서 C를 만들 수 있는지 확인하고 시작 범위를 높인다.
물건 2개의 값이 목표 무게 값이라면 1을 출력한다.
🔺 다른 풀이들
- 정렬 후 1개 선택 시에는 이분탐색,
2개 선택 시에는 for문으로 1개 선택하고 left를 i + 1로 잡고 찾고,
3개 선택 시에는 2중 for문으로 2개 선택하고 나머지 elft를 j + 1로 잡고 찾으셨다. (시간 복잡도 : O(N^2 log N))
백준 18114번 - 블랙 프라이데이
n이 최대 5000이므로 단순히 재귀를 통해서 조합을 구하는 것은 무리라고 판단된다.1개, 2개, 3개를 선택할 때마다 각각 이분탐색을 사용한다면 O(logN) , O(nlogN), O($$N^2logN$$) 으로 시간안에 통과할 수
velog.io
- HashSet을 활용하셨다. 간단스!! (시간 복잡도 : O(N^2))
[자바] 백준 18114 - 블랙 프라이데이 (boj java)
문제 : boj18114 1. 한 개만 선택해서 C가 되는 경우 (코드 19~22line 참고) 이 경우는 간단하다. N개를 입력받으면서 해당 값이 C인 경우를 찾으면 된다. O(N) 2. 두 개를 선택해서 C가 되는 경우 (코드 24~31
nahwasa.com
💬 느낀 점
문제가 짧아서 만만하게 보았는데
아이디어 생각까지 은근히 오래 걸리는 문제다..
담엔 혼자 생각해내서 풀어보고 싶다.
1회독 | 2회독 | 3회독 | 4회독 | 5회독 |
V | 240220 |
(참고)
[백준] 18114번 - 블랙 프라이데이 by Java(자바)
✨ 문제 ✨ 접근 ✨ 코드 ✨ 결과  | 2023.12.01 |
---|---|
[백준/JAVA] 1251번: 단어 나누기 (0) | 2023.11.30 |
[백준/JAVA] 2548번: 대표 자연수 (0) | 2023.11.29 |
[백준/JAVA] 14929번: 귀찮아 (SIB) (0) | 2023.11.28 |
[백준/JAVA] 2573번: 빙산 (0) | 2023.10.06 |