컴퓨터 공학/백준

백준 27960: 사격내기 [java]

코딩하는 Español되기 2024. 1. 24. 10:51

그 전에 비트마스킹을 공부했어서 익히기 위해 비트마스킹 문제를 풀어보고자 찾아보고

쉬운 것부터 풀자는 생각으로 이 문제를 풀어보았다.

 

<비트마스킹 자료>

2024.01.22 - [컴퓨터 공학/Algorithm] - [Algorithm] Bit와 BitMask (java)

 

[Algorithm] Bit와 BitMask (java)

백준 문제를 풀다가 비트마스킹 부분이 나왔다. 배운적이 없기에 다른 블로그를 찾아가며 공부하고 이해한 내용을 정리해보았다. https://loosie.tistory.com/238 [알고리즘] 비트(Bit)와 비트마스크(BitMas

joowon582.tistory.com

<백준 27960: 사격내기>

https://www.acmicpc.net/problem/27960

 

27960번: 사격 내기

A, B, C는 올해에도 예비군 훈련을 받으러 간다. 이번 예비군 훈련 과정 중에는 영점 사격이 있으며, 10개의 과녁 각각에 점수를 매겨 맞춘 과녁 점수의 총합을 측정한다. 과녁을 맞혔을 때, 과녁별

www.acmicpc.net

문제


 

코드에서 메인에 바로 로직을 작성하지 않는 게 좋다는 걸 깨닫고 밖에다가 작성하였다.

 

이 문제에서 과녁별 점수가 1 / 2 / 4 / 8 / 16 .... 512점을 얻는다고 한다.
이걸 보면 점수가 2진수의 자리수를 뜻하는 것을 알 수 있다.

 

그 전에 포스팅한 비트 연산자 <<로 점수를 구분해서 구현하면 쉽게 문제를 풀 수 있다.

코드


public class Main{
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
    public static void main(String[] args)throws Exception{
		new Main().sol();
	}

	private void sol() throws Exception{
		StringTokenizer st = new StringTokenizer(br.readLine());
		int a = Integer.parseInt(st.nextToken());
		int b = Integer.parseInt(st.nextToken());

		int c = 0; int score = 512;

		while(score > 0){
			int cnt = 0;

			if(a >= score){
				cnt++; a -= score;
			}
			if(b >= score){
				cnt++; b -= score;
			}
			if(cnt == 1) {
				c += score;
			}
			score >>= 1; 
            // a와 b가 512보다 작으면 score의 비트가 오른쪽으로 1칸 이동하여
            // 256 128 64 .... 으로 작아지게 된다.
		}
		System.out.println(c);
	}

}

 

비트마스킹에 대해 안다면 쉽게 풀 수 있는 문제였다.