celina의 이것저것

[JAVA] 10814번 - 나이순 정렬 본문

자료구조&알고리즘/백준

[JAVA] 10814번 - 나이순 정렬

celinayk 2024. 8. 6. 19:00
반응형

문제 탐색하기

- 문제에서 구해야 하는 최종 정답은 무엇인지 탐색한 과정
- 그 정답을 구하기 위해 어떻게 코드를 구현해야 할지 고민한 과정
- 문제에 들어오는 범위를 파악하여 어떤 알고리즘을 쓸 수 있을지 고민해 가는 과정

 

정렬문제이다.

 

--첫번째 생각--

정렬을 해야하는게 나이와 이름이라서 해시맵을 써야할것같았다.

key값으로 나이를 받고, value값으로 이름을 받는다.

key값으로 오름차순 정렬을 먼저 하고, if문으로 만약 key값이 같을 경우를 걸어서 가입한 순서대로 하면 되지 않을까?

라고 생각했지만 나중에 코드를 돌려보고 알았지만 해시맵은 중복을 허용하지 않는다 그래서 다른 방법으로 접근을 시도했다

 

--두번째 생각--

나이와 이름을 받는 클래스를 만들어서 접근을 시도했다

그리고 나이를 기준으로 오름차순 정렬을 했다. 나이가 똑같다면 먼저 들어온 순서대로 정렬인데 이건 굳이 정렬하지 않아도 된다고 생각했다.

 

 

시간복잡도

for문을 돌아야하니까 O(n)이지 않을까

사실 여태껏 문제를 풀면서 시간복잡도는 생각을 해본적이 없어서 좀 어렵다

 

 

코드 설계하기

위의 문제 탐색하기에서 고민한 과정을 토대로 문제 풀이에 대한 실마리를 잡았다면, 문제 풀이를 본격적으로 하기전, 문제를 풀이 위한 로드맵을 그려본다
어떤 순서로 코드를 작성해야 할지, 어떤 함수들을 작성해야 할지 등을 작성

 

1. n을 입력받는다(멤버 수)

2. n번만큼 for문을 돌면서 나이와 이름을 입력받아 member객체에 저장

3. 나이를 기준으로 오름차순 정렬을 한다

 

시도 회차 수정 사항

- 무분별하게 "맞았습니다" 가 나올때까지 수정하는 형태의 문제 풀이를 반복하면, 내가 어떤 실수를 해서 해당 문제를 틀렸는지 모르게 된다
- 틀렸습니다를 받았다면 왜 틀렸는지 고민핸보고, 어떻게 수정할 수 있는지 고민하는 과정을 작성
- 위에 내가 세울 설계에서 어떤 부분이 틀렸는지도 함께 점검

 

1회차 시도

문제점 : 해시맵은 중복을 허용하지 않는다 ㅜㅜ 그래서 해시맵은 탈락

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
	public static void main(String[] args) throws Exception, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		Map<Integer, String> map = new HashMap<>();
		
		int n = Integer.parseInt(br.readLine());
		
		//해시맵에 입력받기 
		for(int i=0; i<n; i++) {
			String[] input = br.readLine().split(" ");
			int key = Integer.parseInt(input[0]);
			String value = input[1];
			map.put(key, value);
		}
		
		//나이순으로 오름차순 정렬
		List<Integer> keySet = new ArrayList<>(map.keySet());
		Collections.sort(keySet);
		
		for(int key:keySet) {
			System.out.print(key+" ");
			System.out.println(map.get(key));
		}
	}
}

 

 

2회차시도 

comparingInt() 이 람다식은 이번에 처음 알게 되었다. 

람다식의 일반적인 형태는 (매개변수) -> { 코드 블록 }

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class Member {
	int age;
	String name;
	
	Member(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

public class Main {
	public static void main(String[] args) throws Exception, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));	
		
		int n = Integer.parseInt(br.readLine());
		
		List<Member> members = new ArrayList<>();
		
		for(int i=0; i<n; i++) {
			String[] input = br.readLine().split(" ");
			int age = Integer.parseInt(input[0]);
			String name = input[1];
			members.add(new Member(age, name));
		}
		
		members.sort(Comparator.comparingInt(m -> m.age));
		
		for (Member member : members) {
            System.out.print(member.age +" "+member.name);
            System.out.println();
        }
	}
}
Comments