λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Programming/Algorithm

[Java] Softeer Level 2- "GPT식 숫자 비ꡐ" μžλ°” 풀이

728x90
λ°˜μ‘ν˜•

문제

μ–Όλ§ˆ μ „ GPT의 μ‹€μˆ˜ 비ꡐ 방식이 ν™”μ œκ°€ 된 적이 μžˆμ—ˆλ‹€.

질문) "3.9와 3.11 μ€‘에 뭐가 더 컀?" / λ‹΅λ³€) "3.11이 더 ν½λ‹ˆλ‹€."

μˆ˜ν•™ μ‹œκ°„μ— 쑸지 μ•Šμ€ μ‚¬λžŒλ“€μ€ κ°€ λ³΄λ‹€ 크닀고 μƒκ°ν•˜μ§€λ§Œ, GPT의 눈으둜 보면 Python 3.9와 Python 3.11 μ€‘ ν›„μžλ₯Ό 더 크게 λ³΄λŠ” ν•™μŠ΅ 데이터가 λ§Žμ•„ μ €λ ‡κ²Œ 생각할 수 μžˆλ‹€. GPT의 μ„Έμƒμ—μ„œ 3.1은 3보닀 크고, λ§ˆμ°¬κ°€μ§€λ‘œ 3.9λŠ” 3.2보닀 ν¬μ§€λ§Œ, 3.10은 3.2보닀 큰 κ°’μœΌλ‘œ μ²˜λ¦¬λœλ‹€.

ꡬ체적으둜, μ†Œμˆ˜μ μ„ κΈ°μ€€μœΌλ‘œ μ™Όμͺ½μ„ 수둜 읽은 값을 , 였λ₯Έμͺ½μ„ 수둜 읽은 값을 λΌκ³  ν•  λ•Œ 두 수의 비ꡐ가 λ‹€μŒκ³Ό 같이 이루어진닀:

  1. 값이 더 μž‘μœΌλ©΄ 더 μž‘μ€ μˆ˜μ΄λ‹€.
  2. 값이 같을 경우 κ°’이 더 μž‘μœΌλ©΄ 더 μž‘μ€ μˆ˜μ΄λ‹€.
  3. μ†Œμˆ˜μ μ΄ μ—†λŠ” κ²½μš°λŠ” 같은 수의 μ†Œμˆ˜μ μ΄ μžˆλŠ” κ²½μš°λ³΄λ‹€ 항상 μž‘κ²Œ μ·¨κΈ‰λœλ‹€. (λ‹€μ‹œ 말해, GPTμ—κ²Œ 3은 3.0보닀 μž‘λ‹€.)

개의 μˆ˜λ“€μ΄ μ£Όμ–΄μ‘Œμ„ λ•Œ, 이λ₯Ό GPT의 기쀀에 따라 λΉ„λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•΄λ³΄μž.

μ œμ•½μ‘°κ±΄

[문제 μ œμ•½ 쑰건]

[쑰건 1] μ€  μ΄μƒ  μ΄ν•˜μ΄λ‹€.

[쑰건 2] κ° μˆ˜λŠ” μ‹€μˆ˜ ν˜Ήμ€ μ •μˆ˜λ‘œ ν‘œν˜„λ˜κ³ ,  μ΄μƒ  μ΄ν•˜μ΄λ©°, μ†Œμˆ˜μ μ΄ μ—†κ±°λ‚˜ μ†Œμˆ˜μ  μ•„λž˜ μ΅œλŒ€ 3μžλ¦¬κΉŒμ§€ 주어진닀.

 

[μ„œλΈŒ νƒœμŠ€ν¬λ³„ μ œμ•½ 쑰건]

λ³„λ„μ˜ μ„œλΈŒ νƒœμŠ€ν¬κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μž…λ ₯ν˜•μ‹

첫 번째 쀄에 μ΄ 주어진닀.

두 번째 쀄뢀터 κ°œμ˜ 쀄에 걸쳐, 각 μˆ˜κ°€ ν•œ 쀄에 ν•˜λ‚˜μ”© 주어진닀.

01.23, 3.001κ³Ό 같이 μ†Œμˆ˜μ μ„ κΈ°μ€€μœΌλ‘œ 각 파트의 μ΄ μ•„λ‹Œ 수 이전에 leading zeroκ°€ λ‚˜μ˜€λŠ” κ²½μš°λŠ” 주어지지 μ•ŠλŠ”λ‹€.

μΆ”κ°€λ‘œ, 3.00, 3.000, λ˜λŠ” 00.1κ³Ό 같이 μ†Œμˆ˜μ μ„ κΈ°μ€€μœΌλ‘œ ν•œ νŒŒνŠΈμ— 두 개 μ΄μƒμ˜ 0만 μ£Όμ–΄μ§€λŠ” μž…λ ₯은 μ—†λ‹€.

좜λ ₯ν˜•μ‹

첫 번째 쀄뢀터 κ°œμ˜ 쀄에 걸쳐, μž…λ ₯으둜 주어진 μˆ˜λ“€μ„ GPT의 κΈ°μ€€μœΌλ‘œ λΉ„λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•œ μˆœμ„œλŒ€λ‘œ ν•œ 쀄에 ν•˜λ‚˜μ”© 좜λ ₯ν•œλ‹€.

예제

μž…λ ₯예제1

5 1.2 1.11 2.9 4.2 3

좜λ ₯예제1

1.2 1.11 2.9 3 4.2

1.2와 1.11의 μˆœμ„œμ— μœ μ˜ν•΄ 좜λ ₯ν•˜λ©΄ λœλ‹€.

μž…λ ₯예제2

8 1 1.0 2.0 2.10 2.1 2.100 1.11 1.3

좜λ ₯예제2

1 1.0 1.3 1.11 2.0 2.1 2.10 2.100

풀이

μ μ ˆν•œ 계산을 μ΄μš©ν•œ λ°°μ—΄μ˜ μ •λ ¬ 문제

μ†Œμˆ«μ μ„ κΈ°μ€€μœΌλ‘œ μ•žμžλ¦¬ μ •μˆ˜μ™€ λ’·μžλ¦¬ μ •μˆ˜λ₯Ό λΉ„κ΅ν•œλ‹€.

μžλ°”μ˜ λ°°μ—΄μ—μ„œμ˜ sortν•¨μˆ˜μ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” O(nlogn)으둜 μž…λ ₯κ°’ N의 μ΅œλŒ“κ°’μΈ 1,000이 듀어와도 1초 μ•ˆμ— μ •λ ¬ κ°€λŠ₯

μ½”λ“œ

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        ArrayList<String> arr = new ArrayList<>();
        
        // μž…λ ₯κ°’ λ°›κΈ°
        int N = Integer.parseInt(br.readLine());
        for(int i=0; i < N; i++){
            arr.add(br.readLine());
        }
        
        // λžŒλ‹€ν•¨μˆ˜λ‘œ μ •λ ¬ μ •μ˜
        Collections.sort(arr, (first, second) -> {
            String[] a1 = first.split("\\.");
            String[] a2 = second.split("\\.");
            
            // μ•žμžλ¦¬ μ •μˆ˜λΉ„κ΅
            int r1 = Integer.parseInt(a1[0]) - Integer.parseInt(a2[0]);
            
            // μ•žμžλ¦¬ μ •μˆ˜κ°€ 같지 μ•Šλ‹€λ©΄, κ²°κ³Ό λ¦¬ν„΄ν•˜μ—¬ μ •λ ¬
            if(r1 != 0){
                return r1;
            }
            
            // λ’·μžλ¦¬ μ •μˆ˜λΉ„κ΅
            // μ†Œμˆ«μ μ΄ μ—†λŠ” κ°’κ³Ό μ†Œμˆ«μ  이후 값이 0인 값을 λΉ„κ΅ν•˜κΈ° μœ„ν•΄μ„œ μ—†λ‹€λ©΄, -1처리
            int n1 = a1.length < 2 ? -1 : Integer.parseInt(a1[1]);
            int n2 = a2.length < 2 ? -1 : Integer.parseInt(a2[1]);
            
            return n1 - n2;
        });

        // 좜λ ₯κ°’ μ„ΈνŒ…
        for(String item : arr) {
            sb.append(item).append("\n");
        }
        
        System.out.println(sb.toString());
        
        br.close();
        
    }
}

 

728x90
λ°˜μ‘ν˜•