코테연습

백준 16953문제 A->B

jackypark 2022. 8. 30. 01:42

처음에는 문제 그대로 2를 곱하고 마지막에 1의 수를 가장 오른쪽에 추가하는 방식을 선택했다 하지만 그 방식을 사용하게 되면 조금 오래 걸려서 좀 더 빠르게 하는 방법이 없을까 생각했다. 그래서 역순으로 한번 해봤다 그러자 시간이 줄긴 했다..

풀이는 다음과 같다.. 문제가 설명한 것의 반대로 B가 2로 나누어 떨어지면 2로 나누고 B의; 끝자리가 1이면 1을 제거한다

 

코드는 다음과 같다

package codetest;

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //Scanner 대신 사용 
		StringTokenizer st = new StringTokenizer(br.readLine());

		int a = Integer.parseInt(st.nextToken()); //입력받은거 int형으로 변환
		int b = Integer.parseInt(st.nextToken());

		int cnt = 1;
		while (b != a) { 
			if (b < a) { 
				System.out.println(-1);
				return;
			}
			String str = String.valueOf(b); // 마지막 끝자리에 1인지 확인하기위해 String 형태로 형변환
			if (b % 2 == 0) { //b가 2로 나머지없이 나누어 떨어지면
				b /= 2; //b 를 2로 나눈다
			} else if (str.charAt(str.length() - 1) == '1') { // 만약 마지막 글자가 1이면 즉 마지막 숫자가 1이면
				str = str.substring(0, str.length() - 1); // 문자를 마지막 전까지 짜름 즉 0부터 마지막인 1을 제외하기 직전까지 새로운 문자를 만듬
				b = Integer.parseInt(str);// 문자를 다시 int로 형변환
			} else {
				System.out.println(-1); //만들수 없는경우 -1
				return;
			}
			cnt++; //성공시 횟수 증가
		}

		System.out.println(cnt);
	}
}