문제 : https://www.acmicpc.net/problem/5671

 

5671번: 호텔 방 번호

선영이는 집 호수에 반복되는 숫자가 있는 경우에는 그 집에 사는 사람에게 불운이 찾아온다고 믿는다. 따라서, 선영이는 838호나 1004호와 같이 한 숫자가 두 번 이상 들어있는 집에는 절대 살지

www.acmicpc.net

문제 요약 : 주어진 구간의 반복되는 숫자가 없는 수의 개수 출력

입력 출력
1 ≤ N ≤ M ≤ 5000
주어진 구간의 반복되는 숫자가 없는 수의 개수

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_5671.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
30897530 cbkpar 5671 맞았습니다!! 14932KB 140ms Java 11 876B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
	
	public static void main(String args[]) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int t,i,n,m;
		String str;
		int[] arr = new int[5001];
		for(i=1;i<=5000;i++) {
			boolean[] chk = new boolean[10];
			t = i;
			while(true) {
				if(t==0) {
					arr[i] = 1;
					break;
				}
				if(chk[t%10]) break;
				chk[t%10] = true;
				t/=10;
			}
		}
		for(i=2;i<=5000;i++) arr[i] += arr[i-1];
		while((str=br.readLine())!=null) {
			StringTokenizer st = new StringTokenizer(str);
			n = Integer.parseInt(st.nextToken());
			m = Integer.parseInt(st.nextToken());
			sb.append((arr[m]-arr[n-1])+"\n");
		}
		System.out.println(sb);
	}
}

1부터 5000까지 해당 숫자가 반복되는 숫자가 있는지 없는지 확인한다.

있을 경우 0, 없을 경우 1로 두며

1부터 N까지의 합을 arr[N]으로 만들어준다.

이때 n부터 m까지의 합은

(1부터 m까지의 합) - (1부터 n-1까지의 합) 이므로

arr[m] - arr[n-1] 값을 출력해주면 된다.

 

+ Recent posts