흥미로운 숫자 2 문제 풀이

JunHyeok Seo·2025년 3월 18일

algorithm

목록 보기
9/30

문제 설명

두 개의 숫자 X, Y가 주어지면 X 이상 Y 이하에 있는 '흥미로운 숫자'의 개수를 구하는 문제입니다.
'흥미로운 숫자'란 모든 자릿수에 있는 숫자가 같지만, 정확히 한 자리만 다른 숫자를 의미합니다.
예를 들어, 3333511118은 '흥미로운 숫자'지만, 333333111188은 그렇지 않습니다.


풀이 방법 (Java 활용)

핵심 Java 문법

  • HashMap 활용: 각 숫자의 빈도를 저장
  • merge() 메서드 사용: map.merge(c, 1, Integer::sum)을 통해 키가 존재하면 1 증가, 없으면 1로 초기화
  • Stream API 활용: map.values().stream().anyMatch(v -> v == 1)을 사용하여 1인 값이 존재하는지 확인

Java 코드

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);
    }
}

핵심 코드 설명

  1. 문자열 변환 및 HashMap 생성

    • String.valueOf(i): 숫자를 문자열로 변환
    • HashMap<Character, Integer>: 각 자리 숫자의 등장 횟수를 저장
  2. 문자 개수 카운트 (merge 사용)

    • map.merge(c, 1, Integer::sum);
      • 해당 문자가 존재하면 기존 값에 +1 추가
      • 없으면 1로 초기화
  3. 조건 체크 ('흥미로운 숫자'인지 확인)

    • map.size() == 2: 정확히 두 개의 숫자로 이루어져 있는지 확인
    • map.values().stream().anyMatch(v -> v == 1): 등장 횟수가 1인 숫자가 존재하는지 확인

Java 문법 정리

  • 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인 요소가 존재하는지 확인

0개의 댓글