b.17299 μ˜€λ“±ν°μˆ˜

2025. 2. 4. 14:03Β·Algorithm & Data Structures/BOJ

 

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

 

 

 

 

πŸ“Œ μžλ°”(Java)둜 ν‘ΈλŠ” μ˜€λ“±ν°μˆ˜ 문제 풀이

πŸ”Ž 문제 κ°œμš”

μ£Όμ–΄μ§„ μˆ˜μ—΄μ—μ„œ 각 숫자의 λ“±μž₯ 횟수λ₯Ό κ³ λ €ν•˜μ—¬ 였λ₯Έμͺ½μ—μ„œ κ°€μž₯ κ°€κΉŒμš΄ "더 자주 λ“±μž₯ν•œ 숫자"λ₯Ό μ°Ύμ•„μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.
일반적인 였큰수(NGE, Next Greater Element) λ¬Έμ œμ™€ 달리 "숫자의 크기"κ°€ μ•„λ‹Œ "λ“±μž₯ 횟수"λ₯Ό κΈ°μ€€μœΌλ‘œ λΉ„κ΅ν•œλ‹€λŠ” 점이 λ‹€λ¦…λ‹ˆλ‹€.

πŸ’‘ 예제 μž…λ ₯

7
1 1 2 3 4 2 1

πŸ’‘ 예제 좜λ ₯

-1 -1 1 2 2 1 -1

μœ„ μ˜ˆμ œμ—μ„œ 각 숫자의 λ“±μž₯ 횟수λ₯Ό 보면:

  • 1 → 3번 λ“±μž₯
  • 2 → 2번 λ“±μž₯
  • 3 → 1번 λ“±μž₯
  • 4 → 1번 λ“±μž₯

각 μˆ«μžμ— λŒ€ν•΄ 였λ₯Έμͺ½μ—μ„œ 더 자주 λ“±μž₯ν•œ 숫자λ₯Ό 찾으면 μœ„μ™€ 같은 κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.


πŸ›  μ•Œκ³ λ¦¬μ¦˜ μ ‘κ·Ό 방식

이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μŠ€νƒ(Stack) κ³Ό λ°°μ—΄(Hash Table) 을 ν™œμš©ν•©λ‹ˆλ‹€.

  1. 숫자의 λ“±μž₯ 횟수λ₯Ό λ¨Όμ € κ΅¬ν•œλ‹€.
  2. 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ 숫자λ₯Ό νƒμƒ‰ν•˜λ©°, μŠ€νƒμ„ μ΄μš©ν•΄ "더 자주 λ“±μž₯ν•œ 수"λ₯Ό λΉ λ₯΄κ²Œ μ°ΎλŠ”λ‹€.
  3. μŠ€νƒμ„ ν™œμš©ν•˜μ—¬ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό O(N)으둜 μ΅œμ ν™”ν•œλ‹€.

πŸ”Ή Java μ½”λ“œ ν•΄μ„€

import java.io.*;
import java.util.*;

public class Main {

    static int N;               // μˆ˜μ—΄μ˜ 길이
    static int[] numbers;       // μž…λ ₯된 μˆ˜μ—΄
    static int[] checkNum;      // 각 숫자의 λ“±μž₯ 횟수λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄
    static int[] answer;        // κ²°κ³Όλ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄

    public static void main(String[] args) throws IOException {
        input();
        logic();
        output();
    }

    // κ²°κ³Ό 좜λ ₯ λ©”μ„œλ“œ
    private static void output() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < N; i++) {
            sb.append(answer[i]).append(" ");
        }
        System.out.println(sb.toString().trim());
    }

    // μ•Œκ³ λ¦¬μ¦˜ μ‹€ν–‰
    private static void logic() {
        Deque<Integer> stack = new ArrayDeque<>();
        for (int i = N - 1; i >= 0; i--) {  // 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ 순회
            while (!stack.isEmpty() && checkNum[numbers[i]] >= checkNum[stack.peek()]) {
                stack.pop();  // ν˜„μž¬ μˆ«μžλ³΄λ‹€ λ“±μž₯ νšŸμˆ˜κ°€ 적은 μˆ«μžλ“€μ„ 제거
            }
            if (stack.isEmpty()) {
                answer[i] = -1;  // 더 자주 λ“±μž₯ν•œ μˆ«μžκ°€ μ—†μœΌλ©΄ -1
            } else {
                answer[i] = stack.peek();  // κ°€μž₯ κ°€κΉŒμš΄ μ˜€λ“±ν°μˆ˜λ₯Ό μ €μž₯
            }
            stack.push(numbers[i]);  // ν˜„μž¬ 숫자λ₯Ό μŠ€νƒμ— λ„£μŒ
        }
    }

    // μž…λ ₯ 처리
    private static void input() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());  // 숫자의 개수 μž…λ ₯
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        numbers = new int[N];
        checkNum = new int[1000001];  // λ“±μž₯ 횟수λ₯Ό μ €μž₯ν•˜λŠ” λ°°μ—΄
        answer = new int[N];

        for (int i = 0; i < N; i++) {
            numbers[i] = Integer.parseInt(st.nextToken());
            checkNum[numbers[i]]++;  // λ“±μž₯ 횟수 증가
        }
    }
}

πŸ” μ½”λ“œ μ„€λͺ…

πŸ“Œ 1. μž…λ ₯ 처리 (input())

  • numbers[i] 배열에 μˆ˜μ—΄μ„ μ €μž₯ν•©λ‹ˆλ‹€.
  • checkNum 배열을 μ΄μš©ν•΄ 각 숫자의 λ“±μž₯ 횟수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.
    → checkNum[숫자]++ ν˜•νƒœλ‘œ μΉ΄μš΄νŒ….

πŸ“Œ 2. μ˜€λ“±ν°μˆ˜ μ°ΎκΈ° (logic())

πŸ’‘ 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ μˆœνšŒν•˜λ©΄μ„œ μŠ€νƒμ„ ν™œμš©ν•©λ‹ˆλ‹€.

  1. stack.pop()을 톡해 ν˜„μž¬ μˆ«μžλ³΄λ‹€ λ“±μž₯ νšŸμˆ˜κ°€ μž‘μ€ μˆ«μžλ“€μ„ μ œκ±°ν•©λ‹ˆλ‹€.
  2. μŠ€νƒμ΄ λΉ„μ—ˆλ‹€λ©΄ -1, μ•„λ‹ˆλΌλ©΄ κ°€μž₯ κ°€κΉŒμš΄ μ˜€λ“±ν°μˆ˜λ₯Ό μ •λ‹΅ 배열에 μ €μž₯ν•©λ‹ˆλ‹€.
  3. ν˜„μž¬ 숫자λ₯Ό μŠ€νƒμ— pushν•˜μ—¬ 이후 μˆ«μžμ™€ λΉ„κ΅ν•©λ‹ˆλ‹€.

πŸ“ μ€‘μš”ν•œ 점

  • checkNum[numbers[i]] >= checkNum[stack.peek()]이면 μŠ€νƒμ„ 계속 λΉ„μš΄λ‹€.
  • 즉, ν˜„μž¬ 숫자의 λ“±μž₯ νšŸμˆ˜κ°€ 더 λ§Žλ‹€λ©΄ κΈ°μ‘΄ μŠ€νƒμ˜ μˆ«μžλŠ” ν•„μš” μ—†μŒ!

πŸ“Œ 3. 좜λ ₯ 처리 (output())

  • StringBuilderλ₯Ό ν™œμš©ν•΄ κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
    → μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•΄ System.out.println() λŒ€μ‹  StringBuilder μ‚¬μš©.

πŸ”₯ μ‹œκ°„ λ³΅μž‘λ„ 뢄석

μ—°μ‚° μ΅œμ•…μ˜ 경우 μˆ˜ν–‰ 횟수 μ‹œκ°„ λ³΅μž‘λ„
checkNum λ°°μ—΄ μ΄ˆκΈ°ν™” N O(N)
logic()μ—μ„œμ˜ 반볡 N O(N)
stack의 push/pop N O(N)
총합 O(N)  

πŸ“Œ κ²°λ‘ 
πŸ‘‰ λͺ¨λ“  연산이 O(N) μ΄λ‚΄λ‘œ μˆ˜ν–‰λ˜λ―€λ‘œ νš¨μœ¨μ μž…λ‹ˆλ‹€.


πŸ† 정리

βœ… 핡심 포인트

  1. λ“±μž₯ 횟수 λ°°μ—΄ (checkNum)을 미리 κ³„μ‚°ν•œλ‹€.
  2. 였λ₯Έμͺ½μ—μ„œ μ™Όμͺ½μœΌλ‘œ νƒμƒ‰ν•˜λ©΄μ„œ, μŠ€νƒμ„ ν™œμš©ν•˜μ—¬ λ“±μž₯ νšŸμˆ˜κ°€ 더 λ§Žμ€ 수λ₯Ό μ°ΎλŠ”λ‹€.
  3. μŠ€νƒμ„ μ΄μš©ν•΄ λΆˆν•„μš”ν•œ 비ꡐλ₯Ό μ€„μ—¬μ„œ μ‹œκ°„ λ³΅μž‘λ„λ₯Ό O(N)으둜 μ΅œμ ν™”ν•œλ‹€.

🎯 이 μ•Œκ³ λ¦¬μ¦˜μ˜ μž₯점

βœ” κΈ°μ‘΄ 였큰수 문제λ₯Ό ν™•μž₯ν•œ ν˜•νƒœ
βœ” μŠ€νƒμ„ ν™œμš©ν•΄ O(N)으둜 μ΅œμ ν™”
βœ” λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 적고 λΉ λ₯΄λ‹€.

 

이제 이 방법을 μ μš©ν•˜λ©΄ μ˜€λ“±ν°μˆ˜λ₯Ό λΉ λ₯΄κ²Œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€!
πŸ’‘ μŠ€νƒμ„ ν™œμš©ν•œ μ•Œκ³ λ¦¬μ¦˜μ„ μ΅ν˜€λ‘λ©΄, λ‹€λ₯Έ λ¬Έμ œμ—μ„œλ„ 큰 도움이 될 κ²ƒμž…λ‹ˆλ‹€. πŸš€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄, μ’‹μ•„μš”μ™€ 곡유 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€! 😊

 

 

'Algorithm & Data Structures > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

b3015. μ˜€μ•„μ‹œμŠ€ μž¬κ²°ν•©  (0) 2025.02.25
b.1725 νžˆμŠ€ν† κ·Έλž¨  (0) 2025.02.06
b24497. μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… - 깊이 μš°μ„  탐색 1  (0) 2025.01.27
b.17298 였큰수  (1) 2025.01.23
b.2293 동전 1  (0) 2025.01.21
'Algorithm & Data Structures/BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • b3015. μ˜€μ•„μ‹œμŠ€ μž¬κ²°ν•©
  • b.1725 νžˆμŠ€ν† κ·Έλž¨
  • b24497. μ•Œκ³ λ¦¬μ¦˜ μˆ˜μ—… - 깊이 μš°μ„  탐색 1
  • b.17298 였큰수
Geisha
Geisha
개발 일기
  • Geisha
    Geisha
    Geisha
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (316)
      • Algorithm & Data Structures (238)
        • BOJ (96)
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • 운영체제 (13)
        • λ„€νŠΈμ›Œν¬ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    Union-Find
    κ²½λ‘œμ••μΆ•
    Stack
    dp
    Java
    λ°±μ€€
    μ „μœ„μˆœνšŒ
    BFS
    ν›„μœ„μˆœνšŒ
    λ‹€μ΅μŠ€νŠΈλΌ
    μŠ€νƒ
    이뢄탐색
    Dijkstra
    DynamicProgramming
    νˆ¬ν¬μΈν„°
    λ™μ κ³„νšλ²•
    baekjoon
    ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€
    SQL
    dfs
    μœ λ‹ˆμ˜¨νŒŒμΈλ“œ
    programmers
    PriorityQueue
    μ•Œκ³ λ¦¬μ¦˜
    binarySearch
    κ΅¬ν˜„
    unionfind
    algorithm
    κ³¨λ“œ
    λ°±νŠΈλž˜ν‚Ή
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.0
Geisha
b.17299 μ˜€λ“±ν°μˆ˜
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”