곽로그
[백준 1107, Java] 리모컨 본문
반응형
실수모음
1. 이상한 while
코드
//N보다 큰 곳에서 N쪽으로 접근
int n = N;
while(!canPush(n)) {
++n;
}
int pushCount = getDigit(n) + (n-N);
min = Math.min(min, pushCount);
원래의도
n을 누를 수 없으면 하나씩 증가시킨다. while문을 빠져나오는 경우에는 누를 수 있는 경우라 생각하고 빠져나온 n에 대해서 최소누름횟수를 구함
생각하지 못한 것
1) while종료 조건
2) n이 음수가 되는 경우
2. 0 조건을 빼먹음
public static boolean canPush(int n) {
while(n>0) {
int temp = n%10;
if(broken[temp]) {
return false;
}
n = n/10;
}
return true;
}
만약 n이 0이면 항상 true를 반환한다
3. 참/거짓을 반대로 생각
public static boolean canPush(int n) {
if(n==0) {
return broken[0];
}
while(n>0) {
int temp = n%10;
if(broken[temp]) {
return false;
}
n = n/10;
}
return true;
}
0이 고장났으면(true) 누를 수 없다(false)인데 ... 생각없이 푼 듯
4. return
int min =Math.abs(currentPoint-destination); // +,-만 눌러서 이동
if(destination< currentPoint) {
//목적지보다 큰 숫자에서 목적지로 접근
for(int temp = destination; temp<currentPoint; temp++) {
if(canPush(temp)) {
int count = getDigit(temp) + (temp-destination);
min = Math.min(min, count);
return min;
}
}
//목적지보다 작은 숫자에서 목적지로 접근
for(int temp = destination; temp>=0; temp--) {
if(canPush(temp)) {
int count =getDigit(temp) + (destination-temp);
min = Math.min(min, count);
return min;
}
}
}
else {
//목적지보다 큰 숫자에서 목적지로 접근
for(int temp = destination; temp<destination+min; temp++) {
if(canPush(temp)) {
int count = getDigit(temp) + (temp-destination);
min = Math.min(min, count);
return min;
}
}
//목적지보다 작은 숫자에서 목적지로 접근
for(int temp = destination; temp>=destination-min; temp--) {
if(canPush(temp)) {
int count =getDigit(temp) + (destination-temp);
min = Math.min(min, count);
return min;
}
}
}
return min;
}
5가지 경우의 최소값을 구하고, 최종적으로 구한 최솟값을 한번만 반환 해야하는데 중간중간 최솟값을 구하면 바로 return 해버림
5. NullPointerError
M이 0인경우 . 즉 고장난 버튼이 한개도 없는 경우에 대해서는 입력받을 br.readLine()이 없다. 따라서 M!=0 인경우에만 입력을 받아야한다
if(M !=0) {
st = new StringTokenizer(br.readLine()," ");
for(int m = 0; m<M; m++) {
int number = Integer.parseInt(st.nextToken());;
broken[number] = true;
}
}
최종코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static boolean[] broken;
static int min = 500_000;
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
M = Integer.parseInt(br.readLine());
broken = new boolean[10];
if(M!=0){
st = new StringTokenizer(br.readLine()," ");
for(int idx = 0; idx<M; idx++) {
int button = Integer.parseInt(st.nextToken());
broken[button] = true;
}
}
//+,-만 누르기
min = Math.min(min, Math.abs(N-100));
//N보다 큰 곳에서 N쪽으로 접근
for(int temp =N; temp<N+min; temp++) {
if(canPush(temp)) {
int pushCount = getDigit(temp) + (temp-N);
min = Math.min(min, pushCount);
break;
}
}
//N보다 작은 곳에서 N쪽으로 접근
for(int temp =N; temp>=0; temp--) {
if(canPush(temp)) {
int pushCount = getDigit(temp) + (N-temp);
min = Math.min(min, pushCount);
break;
}
}
bw.write(String.valueOf(min));
bw.flush();
}
public static boolean canPush(int n) {
if(n==0) {
return !broken[n];
}
while(n>0) {
int temp = n%10;
if(broken[temp]) {
return false;
}
n = n/10;
}
return true;
}
public static int getDigit(int n) {
int digit = 0;
if(n==0) {
digit =1;;
}
else {
while(n>0) {
++digit;
n = n/10;
}
}
return digit;
}
}
반응형
'알고리즘 > 백준' 카테고리의 다른 글
[백준 18290, 자바] NM과 K (1) renew (0) | 2021.03.30 |
---|---|
[백준 15649,Java] N과 M(1) renew (0) | 2021.03.29 |
[백준 3085, Java] 사탕 게임 renew (0) | 2021.03.23 |
[백준 13458, Java] 시험 감독 (0) | 2021.03.19 |
[백준 3190, Java] 뱀 (0) | 2021.02.26 |
Comments