반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준자바
- 자바의정석연습문제
- 백준단계별로풀어보기
- 코딩공부
- 빅오 표기법
- 백준
- ★
- 브루트포스
- 자바
- 무료코딩강의
- 자바개념
- 자바의정석
- 백트래킹
- 개발공부
- dfs
- Java개념
- 알고리즘공부
- 무료개발강의
- 자바공부
- 다이나믹 프로그래밍
- 자바의정석연습문제풀이
- 동적계획법
- 백준알고리즘
- 시간 복잡도
- 알고리즘
- dp
- java
- BFS
- 백준9단계
- ☆
Archives
- Today
- Total
더 많이 실패하기
공부 149일차: 백준 1107번 리모컨 자바 java 본문
반응형
1107 리모컨
https://www.acmicpc.net/problem/1107
1107번: 리모컨
첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼
www.acmicpc.net
백준 1107번 문제 리모컨
문제

과정 생각해보기 & 오답
바로 오답부터..
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
53
54
55
|
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
int n = Integer.parseInt(br.readLine()); // 채널
int m = Integer.parseInt(br.readLine()); // 고장난 버튼 개수
int[] brokenBtn = new int[m]; // 고장난 버튼 목록
int[] originalBtn = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
ArrayList<String> btns = new ArrayList<String>();
int count = 0; // 버튼 누른 횟수
int currentCh = 100; // 현재 채널
st = new StringTokenizer(br.readLine());
for(int i = 0; i < m; i++) {
brokenBtn[i] = Integer.parseInt(st.nextToken());
}
if(n == 100) { // 원하는 채널이 100이면 움직일 필요 없으므로
System.out.println(0); // 0을 출력한 뒤
return; // 코드를 끝낸다
}
for(int i = 0; i < 10; i++) {
// 오름차순으로 입력되는 게 아니므로 망가진 버튼 다 검사해야 함
for(int num : brokenBtn) {
if(originalBtn[i] == num) {
originalBtn[i] = -1; // 고장났으면 -1로 초기화
}
}
if(originalBtn[i] != -1) {
btns.add(originalBtn[i]+""); // list에 넣기
}
}
/*디버깅
System.out.println(Arrays.toString(originalBtn));
for(String str : btns) {
System.out.print(str+" ");
}
*/
/*
구할 수 있는 숫자 조합 다 만들기 -> min = Math.min(min, n - 숫자조합 + 숫자의 자리수)
*/
}
}
|
cs |
이렇게 접근했는데 숫자 조합 만드는 데서 막혔다
배열에 주어진 숫자들로 만드려고 한다면 할 수는 있겠지만 너무 복잡하다는 생각..
그리고 방법을 찾았다
1부터 999,999까지 (n이 500,000이고, 금지된 숫자가 많을 때 999,999가 가장 가까울 수 있기 때문) 탐색하고,
금지된 버튼이 들어가 있다면 탐색에서 제외한다
어떻게 조합할지를 고민하는 게 아니라, 다 구하고 거기서 제외시키는 것!
완전 브루트 포스 문제
참고 블로그
https://moonsbeen.tistory.com/64
https://nanyoungkim.tistory.com/124
https://1-7171771.tistory.com/37
정답 인정 코드
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
|
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException{
//BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//StringTokenizer st = null;
Scanner sc = new Scanner(System.in);
ArrayList<Integer> brokenBtn = new ArrayList<Integer>();
int n = sc.nextInt(); // 채널
int m = sc.nextInt(); // 고장난 버튼 개수
//st = new StringTokenizer(br.readLine());
for(int i = 0; i < m; i++) {
brokenBtn.add(sc.nextInt());
}
int min = Math.abs(n - 100); // 모든 숫자버튼이 고장났을 때는 +, -로만 움직여야 한다
for(int i = 0; i <1_000_000; i++) {
String str = String.valueOf(i);
int len = str.length();
boolean isBreak = false;
for(int j = 0; j < len; j++) {
if(brokenBtn.contains(str.charAt(j)-'0')) {
// 0~999,999에 해당하는 숫자 i의 자리수 중 하나가 고장난 버튼의 숫자라면
isBreak = true;
break; // 빠져나온다 (그 숫자 거름)
}
}
if(!isBreak) {
min = Math.min(min ,Math.abs(n - i)+len);
}
}
System.out.println(min);
}
}
|
cs |
다 똑같이해도 BufferedReader로 입력하면 NullPointer 런타임에러가 뜨는데 이유가 짐작가지 않는다
또 숫자 문제를 문자열로 바꿔서 더하려다가.............
직접 구하는 게 아니라 뺴는 여집합 같은 접근법도 있음을 다시 한 번 상기하기
반응형
'알고리즘 > 백준' 카테고리의 다른 글
공부 152일차: 백준 15649번 N과 M (1) 자바 java (0) | 2022.12.29 |
---|---|
공부 151일차: 백준 1748번 수 이어 쓰기 1 자바 java (0) | 2022.12.28 |
공부 148일차: 백준 1476번 날짜 계산 자바 java (0) | 2022.12.25 |
공부 147일차: 백준 3085번 사탕 게임 자바 java (0) | 2022.12.24 |
공부 146일차: 백준 2309번 일곱 난쟁이 자바 java (0) | 2022.12.23 |