알고리즘(백준 등) 공부/백준(자바)

백준 1341번: 사이좋은 형제

posite 2026. 3. 27. 11:55

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

 

영식과 민식이가 케이크를 남아있는 양의 절반씩 먹을 때, 영식이가 먹게되는 케이크의 양이 분수로 주어진다. 분수에 해당하는 패턴을 구하는 문제이다. 분자는 a, 분모는 b 이다. 먹는 양의 총 합은 2^n -1 이므로 b의 배수 중에 2^n-1이 있는지 찾은 후 배수*a를 2진수로 변환하면 패턴이 된다.

 

우선, 예외 상황을 제거한다. a가 0이면 나머지를 민식이가 먹으므로 -을 출력하고 종료한다. b가 1이면 a도 1이므로 전부 영식이가 먹으므로 *을 출력한다.

if (a == 0) {
    System.out.print("-");
    return;
}
if (b == 1) {
    System.out.print("*");
    return;
}

 

 

이후, 배수를 구한다. 2^n -1을 b로 나누었을 때 나머지가 0이면 배수를 저장하고 멈춘다. 배수가 없으면 불가능한 경우이므로 -1을 출력하고 종료한다.

long m = -1;
int n = 0;
for (int i = 1; i <= 60; i++) {
    long pow = (1L << i) - 1;
    if (pow % b == 0) {
        m = pow / b;
        n = i;
        break;
    }
}

if (m == -1) {
    System.out.print(-1);
    return;
}

 

 

마지막으로, 배수*a 를 2진수로 표시 후 1은 *, 0은 -로 치환해주면 된다.

long t = m * a;
StringBuilder sb = new StringBuilder(Long.toBinaryString(t));
while (sb.length() < n) {
    sb.insert(0, '0');
}

for (int i = 0; i < sb.length(); i++) {
    sb.setCharAt(i, sb.charAt(i) == '1' ? '*' : '-');
}

System.out.print(sb);

 

 

결과 코드는 다음과 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class 사이좋은형제1341 {
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        long a = Long.parseLong(st.nextToken()), b = Long.parseLong(st.nextToken());
        
        if (a == 0) {
            System.out.print("-");
            return;
        }
        if (b == 1) {
            System.out.print("*");
            return;
        }
        
        long m = -1;
        int n = 0;
        for (int i = 1; i <= 60; i++) {
            long pow = (1L << i) - 1;
            if (pow % b == 0) {
                m = pow / b;
                n = i;
                break;
            }
        }
        
        if (m == -1) {
            System.out.print(-1);
            return;
        }
        
        long t = m * a;
        StringBuilder sb = new StringBuilder(Long.toBinaryString(t));
        while (sb.length() < n) {
            sb.insert(0, '0');
        }
        
        for (int i = 0; i < sb.length(); i++) {
            sb.setCharAt(i, sb.charAt(i) == '1' ? '*' : '-');
        }
        
        System.out.print(sb);
    }
}