본문 바로가기

백준

10814번: 나이 순 정렬(Java)

 

 HashMap<Integer, LinkedList<String>>을 이용해 풀었다. 

HashMap의 key 값으로 나이를 주었고, 이름은 LinkedList에 add 해 주었다. 이렇게 하면 나중에 출력할 때 pop()을 사용해서 가입 순서대로 출력할 수 있기 때문이다.

 
 
 
 
 

 우선 나이와 이름을 입력받고 해당 나이의 가입자가 없다면 LinkedList<String>을 하나 만들어 입력받은 이름을 add해준 뒤 put()을 통해 나이와 새로 만든 LinkedList을 넣었다.

if(data.get(age) == null)
{
    LinkedList<String> temp = new LinkedList<>();//새로운 LinkedList를 만든다
    temp.add(name);//이름을 추가해준다
    data.put(age, temp);//나이와 LinkedList를 HaspMap에 넣어준다
}

 

 만약 해당 나이의 가입자가 있다면 HahMap에 해당 나이를 key로 줘서 get()으로 얻은 LinkedList에 입력받은 이름을 add() 해 줬다.

else
{
    data.get(age).add(name);
}

 

 

 

위 두 가지 경우를 합치면 이렇게 된다.

 

Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
Map<Integer, LinkedList<String>> data = new HashMap<>();
int age;
String name;

for(int i = 0; i<n; i++)
{
    age = scanner.nextInt();
    name = scanner.next();
    if(data.get(age) == null)
    {
        LinkedList<String> temp = new LinkedList<>();
        temp.add(name);
        data.put(age, temp);
    }
    else
    {
        data.get(age).add(name);
    }
}

 

 

 

 

 

이렇게 하면 입력은 끝났다. 이제 어떻게 문제에서 원하는 방식으로 출력할지 고민하면 된다.

 

 나이 순으로 출력해야 하므로 나이(key)에 접근하기 위해 data.keySet()을 통해 Set을 얻었고 반복문을 통해 최소 key 값부터(최소 나이부터) 최대 key 값까지(최대 나이까지) 접근할 수 있었다.

for(int key : data.keySet())

 

 

 다음으로 LinkedList<String>을 하나 만들고 data.get(key)를 통해 해당 나이에 있는 이름들을 가지고 있는 LinkedList를 얻었다. 이제 pop()을 통해 출력만 하면 완성이다. 

 

for(int key : data.keySet())
{
    LinkedList<String> value = data.get(key);
    while(!value.isEmpty())
    {
        System.out.println(key+" "+value.pop());
    }
}

LinkedList는 FIFO(First In First Out) 구조이므로 가입 순서대로 출력할 수 있다.

 

 

 

 

 

<전체 코드>

import java.util.*;

public class Main
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        Map<Integer, LinkedList<String>> data = new HashMap<>();
        int age;
        String name;

        for(int i = 0; i<n; i++)
        {
            age = scanner.nextInt();
            name = scanner.next();
            if(data.get(age) == null)
            {
                LinkedList<String> temp = new LinkedList<>();
                temp.add(name);
                data.put(age, temp);
            }
            else
            {
                data.get(age).add(name);
            }
        }

        for(int key : data.keySet())
        {
            LinkedList<String> value = data.get(key);
            while(!value.isEmpty())
            {
                System.out.println(key+" "+value.pop());
            }
        }
    }
}

 

'백준' 카테고리의 다른 글

1764번: 듣보잡(Java)  (0) 2023.01.30
11478번: 서로 다른 부분 문자열의 개수(Java)  (0) 2023.01.30
2563번: 색종이(Java)  (0) 2023.01.29
10773번: 제로(Java)  (0) 2023.01.22
14425번: 문자열 집합(Java)  (0) 2023.01.22