λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜

[Java] BOJ 10814 λ‚˜μ΄μˆœ μ •λ ¬

by 🍊귀🍊 2024. 7. 16.

문제 

문제 링크 https://www.acmicpc.net/problem/10814

  • 온라인 저지에 κ°€μž…ν•œ μ‚¬λžŒλ“€μ˜ λ‚˜μ΄μ™€ 이름이 κ°€μž…ν•œ μˆœμ„œλŒ€λ‘œ 주어진닀.
  • μ΄λ•Œ, νšŒμ›λ“€μ„ λ‚˜μ΄κ°€ μ¦κ°€ν•˜λŠ” 순으둜, λ‚˜μ΄κ°€ κ°™μœΌλ©΄ λ¨Όμ € κ°€μž…ν•œ μ‚¬λžŒμ΄ μ•žμ— μ˜€λŠ” μˆœμ„œλ‘œ μ •λ ¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.
  • 첫째 쀄에 온라인 저지 νšŒμ›μ˜ 수 N이 주어진닀. (1 ≤ N ≤ 100,000)
  • λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” 각 νšŒμ›μ˜ λ‚˜μ΄μ™€ 이름이 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. λ‚˜μ΄λŠ” 1보닀 ν¬κ±°λ‚˜ κ°™μœΌλ©°, 200보닀 μž‘κ±°λ‚˜ 같은 μ •μˆ˜μ΄κ³ , 이름은 μ•ŒνŒŒλ²³ λŒ€μ†Œλ¬Έμžλ‘œ 이루어져 있고, 길이가 100보닀 μž‘κ±°λ‚˜ 같은 λ¬Έμžμ—΄μ΄λ‹€. μž…λ ₯은 κ°€μž…ν•œ μˆœμ„œλ‘œ 주어진닀.
  • 첫째 쀄뢀터 총 N개의 쀄에 걸쳐 온라인 저지 νšŒμ›μ„ λ‚˜μ΄ 순, λ‚˜μ΄κ°€ κ°™μœΌλ©΄ κ°€μž…ν•œ 순으둜 ν•œ 쀄에 ν•œ λͺ…μ”© λ‚˜μ΄μ™€ 이름을 곡백으둜 ꡬ뢄해 좜λ ₯ν•œλ‹€.

아이디어

  • μž…λ ₯λΆ€ν„° 2차원 배열에 μ €μž₯ν•΄μ„œ Arrays.sortμ—μ„œ Comparator의 λžŒλ‹€μ‹μ„ μ‚¬μš©ν•˜μ—¬ μ •λ ¬ν•˜μ˜€λ‹€. 

κ²ͺ은 μ‹œν–‰μ°©μ˜€

  • μ§„μ§œ.....νž˜λ“€μ—ˆλ‹€.. μœ„μ— 방법이 생각이 μ•ˆλ‚˜μ„œ while문을 톡해 쑰건에 쑰건을 κ±Έκ³  쀑첩 λ°˜λ³΅λ¬Έμ—... μ—„μ²­ 길게 μ½”λ“œλ₯Ό μΌμ§€λ§Œ μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜κ³ ... 곡듀여쓴 μ½”λ“œκ°€ 말짱도루묡이 λ˜μ–΄λ²„λ¦¬λ‹ˆ μ˜μš•μ΄ λ‚˜μ§€ μ•Šμ•˜λ‹€...
  • 정신차리고 μ—΄μ‹¬νžˆ 찾아보고 κ³΅λΆ€ν•΄μ„œ μ½”λ“œλ₯Ό μ™„μ„±ν•  수 μžˆμ—ˆλ‹€...γ…œγ…œ

μ²«μ½”λ“œ.. μ‹œκ°„μ΄ˆκ³Ό... 그리고 λ‘λ²ˆμ§ΈλŠ” StringBuilderλ₯Ό μ•ˆμ¨μ„œ μ‹œκ°„μ΄ μ €λ ‡κ²Œ μ˜€λž˜κ±Έλ¦°κ±°μ˜€λ‹€...γ…œγ…œ
μ˜€λŠ˜μ€ 쑰금 νž˜λ“€μ—ˆλ‹€..γ…œγ…œ

μ½”λ“œ

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

public class BOJ10814 {
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(br.readLine());

        // μ‚¬λžŒλ“€ λ‚˜μ΄μ™€ 이름 μ €μž₯ λ°°μ—΄
        String people[][] = new String[N][2];

        // μž…λ ₯받은 값을 배열에 μ €μž₯
        for(int i = 0; i < N; i++){
            StringTokenizer st = new StringTokenizer(br.readLine());

            people[i][0] = st.nextToken();
            people[i][1] = st.nextToken();
        }

        // λ‚˜μ΄λ₯Ό κΈ°μ€€μœΌλ‘œ 였룸차순 μ •λ ¬
        // 뺐을 λ•Œ '-'λ©΄ n1이 더 μž‘λ‹€λŠ” 의미둜 n1이 n2 μ•žμœΌλ‘œ κ°€κ³ 
        // 뺐을 λ•Œ '+'λ©΄ n1이 더 ν¬λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ n1이 n2보타 λ’€λ‘œ 감
        // λ§Œμ•½ 0일 경우, 두 μˆ˜κ°€ κ°™λ‹€λŠ” μ˜λ―Έμ΄λ―€λ‘œ 변동이 μ—†μŒ
        Arrays.sort(people, (n1, n2) -> {
                return (Integer.parseInt(n1[0]) - Integer.parseInt(n2[0]));
        });

        for(int i = 0; i < N; i++){
            sb.append(people[i][0] + " " + people[i][1] + "\n");
        }

        System.out.println(sb);
    }
}