πŸš€ Coding Test_

⁉️ νƒ‘μ˜ λ ˆμ΄μ € 톡신 – μžλ°” μ½”λ”© ν…ŒμŠ€νŠΈ 풀이

CodeLoge 2025. 6. 7. 19:06

❓ 문제 μ„€λͺ…

 

KOI ν†΅μ‹ μ—°κ΅¬μ†ŒλŠ” λ ˆμ΄μ €λ₯Ό μ΄μš©ν•œ λΉ„λ°€ 톡신 μ‹œμŠ€ν…œμ„ 개발 μ€‘μž…λ‹ˆλ‹€.
이λ₯Ό μœ„ν•΄ 일직선 상에 N개의 높이가 μ„œλ‘œ λ‹€λ₯Έ 탑을 μ„Έμš°κ³ , νƒ‘μ˜ κΌ­λŒ€κΈ°μ— λ ˆμ΄μ € 솑신기λ₯Ό μ„€μΉ˜ν–ˆμŠ΅λ‹ˆλ‹€.

 

• λͺ¨λ“  탑은 **μžμ‹ μ˜ μ™Όμͺ½ λ°©ν–₯(즉, μ•žμͺ½ 탑듀)**으둜 λ ˆμ΄μ €λ₯Ό λ°œμ‚¬ν•©λ‹ˆλ‹€.

 λ ˆμ΄μ €λŠ” κ°€μž₯ λ¨Όμ € λ§Œλ‚˜λŠ” ν•˜λ‚˜μ˜ νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ λ©λ‹ˆλ‹€.

 μˆ˜μ‹  μž₯μΉ˜λŠ” λͺ¨λ“  νƒ‘μ˜ λͺΈμ²΄μ— λΆ€μ°©λ˜μ–΄ 있으며, λ°œμ‚¬λœ λ ˆμ΄μ €λŠ” 본인의 μ•žμͺ½μ— μžˆλŠ” 탑 쀑 본인보닀 높은 νƒ‘μ—μ„œλ§Œ μˆ˜μ‹ λ  수 μžˆμŠ΅λ‹ˆλ‹€.


μ˜ˆμ‹œ μ„€λͺ…

 

νƒ‘μ˜ 높이 배열이 [6, 9, 5, 7, 4]인 경우 :

탑 번호:   1  2  3  4  5
높이:     6  9  5  7  4
λ ˆμ΄μ €:  ← ← ← ← ←

- 5번 탑(4)의 λ ˆμ΄μ € → 4번 탑(7)이 μˆ˜μ‹ 
- 4번 탑(7)의 λ ˆμ΄μ € → 2번 탑(9)이 μˆ˜μ‹ 
- 3번 탑(5)의 λ ˆμ΄μ € → 2번 탑(9)이 μˆ˜μ‹ 
- 2번 탑(9), 1번 탑(6)은 μˆ˜μ‹ ν•˜λŠ” 탑이 μ—†μŒ

좜λ ₯: 0 0 2 2 4

πŸ“Œ μ œν•œ 쑰건

 

 1 ≤ N ≤ 500,000

 κ° νƒ‘μ˜ 높이 : 1 이상 100,000,000 μ΄ν•˜

 μ‹œκ°„ λ³΅μž‘λ„ O(N²) ν’€μ΄λ‘œλŠ” μ œν•œ μ‹œκ°„ 초과 κ°€λŠ₯ (μΆ”ν›„ μŠ€νƒ 기반 κ°œμ„  κ°€λŠ₯)


πŸ” 문제 μš”μ•½

 

 κ° 탑은 μ™Όμͺ½ λ°©ν–₯으둜 λ ˆμ΄μ €λ₯Ό μœλ‹€.

 μžκΈ°λ³΄λ‹€ 높은 탑이 처음 λ“±μž₯ν•˜λŠ” κ³³κΉŒμ§€ μˆ˜μ‹  κ°€λŠ₯

 μˆ˜μ‹ ν•œ νƒ‘μ˜ μΈλ±μŠ€(1-based)λ₯Ό 좜λ ₯, μˆ˜μ‹  탑이 μ—†μœΌλ©΄ 0


βœ… μ½”λ”©

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int totalTower = sc.nextInt();
        int[] tower = new int[totalTower];
        int[] receive = new int[totalTower]; // μˆ˜μ‹  탑 인덱슀 μ €μž₯

        for (int i = 0; i < totalTower; i++) {
            tower[i] = sc.nextInt();
        }

        // 였λ₯Έμͺ½ 탑뢀터 μ™Όμͺ½ 탑듀을 검사
        for (int i = totalTower - 1; i > 0; i--) {
            for (int j = i - 1; j >= 0; j--) {
                if (tower[j] > tower[i]) {
                    receive[i] = j + 1; // μΈλ±μŠ€λŠ” 1λΆ€ν„° 좜λ ₯
                    break;
                }
            }
        }

        for (int i = 0; i < totalTower; i++) {
            System.out.print(receive[i] + " ");
        }
    }
}

πŸ’‘ ν•΄μ„€

 

브루트포슀 λ°©μ‹μœΌλ‘œ 각 νƒ‘λ§ˆλ‹€ μ™Όμͺ½μ— μžˆλŠ” 탑을 μˆœνšŒν•˜λ©° 확인

 i번째 νƒ‘μ˜ μ™Όμͺ½ 탑듀을 j둜 μˆœνšŒν•˜λ©΄μ„œ, μ²˜μŒ μžκΈ°λ³΄λ‹€ 큰 탑을 찾으면 κ·Έ 인덱슀λ₯Ό μ €μž₯ν•˜κ³  break

 μ‹œκ°„λ³΅μž‘λ„λŠ” O(N²)둜, μ΅œμ•…μ˜ 경우 500,000 * 500,000은 μ‹œκ°„ 초과 λ°œμƒν•  수 있음

 βž• μ‹€μ œ λŒ€ν˜• λ°μ΄ν„°μ—μ„œλŠ” μŠ€νƒμ„ μ΄μš©ν•œ O(N) 풀이가 ν•„μš”