inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

38군데 합격 비법, 2026 코딩테스트 필수 알고리즘

3-8. 해쉬 - 2

3-8 출석체크 문제 질문

해결된 질문

56

딸바맛있다

작성한 질문수 1

0

present_array 먼저 set에 담아두고 all_array를 순회하면서 여부 체크하는 게 성능상으로 더 빠를까요??

코딩-테스트 알고리즘

답변 2

0

딩코딩코

딸바맛있따님 좋은 질문 감사합니다!!

 

1. 시간 복잡도는 똑같습니다

둘 다 O(N)이에요. 딕셔너리든 set이든 둘 다 해시 테이블 기반이거든요.

강의 방법: O(N + M) → O(N) 제안 방법: O(M + N) → O(N)

Big-O 표기법으로는 차이가 없어요.

 

2. 실제 연산 횟수에서 차이가 나요

강의 방법: 삽입 9번 + 삭제 8번 = 17번 해시 연산

제안 방법: 삽입 8번 + 조회 평균 4.5번 = 12.5번 해시 연산

제안 방법이 평균적으로 30% 정도 연산이 적어요. 그리고 삭제 연산이 되게 무거운 편이라서 제안해주신 방법이 훨씬 이득입니다!

 

3. 공간 복잡도 차이

강의 방법: O(N) - all_array 전체 저장 (9명)

제안 방법: O(M) - present_array만 저장 (8명)

present_array가 항상 더 작으니까 메모리를 조금 덜 써요.

 

4. 조기 종료 가능 여부

강의 방법: 무조건 all_array, present_array 전부 순회

제안 방법: all_array 순회 중 결석자 찾으면 바로 return

최선의 경우 1명만 확인하고 끝날 수 있어요.

 

5. 실전에서는요?

이 문제처럼 N이 작으면 (수십 명) 체감되는 차이는 거의 없어요. 둘 다 밀리초 안에 끝나거든요.

하지만 N이 10만, 100만 되면 제안 방법이 확실히 유리해요. 특히 결석자가 앞쪽에 있으면 조기 종료로 엄청 빨라지고요.

 

6. 최종 답변

성능상 "약간" 더 빠릅니다. 중요한 건 둘 다 해시를 쓴다는 거예요. 이중 반복문 O(N²)을 해시로 O(N)으로 줄인 게 핵심이고, 딕셔너리냐 set이냐는 디테일의 차이지만, 이렇게 여러가지 생각해보시면서 개선하려는 모습 넘넘 좋습니다!! 언제든 더 시도해보시면서 개선시켜보시길 추천드립니다!!1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 딸바맛있다님.

질문해주신 출석체크 문제에서 present_array를 먼저 set에 담아두고 all_array를 순회하면서 확인하는 방법은 시간 복잡도와 성능 측면에서 매우 효율적인 전략입니다.

설명:

  • set 자료구조: Python의 set은 내부적으로 해시 테이블을 사용하여 평균적으로 O(1)의 시간 복잡도로 원소 존재 여부를 확인 가능합니다.
  • 코드 설명:
    
    def get_absent_student(all_array, present_array):
      present_students_set = set(present_array)
      for student in all_array:
          if student not in present_students_set:
              return student
    

    위 코드에서 present_arrayset으로 변환하면, 각 학생이 출석했는지를 확인할 때 평균 O(1)로 빠르게 확인할 수 있습니다. all_array를 순회하면서 set을 이용해 출석 여부를 체크하는 것은 성능 측면에서 매우 효율적이며, 전체적인 시간 복잡도는 O(N)입니다. 여기서 N은 all_array의 길이입니다.

결론:

이 방식은 단순히 반복문 내에서 리스트로 확인하는 것보다 훨씬 빠르며, 특히 all_array가 크다면 성능의 차이가 두드러질 수 있습니다.

관련된 유사한 질문을 확인하고 싶으시다면, 아래의 링크를 참고하시기 바랍니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

수강평 이벤트

0

59

2

코딩테스트 처음인데 이런 공부방법이어도 괜찮을까요

0

109

2

3-3 정렬-2 선택정렬 로직

0

54

2

링크드 리스트 끝에서 k번째 값 출력하기

0

62

2

LinkedList 과제 Fast, slow 포인터

0

58

2

투포인터 시간복잡도

0

65

2

수강평 작성 후 자료

0

62

2

수업교재 링크 오류

2

120

2

프로그래머스에서 제출 후 채점시 틀림ㅠ

0

155

2

1-10 알고리즘 더 풀어보기(2) 질문 있습니다

0

81

2

문제 풀이 방식 관련 질문입니다!

0

98

2

1-5 알고리즘과 친해지기 (2) - 최빈값찾기 질문 있습니다

0

101

2

수업자료 pdf 받고싶습니다

0

118

2

강의 자료 오류 수정

0

81

1

2-10 더하거나 빼거나 관련 질문입니다

0

68

2

3-8 해쉬 -2

0

51

2

Linked List Element Delete Explanation Problem

0

74

2

강의3-4 스택 탑 문제

0

79

2

코드스니펫 입출력 케이스에 오류가 있는것 같아요

0

107

3

링크드 리스트 원소 찾기 구현 방식 질문드립니다.

0

82

2

1874 - 스택 문항

0

85

2

DP Java 예제 자료형 오버플로우 문제

0

108

2

4-9 4주차 숙제중 농심라면 문제

0

122

2

DFS 에서 스택을 사용하는 이유

1

207

3