곽로그

[백준 1107, Java] 리모컨 본문

알고리즘/백준

[백준 1107, Java] 리모컨

일도이동 2021. 3. 24. 23:03
반응형

 

실수모음

 

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