코딩테스트 연습 스터디 진행중 입니다. ✍✍✍
Notion : https://www.notion.so/1c911ca6572e4513bd8ed091aa508d67
문제
https://www.acmicpc.net/problem/8979
[나의 풀이]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
// N, K 입력 받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
// 국가,금,은,동 입력 받기
HashMap<Integer, int []> map1 = new HashMap<>();
for (int i = 1; i < N + 1; i++) {
st = new StringTokenizer(br.readLine());
int country = Integer.parseInt(st.nextToken());
int [] medals = new int [3];
for (int j = 0; j < 3; j++) {
medals[j] = Integer.parseInt(st.nextToken());
}
map1.put(country,medals);
}
// 등수 구하기
int rank = 1;
for(int i=1;i<N+1;i++){
if(map1.get(K)[0]<map1.get(i)[0]){
rank++;
}
}
for(int i=1;i<N+1;i++){
if(map1.get(K)[0]==map1.get(i)[0]&&map1.get(K)[1]<map1.get(i)[1]){
rank++;
}
}
for(int i=1;i<N+1;i++){
if(map1.get(K)[0]==map1.get(i)[0]&&map1.get(K)[1]==map1.get(i)[1]&&map1.get(K)[2]<map1.get(i)[2]){
rank++;
}
}
System.out.println(rank);
}
}
여러 번의 시행착오를 거친 문제입니다.
제 나름 참신하게 푼다고 금,은,동 메달들을 String으로 받아 등수를 매겼었는데
ex)
2 2
1 1 10 0
2 2 0 0
위와 같이 은메달이 10개이상일때
1번 국가: 1100
2번 국가: 200
으로 1번국가가 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.StringTokenizer;
public class Main{
public static void main(String[] args) throws IOException {
// 입력 받기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
StringBuilder sb = new StringBuilder();
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int K = Integer.parseInt(st.nextToken());
HashMap<Integer, Integer> map1 = new HashMap<>();
for (int i = 1; i < N + 1; i++) {
st = new StringTokenizer(br.readLine());
// 국가 번호 받기
int country = Integer.parseInt(st.nextToken());
String medals = "";
for (int j = 0; j < 3; j++) {
// 국가별 금,은,동 입력 받기
sb.append(st.nextToken());
}
medals = sb.toString();
sb.setLength(0);
map1.put(country, Integer.parseInt(medals));
}
// 메달별 정렬
ArrayList<Integer> medals_info = new ArrayList<>();
for (int value : map1.values()) {
medals_info.add(value);
}
Collections.sort(medals_info, Collections.reverseOrder());
// 메달 정렬과 대응되는 등수
int[] ranking = new int[N];
int rank = 2;
ranking[0] = 1;
for (int i = 0; i < medals_info.size(); i++) {
if (medals_info.get(i).equals(map1.get(K))) {
System.out.println(ranking[medals_info.indexOf(map1.get(K))]);
break;
}
if (!medals_info.get(i).equals(medals_info.get(i + 1))) {
ranking[i + 1] = rank++;
} else {
ranking[i + 1] = ranking[i];
rank++;
}
}
}
}
잘못된 아이디어로 코드를 전부 뜯어고치는 고생을 하며 개발자들이 말하는 '일단 키보드에서 손떼세요!' 라는게 어떤 의미인지 알게 되는 문제였습니다. 앞으로는 더욱 신중하게 풀어보겠습니다.
감사합니다!😹😹😹
👍