알고리즘(백준 등) 공부

SWEA 14450. 정수 입력기

posite 2026. 5. 11. 12:41

구간 [L, R] 이 주어지고 Q개의 정수가 주어질 때, 숫자가 구간 안에 포함되는지 확인하는 문제이다.

 

숫자가 구간 안에 들어온다는 것은 구간 안의 어떤 숫자의 접두사가 될 수 있다는 것이다. 즉, 입력된 숫자를 low,와 high로 나눈 후,  끝에 0과 9를 계속 붙여서 확장하면서 R보다 작거나 같으면서 숫자가 구간 안에 들어가는지 확인해야 한다. R보다 커질 때 까지 못 찾으면 불가능한 숫자이다.

private static boolean isValidPrefix(long L, long R, long n) {
    long currentLow = n;
    long currentHigh = n;
    while (currentLow <= R) {
        if (Math.min(currentHigh, R) >= Math.max(currentLow, L)) {
            return true;
        }
        currentLow *= 10;
        currentHigh = currentHigh * 10 + 9;
        if (currentLow > R) break;
    }

    return false;
}

 

 

결과 코드는 다음과 같다.

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

public class Solution {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());
        StringBuilder sb = new StringBuilder();

        for (int tc = 1; tc <= T; tc++) {
            sb.append('#').append(tc).append(' ');
            StringTokenizer st = new StringTokenizer(br.readLine());
            long l = Long.parseLong(st.nextToken()), r = Long.parseLong(st.nextToken());
            int q = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine());
            for (int i = 0; i < q; i++) {
                long n = Long.parseLong(st.nextToken());
                if (isValidPrefix(l, r, n)) {
                    sb.append('O');
                } else {
                    sb.append('X');
                }
            }
            sb.append('\n');
        }
        
        br.close();
        System.out.print(sb);
    }
    
    private static boolean isValidPrefix(long L, long R, long n) {
        long currentLow = n;
        long currentHigh = n;
        while (currentLow <= R) {
            if (Math.min(currentHigh, R) >= Math.max(currentLow, L)) {
                return true;
            }
            currentLow *= 10;
            currentHigh = currentHigh * 10 + 9;
            if (currentLow > R) break;
        }

        return false;
    }
}