백준 25166번: 배고픈 아리의 샌드위치 구매하기

최창효·2022년 8월 26일
0
post-thumbnail

문제 설명

접근법

  • 아리가 가진 1023원은 2진수로 나타내면 1111111111 입니다.

    • 1023이하의 모든 수는 __________01로 채울 수 있습니다. 즉 모든 화폐를 한번 또는 0번 써서 1023이하의 숫자를 만다는 의미입니다.
  • 숫자&숫자의 연산은 두 숫자를 2진수로 변환했을 때 각 자릿수가 모두 1이면 1으로, 그렇지 않으면 0으로 채워진 2진수가 반환됩니다.

    • 100&110100이 됩니다. 이때 실제로 적용할 때에는 String의 2진수가 아니라 원래의 int값으로 계산해야 합니다.
      • 즉, 4&5를 했을 때 그 결과값은 4를 반환합니다.
    • 자릿수가 다른 경우에도 알맞게 계산해 줍니다.
      • 2&7은 각각 2진수일 때 10110입니다. 이때 자릿수가 짧은 1010_가 아닌 _10으로 110과 비교되고 그 결과 0102가 반환됩니다.
  • (a&b) == a의 의미는 a가 1인 곳에서는 b가 모두 1이였다는 의미입니다.

정답

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

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		if(a<1024) {
			System.out.println("No thanks");
		}else {
			int needMoney = a-1023;
			int borrowMoney = b;
			if((needMoney&borrowMoney) == needMoney) {
				System.out.println("Thanks");
			}else{
				System.out.println("Impossible");
			}
			
		}
		
	}
	
	
}

비트마스킹 없이 푼 방법

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

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		String money = Integer.toBinaryString(1023);
		String price = Integer.toBinaryString(a);
		if(a<1024) {
			System.out.println("No thanks");
		}else {
			String needMoney = Integer.toBinaryString(a-1023);
			String borrowMoney = Integer.toBinaryString(b);
			if(func(needMoney,borrowMoney)) {
				System.out.println("Thanks");
			}else{
				System.out.println("Impossible");
			};
		}
		
	}
	
	public static boolean func(String needMoney, String borrowMoney) {
		StringBuilder sb = new StringBuilder();
		String a;
		String b;
		if(needMoney.length()<borrowMoney.length()) {
			for (int i = 0; i < borrowMoney.length() - needMoney.length(); i++) {
				sb.append("0");
			}
			sb.append(needMoney);
			a = sb.toString();
			b = borrowMoney; 
		}else if(needMoney.length()>borrowMoney.length()) {
			for (int i = 0; i < needMoney.length() - borrowMoney.length(); i++) {
				sb.append("0");
			}
			sb.append(borrowMoney);
			a = sb.toString();
			b = needMoney; 
		}else {
			a = needMoney;
			b = borrowMoney;
		}
		
		for (int i = 0; i < a.length(); i++) {
			if(a.charAt(i) != b.charAt(i)) return false;
		}
		return true;
		
		
	}
	
}
profile
기록하고 정리하는 걸 좋아하는 개발자.

0개의 댓글