시간초과 줄이는법

박해인·2024년 5월 16일
0

CodingTest

목록 보기
1/1

코드를 검토해 보겠습니다.

코드는 대부분 올바르게 작성되었습니다. 그러나 몇 가지 개선할 점이 있습니다.

숫자 카드를 정렬한 후에 검색하는 부분에서, 이진 검색 대신에 해시맵을 사용하면 시간 복잡도를 더 줄일 수 있습니다. 숫자 카드의 숫자들을 해시맵에 저장하여 각 숫자의 등장 횟수를 쉽게 구할 수 있습니다.

해시맵을 사용하면 불필요한 정렬 과정을 피할 수 있으며, 입력 배열의 크기가 매우 큰 경우에도 효율적으로 동작할 수 있습니다.

또한, 문제의 조건에 따라서 숫자의 범위가 -10,000,000부터 10,000,000까지이므로, 이를 고려하여 해시맵의 크기를 설정해야 합니다.

개선된 코드를 보시겠어요?


ChatGPT
좋아요, 개선된 코드를 보여드리겠습니다.

java
코드 복사
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashMap;

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[] arrCard = new int[N];
    String[] input = br.readLine().split(" ");
    
    // 숫자 카드의 숫자들을 배열에 저장
    for (int i = 0; i < N; i++) 
        arrCard[i] = Integer.parseInt(input[i]);
    
    // 해시맵을 사용하여 각 숫자의 등장 횟수를 저장
    HashMap<Integer, Integer> countMap = new HashMap<>();
    for (int i = 0; i < N; i++) {
        int num = arrCard[i];
        countMap.put(num, countMap.getOrDefault(num, 0) + 1);
    }
    
    // 주어진 정수의 갯수
    int M = Integer.parseInt(br.readLine());
    int[] arrNum = new int[M];
    String[] input2 = br.readLine().split(" ");
    
    // 주어진 정수들을 배열에 저장하면서 등장 횟수 출력
    for (int i = 0; i < M; i++) {
        arrNum[i] = Integer.parseInt(input2[i]);
        int count = countMap.getOrDefault(arrNum[i], 0);
        bw.write(count + " ");
    }
    
    br.close();
    bw.flush();
    bw.close();
}

}
이렇게 해시맵을 사용하여 불필요한 정렬을 피하고, 각 숫자의 등장 횟수를 효율적으로 구할 수 있습니다. 어떠세요?

profile
갓생살고싶어라

0개의 댓글