2.20 hashset vs arrayList

반응형
반응형

음... 공부할 시간은 없고 프로젝트는 진행하는데
그래도 조금씩 프로젝트가 조금씩 완료가 되는거 같아 다행이다.

내가 백준으로 문제를 풀고 있었는데
https://www.acmicpc.net/problem/3273

요 문제를 풀었다. 처음에 이 문제를 어떻게 접근할수 있을지 고민해봤다.
처음에는 답이 안오다가 빼기를 이용하면 되지 않을까 라는 생각을했다.
그래서 아무생각없이 arrayList로 데이터를 저장하고 2로 나눴기때문에 정렬을 진행해줬다.

처음 코드는

import java.util.*;

public class Main {

    public static void main(String[] args) {
        List<Integer> arr = new ArrayList<>();

        Scanner sc = new Scanner(System.in);
        int x = sc.nextInt();

        // 이 아닐때까지 반복
        while (x != 0) {
            int i = sc.nextInt();
            arr.add(i);
            x--;
        }
        int r = sc.nextInt();

        Collections.sort(arr);
        int answer = 0;

        for (int i = 0; i < arr.size() / 2; i++) {
            int t = r - arr.get(i);

            if(arr.contains(t)) {
                answer++;
            }
        }

        System.out.println(answer);

    }


}

요런식으로 작성했다. /2를 했던이유는 보다 빨리 찾으려고 했던게 가장컷다.
하지만 결과는 시간초과..

음.. 이런건 내가 고민한다고 될거 같지 않아서 
지피티한테 물어봤다.
he say

1. 시간 초과 원인 분석

  • arr.contains(t)는 리스트 탐색 연산이고, 시간 복잡도는 O(N) 입니다.
  • 이를 반복문 내부에서 사용하면, for 루프의 O(N/2) 와 합쳐져 O(N^2) 가 됩니다.
  • 만약 입력값이 크다면, 시간 초과가 발생할 가능성이 높아집니다.

2. 해결 방법

리스트 대신 HashSet을 사용하면 탐색 시간을 O(1)로 줄일 수 있음
(리스트에서 contains() 호출 → HashSet에서 contains() 호출로 변경)

라고 했다. 결국 리스트의 컨테인즈는 속도가 느리다는 거였고
hashset으로 계산하면 보다 빠르게 계산할 수 있다 했다.
그리고 코드를 조금 수정하고 제출했더니..
통과..
이로서 arrayList보다 hashset이 빠르다는걸 증명할 수 있었다.

반응형

'국비지원 (스파르타)' 카테고리의 다른 글

2.24 ec2에 레디스 적용하기  (0) 2025.02.24
2.21 첫번째 프로젝트 마무리중  (0) 2025.02.22
2.19 마무리 작업  (0) 2025.02.19
2.18 어드민 API추가  (0) 2025.02.18
2.17 싱글톤 공부  (1) 2025.02.17

댓글

Designed by JB FACTORY