기록방

Java 코딩 테스트 교재 #1 본문

CS/알고리즘

Java 코딩 테스트 교재 #1

Soom_1n 2022. 9. 20. 18:28

Do it! 알고리즘 코딩 테스트 - 자바 편

1장 : 어떤 알고리즘으로 풀어야할까?


💡 알고리즘 선택의 기준이 되는 시간 복잡도

코딩 테스트의 핵심 중 하나는 시간 복잡도를 고려해 적절한 알고리즘을 선택하는 것

 

01-1 시간 복잡도 표기법 알아보기

시간복잡도 : 주어진 문제를 해결하기 위한 연산 횟수 (일반적으로 1억번 연산을 1초로 간주해서 예측)

 

시간 복잡도 유형

  • 빅-오메가(Ω(n)) : 최선일 때(best case)의 연산 횟수를 나타낸 표기법
  • 빅-세타(Θ(n)) : 보통일 때(average case)의 연산 횟수를 나타낸 표기법
  • 빅-오(O(n)) : 최악일 때(worst case)의 연산 횟수를 나타낸 표기법
  • ⇒ 코딩 테스트에서는 빅-오 표기법을 기준으로 수행 시간을 계산 (최악을 염두)

01-2 시간 복잡도 활용하기

  • 버블 정렬 : O(n^2)
  • 병합 정렬 : O(nlogn)

[연습문제 #000 : 수 정렬하기 (boj_2750)]

n 개의 수를 오름차순 정렬한다 (책에서 n은 1~1,000,000 , 사이트는 1~1,000)

  • 제한시간 2초 : 2억번 이하의 연산 횟수로 해결
  • 연산 횟수 = 알고리즘 시간 복잡도 * 데이터의 크기
    • 버블 정렬 = (1,000,000)$^2$ = 1,000,000,000,000 > 200,000,000 ⇒ 부적합 알고리즘
    • 병합 정렬 = 1,000,000log(1,000,000) = 약 20,000,000 < 200,000,000 ⇒ 적합 알고리즘

시간 복잡도를 바탕으로 코드 로직을 개선

시간 복잡도 검출 기준

  1. 상수는 시간 복잡도 계산에서 제외한다.
  2. 가장 많이 중첩된 반복문의 수행 횟수가 시간 복잡도의 기준이 된다.
    • ex) 입력이 N일때 for문으로 0~N 반복
      • for문이 1개 : 연산 횟수 N ⇒ O(N)
      • for문이 3개 : 연산 횟수 3N ⇒ O(N)
        • 상수를 무시하므로 시간 복잡도가 같다
      • for문 2개를 중첩 : 연산 횟수 N$^2$ ⇒ O(N$^2$)
        • 일반 for문이 더 있다더라도 시간 복잡도는 가장 많이 중첩 된 for문이 기준이다

작성한 코드에 시간복잡도를 도출할 수 있다면, 실제 코딩 테스트에서 시간 초과가 발생했을 때 문제가 되는 부분을 도출 할 수 있고, 연산에 더욱 효율적인 구조로 수정하는 작업으로 문제를 해결할 수 있다.

원본 노션 정리 글

 

자바 알고리즘 교재 #1

1장 : 어떤 알고리즘으로 풀어야할까?

probable-legume-162.notion.site

728x90

'CS > 알고리즘' 카테고리의 다른 글

Java 코딩 테스트 교재 #3  (0) 2022.09.21
Java 코딩 테스트 교재 #2  (0) 2022.09.20
정렬 - 버블 정렬(Bubble Sort)  (0) 2021.04.26
정렬 - 삽입정렬(Insertion Sort)  (0) 2021.04.26
정렬 - 선택정렬(Selection Sort)  (0) 2021.04.26