<문제 제시>
<문제설명>
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다.
이때, 회원들을 나이가 증가하는 순으로,
나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
>> 나이가 같으면 가입한 순(입력한 순)으로 출력

<예시 입출력>

<문제 해결 과정>
이또한 사전과 같은 프로그램을 만드는 문제였다. 1181번_단어정렬 문제와 유사하다.
Try 1)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, String> dic = new HashMap<>();
int N = Integer.parseInt(br.readLine());
String[] input2 = new String[N];
int max = 0;
for(int i = 0; i < N; i++) {
String temp = br.readLine();
input2 = temp.split(" ");
// 나이, 이름 구분
int age = Integer.parseInt(input2[0]);
if(age > max) max = age;
String name = input2[1];
dic.put(i, age+ " : " +name);
System.out.println();
System.out.println(i + " " + dic);
}
String[] temp = new String[max];
나이와 이름순으로 정렬해야했기에 HashMap구조를 사용했다. 키로 나이를 받고, 값으로 이름을 받았다.
나이에 해당하는 인덱스에 이름을 입력할 String[] temp를 통해 나중에 찾을 수 있게하려했으나,
같은 나이가 있을경우 문제가 발생했다.
Answer 1)
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken(); // 나이, i번째에 인덱스 0번을 구분하여 배열에 저장
arr[i][1] = st.nextToken(); // 이름, i번째에 인덱스 1번을 구분하여 배열에 저장
}
Arrays.sort(arr, new Comparator<String[]>() {
// 나이순 정렬
@Override
public int compare(String[] arg0, String[] arg1) {
return Integer.parseInt(arg0[0]) - Integer.parseInt(arg1[0]);
}
});
StringTokenizer로 나이와 이름을 받아 2차원배열로 저장한다. (HashMap사용 X)
이번에도 Comparator 클래스를 오버라이딩하여 만들었다. arg0[0] 와 arg1[0]의 Integer.parseInt()형을 비교하는 과정에서
나이를 비교할 수 있게되었다.
나이에 따라 이름이 따라오기에 나이만 정렬한 후 StringBuilder()에 누적해서 저장하면 되는 것이었다.
<전체코드>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][2]; // 2고정은 나이, 이름
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken(); // 나이, i번째에 인덱스 0번을 구분하여 배열에 저장
arr[i][1] = st.nextToken(); // 이름, i번째에 인덱스 1번을 구분하여 배열에 저장
}
Arrays.sort(arr, new Comparator<String[]>() {
// 나이순 정렬
@Override
public int compare(String[] arg0, String[] arg1) {
return Integer.parseInt(arg0[0]) - Integer.parseInt(arg1[0]);
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
sb.append(arr[i][0]).append(' ').append(arr[i][1]).append('\n');
}
System.out.println(sb);
}
}
1181_단어 정렬 문제부터 느꼈지만, HashMap을 사용하기만 한다고해서 조건에 맞는 정렬을 하긴 힘들었다.
Comparator클래스의 오버라이딩을 통해 세부적인 조건에 따라 정렬이 가능해지고, 이름과 나이를 따로 정렬하는 것이 아닌 나이를 정렬할 경우 이름은 따라오므로 나이 정렬이 우선적이었다.
문제링크)
https://www.acmicpc.net/problem/10814
10814번: 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을
www.acmicpc.net
'Algorithms > 백준' 카테고리의 다른 글
[백준] '최댓값' - Java (0) | 2023.07.16 |
---|---|
[백준] '행렬 덧셈' - Java (0) | 2023.07.16 |
[백준] '단어 정렬' - Java (0) | 2023.07.15 |
[백준] '소트인사이드' - Java (0) | 2023.07.14 |
[백준] '골드바흐의 추측' - Java (0) | 2023.05.19 |
<문제 제시>
<문제설명>
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다.
이때, 회원들을 나이가 증가하는 순으로,
나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 작성하시오.
>> 나이가 같으면 가입한 순(입력한 순)으로 출력

<예시 입출력>

<문제 해결 과정>
이또한 사전과 같은 프로그램을 만드는 문제였다. 1181번_단어정렬 문제와 유사하다.
Try 1)
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
HashMap<Integer, String> dic = new HashMap<>();
int N = Integer.parseInt(br.readLine());
String[] input2 = new String[N];
int max = 0;
for(int i = 0; i < N; i++) {
String temp = br.readLine();
input2 = temp.split(" ");
// 나이, 이름 구분
int age = Integer.parseInt(input2[0]);
if(age > max) max = age;
String name = input2[1];
dic.put(i, age+ " : " +name);
System.out.println();
System.out.println(i + " " + dic);
}
String[] temp = new String[max];
나이와 이름순으로 정렬해야했기에 HashMap구조를 사용했다. 키로 나이를 받고, 값으로 이름을 받았다.
나이에 해당하는 인덱스에 이름을 입력할 String[] temp를 통해 나중에 찾을 수 있게하려했으나,
같은 나이가 있을경우 문제가 발생했다.
Answer 1)
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken(); // 나이, i번째에 인덱스 0번을 구분하여 배열에 저장
arr[i][1] = st.nextToken(); // 이름, i번째에 인덱스 1번을 구분하여 배열에 저장
}
Arrays.sort(arr, new Comparator<String[]>() {
// 나이순 정렬
@Override
public int compare(String[] arg0, String[] arg1) {
return Integer.parseInt(arg0[0]) - Integer.parseInt(arg1[0]);
}
});
StringTokenizer로 나이와 이름을 받아 2차원배열로 저장한다. (HashMap사용 X)
이번에도 Comparator 클래스를 오버라이딩하여 만들었다. arg0[0] 와 arg1[0]의 Integer.parseInt()형을 비교하는 과정에서
나이를 비교할 수 있게되었다.
나이에 따라 이름이 따라오기에 나이만 정렬한 후 StringBuilder()에 누적해서 저장하면 되는 것이었다.
<전체코드>
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[][] arr = new String[N][2]; // 2고정은 나이, 이름
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
arr[i][0] = st.nextToken(); // 나이, i번째에 인덱스 0번을 구분하여 배열에 저장
arr[i][1] = st.nextToken(); // 이름, i번째에 인덱스 1번을 구분하여 배열에 저장
}
Arrays.sort(arr, new Comparator<String[]>() {
// 나이순 정렬
@Override
public int compare(String[] arg0, String[] arg1) {
return Integer.parseInt(arg0[0]) - Integer.parseInt(arg1[0]);
}
});
StringBuilder sb = new StringBuilder();
for(int i = 0; i < N; i++) {
sb.append(arr[i][0]).append(' ').append(arr[i][1]).append('\n');
}
System.out.println(sb);
}
}
1181_단어 정렬 문제부터 느꼈지만, HashMap을 사용하기만 한다고해서 조건에 맞는 정렬을 하긴 힘들었다.
Comparator클래스의 오버라이딩을 통해 세부적인 조건에 따라 정렬이 가능해지고, 이름과 나이를 따로 정렬하는 것이 아닌 나이를 정렬할 경우 이름은 따라오므로 나이 정렬이 우선적이었다.
문제링크)
https://www.acmicpc.net/problem/10814
10814번: 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을
www.acmicpc.net
'Algorithms > 백준' 카테고리의 다른 글
[백준] '최댓값' - Java (0) | 2023.07.16 |
---|---|
[백준] '행렬 덧셈' - Java (0) | 2023.07.16 |
[백준] '단어 정렬' - Java (0) | 2023.07.15 |
[백준] '소트인사이드' - Java (0) | 2023.07.14 |
[백준] '골드바흐의 추측' - Java (0) | 2023.05.19 |