정렬 단계
- 단어 정렬
- 나이순 정렬
▷ 단어 정렬
1181번: 단어 정렬
첫째 줄에 단어의 개수 N이 주어진다. (1 ≤ N ≤ 20,000) 둘째 줄부터 N개의 줄에 걸쳐 알파벳 소문자로 이루어진 단어가 한 줄에 하나씩 주어진다. 주어지는 문자열의 길이는 50을 넘지 않는다.
www.acmicpc.net
단어를 길이순서로 정렬하고 길이가 같은 때는 사전 순으로 정렬해야 하는데 다른 사람것을 보니까 람다로 푼 사람도 있었다.
사실 hashmap 넣어서 푸는 것보다는 메모리를 아낄 수 있는 방법이여서 그게 좋은데 아직까지 람다를 제대로 공부해본적이 없어서 모르겠다. 람다를 공부하게 되면 그때 다시 한번 풀어봐야지...
▼ 아래는 맨 처음 제출한 코드이다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
Map<Integer,ArrayList<String>> hp = new HashMap<Integer,ArrayList<String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testCase = Integer.parseInt(br.readLine().trim());
for(int i = 0; i<testCase; i++){
ArrayList<String> arr ;
String word = br.readLine().trim();
int leng = word.length();
if(hp.containsKey(leng)){
arr = hp.get(leng);
}else{
arr = new ArrayList<>();
}
arr.add(word);
Collections.sort(arr);
hp.put(leng, arr);
}
Object[] mapKeys = hp.keySet().toArray();
Arrays.sort(mapKeys);
for(Object key : mapKeys){
for(String word : hp.get((int)key)){
bw.write(word+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
틀린 이유는 입력값 중 같은 단어는 한번만 입력되어야 하는데 이부분을 빼먹었기 때문이다.
▼ if문 하나 추가 하니 정답이였다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
Map<Integer,ArrayList<String>> hp = new HashMap<Integer,ArrayList<String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testCase = Integer.parseInt(br.readLine().trim());
for(int i = 0; i<testCase; i++){
ArrayList<String> arr ;
String word = br.readLine().trim();
int leng = word.length();
if(hp.containsKey(leng)){
arr = hp.get(leng);
}else{
arr = new ArrayList<>();
}
if(!arr.contains(word))
arr.add(word);
Collections.sort(arr);
hp.put(leng, arr);
}
Object[] mapKeys = hp.keySet().toArray();
Arrays.sort(mapKeys);
for(Object key : mapKeys){
for(String word : hp.get((int)key)){
bw.write(word+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
▷ 나이순 정렬
10814번: 나이순 정렬
온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을
www.acmicpc.net
나이순 정렬은 우선 나이순으로 정렬을 하고 나이가 같을 때는 가입순서로 배열을 해야한다. 나는 이부분을 제대로 읽지 않아서 당연히 이름 순서대로겠거니 했다. 그래서 결과적으로는 틀린 코드를 작성해버렸다.. 매번 이런식이지,,
▼ 아래는 틀린 코드이다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
Map<Integer,ArrayList<String>> hp = new HashMap<Integer,ArrayList<String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testCase = Integer.parseInt(br.readLine().trim());
for(int i = 0; i<testCase; i++){
ArrayList<String> arr ;
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int age =Integer.parseInt(st.nextToken());
String name = st.nextToken();
if(hp.containsKey(age)){
arr = hp.get(age);
}else{
arr = new ArrayList<>();
}
arr.add(name);
Collections.sort(arr);
hp.put(age, arr);
}
Object[] mapKeys = hp.keySet().toArray();
Arrays.sort(mapKeys);
for(Object key : mapKeys){
for(String name : hp.get((int)key)){
bw.write(key+" "+name+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
나이가 같을 때는 가입된 순서로 입력하면되는것이기 때문에 이름을 담는 ArrayList를 정렬하지 않아도 된다.
▼ 아래는 맞는 코드이다.
import java.io.*;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException{
Map<Integer,ArrayList<String>> hp = new HashMap<Integer,ArrayList<String>>();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int testCase = Integer.parseInt(br.readLine().trim());
for(int i = 0; i<testCase; i++){
ArrayList<String> arr ;
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int age =Integer.parseInt(st.nextToken());
String name = st.nextToken();
if(hp.containsKey(age)){
arr = hp.get(age);
}else{
arr = new ArrayList<>();
}
arr.add(name);
hp.put(age, arr);
}
Object[] mapKeys = hp.keySet().toArray();
Arrays.sort(mapKeys);
for(Object key : mapKeys){
for(String name : hp.get((int)key)){
bw.write(key+" "+name+"\n");
}
}
bw.flush();
bw.close();
br.close();
}
}
[BOJ] 정렬 단계2 - JAVA
Object[] mapKeys = hp.keySet().toArray(); Arrays.sort(mapKeys); for(Object key : mapKeys){ for(int i : hp.get((int)key)){ bw.write(key+" "+i+"\n"); } } 정렬 단계 수 정렬하기3 통계학 소트인사이트 좌..
develop-recode.tistory.com
'today's alogrithm' 카테고리의 다른 글
[BOJ] 이분 탐색 단계 - JAVA (0) | 2021.02.06 |
---|---|
[프로그래머스] SQL 고득점 Kit - oracle sql (0) | 2021.02.04 |
[BOJ] 정렬 단계2 - JAVA (0) | 2021.02.02 |
[BOJ] 정렬 단계 - JAVA (0) | 2021.01.31 |
[프로그래머스] SQL고득점 Kit - oracle sql (0) | 2021.01.26 |