코테 스터디가 주말도 안쉬고 매일매일이었다는 사실에 새삼 놀라면서 쓰는 오늘의 TIL
할리갈리는 주어진 과일을 보고 과일의 개수가 딱 ! 5가 되면 종을 누르는 게임이다. 위의 문제는 한 종류의 과일의 개수가 정확히 5일 때 “YES”를 출력하고 아니면 “NO”를 출력해야한다. 🍊🍏🍓🍌
일단 첫 줄의 카드를 몇 번 낼지 n이 나오고, n개의 줄에 각 과일의 이름과 개수가 공백으로 구분되어 입력된다.
처음에는 어제 문제처럼 HashMap에 담아서 풀어야겠다 라는 생각이 들었다.
< 과일 이름 - 개수 >를 키-값 쌍으로 데이터를 저장하고 한 종류라도 개수 5를 만족하는게 있다면 YES를 출력하고자 HashMap을 사용했다.
import java.io.*;
import java.util.HashMap;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
HashMap<String, Integer> fruit = new HashMap<>();
int n = Integer.parseInt(br.readLine());
for (int i = 0; i < n; i++) {
String[] input = br.readLine().split(" ");
String fruitName = input[0];
int quantity = Integer.parseInt(input[1]);
fruit.put(fruitName, fruit.getOrDefault(fruitName, 0) + quantity);
}
boolean bell = false;
for (int count : fruit.values()) {
if (count == 5) {
bell = true;
break;
}
}
bw.write(bell ? "YES" : "NO");
bw.flush();
bw.close();
br.close();
}
}
코드를 작성하고 제출을 해보니 정답이었지만 속도가 생각보다 느린 느낌이 들어 다른 사람들의 풀이도 찾아봤다. 내가 제출한 코드들은 왜 항상 속도면에서 떨어질까 슬퍼하면서,,
배열로 간단히 해결할 수 있는 문제였다. 과일이 계속해서 새로 생기는게 아니라 우리가 과일의 종류를 정확히 딸기, 바나나, 라임, 자두 라고 정확히 알고있지 않은가? 4개로 고정되어있는 수기 때문에 배열을 작성해서 과일 종류별로 count를 해 저장한 후 5가 되는 값이 있는지 없는지만 판별하면된다.
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int[] fruits = new int[4]; // 네 가지 과일 합계를 저장
for(int i = 0; i < n; i++){
String[] input = br.readLine().split(" ");
int num = Integer.parseInt(input[1]);
if(input[0].equals("STRAWBERRY")) {
fruits[0] += num;
} else if(input[0].equals("BANANA")) {
fruits[1] += num;
} else if(input[0].equals("LIME")) {
fruits[2] += num;
} else {
fruits[3] += num;
}
}
boolean bell = false;
for (int f : fruits) {
if (f == 5) {
bell = true;
break;
}
}
bw.write(bell ? "YES" : "NO");
bw.flush();
bw.close();
br.close();
}
}
-> 432ms가 해시맵, 380ms가 배열이다.
만약 과일 종류가 다양한 타입이고 고정되어 있지 않다면 HashMap을 사용하는 것이 더 좋은 선택이다. 하지만 이번 문제처럼 과일 종류가 고정되어있고 미리 인덱스를 할당 할 수 있는 상황이라면 배열이 더 빠르고 메모리 측면에서도 더 효율적이다.