두 개의 숫자 X, Y가 주어지면 X 이상 Y 이하에 있는 '흥미로운 숫자'의 개수를 구하는 문제입니다.
'흥미로운 숫자'란 모든 자릿수에 있는 숫자가 같지만, 정확히 한 자리만 다른 숫자를 의미합니다.
예를 들어, 33335와 11118은 '흥미로운 숫자'지만, 333333과 111188은 그렇지 않습니다.
HashMap 활용: 각 숫자의 빈도를 저장merge() 메서드 사용: map.merge(c, 1, Integer::sum)을 통해 키가 존재하면 1 증가, 없으면 1로 초기화map.values().stream().anyMatch(v -> v == 1)을 사용하여 1인 값이 존재하는지 확인import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int x = sc.nextInt();
int y = sc.nextInt();
int cnt = 0;
for (int i = x; i <= y; i++) {
String str = String.valueOf(i);
Map<Character, Integer> map = new HashMap<>();
for (int j = 0; j < str.length(); j++) {
char c = str.charAt(j);
map.merge(c, 1, Integer::sum);
}
if (map.size() == 2 && map.values().stream().anyMatch(v -> v == 1))
cnt++;
}
System.out.println(cnt);
}
}
문자열 변환 및 HashMap 생성
String.valueOf(i): 숫자를 문자열로 변환 HashMap<Character, Integer>: 각 자리 숫자의 등장 횟수를 저장 문자 개수 카운트 (merge 사용)
map.merge(c, 1, Integer::sum); +1 추가 1로 초기화 조건 체크 ('흥미로운 숫자'인지 확인)
map.size() == 2: 정확히 두 개의 숫자로 이루어져 있는지 확인 map.values().stream().anyMatch(v -> v == 1): 등장 횟수가 1인 숫자가 존재하는지 확인 merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction)
value를 저장하고, 값이 있으면 remappingFunction을 적용하여 갱신 map.merge(c, 1, Integer::sum); → 값이 있으면 +1, 없으면 1 remappingFunction 설명
remappingFunction은 기존 값과 새로 추가될 값을 조합하는 함수입니다. Integer::sum을 사용하면 기존 값과 1을 더한 결과를 저장합니다. 3이고 새로운 값이 1이라면 Integer::sum을 적용하여 3 + 1 = 4가 저장됩니다. stream().anyMatch(predicate)
true 반환 map.values().stream().anyMatch(v -> v == 1) → 값이 1인 요소가 존재하는지 확인