728x90
문제
코드트리 | 코딩테스트 준비를 위한 알고리즘 정석
국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.
www.codetree.ai
코드
Bessie, Elsie, Daisy, Gertie, Annabelle, Maggie, 그리고 Henrietta까지 총 7명의 학생에게 수업 태도 점수를 부여했을 때, 두 번째로 낮은 학생의 이름을 출력하는 문제다.
첫 번째 줄에 정수 N이 주어지고, 두 번째 줄부터 N개의 줄에 걸쳐 이름과 점수를 공백(" ")을 기준으로 주어진다.
- 입력으로 주어진 적이 없는 학생의 경우, 총 수업 태도 점수를 0점으로 계산해야 한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
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());
StringTokenizer st;
Map<String, Integer> scoreMap = new HashMap<>();
// scoreMap에 이름과 점수 담기
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine(), " ");
String name = st.nextToken();
int score = Integer.parseInt(st.nextToken());
scoreMap.put(name, scoreMap.getOrDefault(name, 0) + score);
}
List<String> keySet = new ArrayList<>(scoreMap.keySet());
// keySet의 길이가 1인 경우, 해당 학생이 가장 높은 점수이자 두 번쨰로 낮은 점수
if (keySet.size() == 1) {
System.out.println(keySet.get(0));
return;
}
// value를 기준으로 scoreMap 오름차순 정렬
keySet.sort((o1, o2) -> {
return scoreMap.get(o1).compareTo(scoreMap.get(o2));
});
int min = scoreMap.get(keySet.get(0));
String secondKey = "";
// 두 번째로 낮은 점수의 학생 구하기
for (String key : keySet) {
if (scoreMap.get(key) > min) {
secondKey = key;
break;
}
}
// secondKey가 빈 경우 모두 같은 점수
if (secondKey.isEmpty()) {
System.out.println("Tie");
} else {
System.out.println(secondKey);
}
}
}
- 학생의 이름과 점수를 map에 담아 두 번째로 낮은 점수를 가진 학생의 이름을 출력할 수 있다.
- 만약, map의 길이가 1인 경우 한 학생을 제외한 나머지 학생은 모두 점수가 0이므로 map에 담겨 있는 학생이 최고 점수이자 두 번째로 낮은 점수가 된다.
- 오름차순 정렬된 map의 첫 번째 value는 가장 낮은 점수가 되며, 다음으로 높은 점수를 가진 학생이 두 번째로 낮은 점수를 가진 학생이 된다.
- 만약 다음으로 높은 점수를 가진 학생이 없는 경우, map에 담긴 학생들이 두 번째로 높은 점수를 가졌으며 여려 명이 된다. 따라서 Tie를 출력한다.
728x90