[Do it! 알고리즘 코딩 테스트 자바] 시간복잡도/디버깅/오답 유형(1~2일차)

2026. 2. 25. 19:12·Java

알고리즘 선택의 기준 = 시간 복잡도

수행 시간 -> 1억 번의 연산 = 1초의 시간

최악일 때를 대비해야 함! -> 빅-오 O(n)

 

빅-오 표기법의 시간 복잡도 (데이터 크기 순)

O(n!)-O(2^n)-O(n^2)-O(nlogn)-O(n)-O(logn)

이때 상수는 간주하지 않음 n = 3n

따라서, 같은 차수의 반복문이 여러 개인 것은 의미 없음

하지만, 다른 차수의 반복문은 주의! ex) n과 n^2 -> 가장 많이 중첩된 반복문의 수행 횟수 = 시간복잡도의 기준

 


 

디버깅의 중요성

시간 제한, 변수 초기화 오류, 메모리 누수 방지를 위해 디버깅은 필수적임!

디버깅 대표사례

1. 반복문에서 변수 초기화 오류

반복문에서 다른 테스트 케이스로 결과 변수를 출력하는 경우, 테스트 케이스별로 결과 변수를 초기화하지 않음

-> 이전 반복문의 결과가 중첩되거나 변수가 음수로 출력되는 문제 발생!

2. 반복문에서 인덱스 범위 지정 오류

- 범위의 부등호 실수

- 시작값 설정을 잘못한 경우 -> 특히 인덱스는 0으로 시작한다는 점 주의! 

3. 잘못된 변수 사용 오류

- 출력이나 로직 안에서 사용해야 하는 변수를 다른 변수와 혼동함

 

코딩테스트 자주 하는 오답

자료형 설정

- int는 약 21억이 최댓값이라 계산 시 범위를 초과할 수 있음 

- 범위 초과 시 예상치 못한 음수 결과 출력

- 따라서, int보다 long형을 권장함

 

시간 초과

해결 방법

1. 풀이 로직의 시간복잡도가 제한 시간에 해결할 수 있는 검토

2. 입력과 출력 방식부터 최적화

Scanner와 System.out.print() 대신 BufferedReader와 BufferedWriter 사용

성능 차이의 이유

- 입력할 때마다 자료형 변환 과정 거치고, 출력이 발생할 때마다 버퍼를 비움 -> 비효율

- 입력을 버퍼에 저장한 후 데이터를 한 번에 읽어 옴, 출력할 데이터를 버퍼에 저장 후 한 번에 출력함 -> 효율적

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamReader(System.out));
int b - Integer.parseInt(br.readLine());
br.close();
bw.write(String.valueOf(b)); // 정수는 String형으로 변환 후 출력
bw.flush();
bw.close();

 

인덱스에 의미 부여

문제) 수 정렬 시 1000보다 작은 자연수 10,000,000개를 1초 안에 정렬

해결) 10,000,000의 갯수보다 1000범위에 초점! -> 계수 정렬

- 1001크기의 배열에 인덱스를 1~1000의 숫자 범위로 지정

- 1~1000중 숫자 입력 시 해당 인덱스의 값을 +1함

- 배열 값에 따라 반복하며 1000범위 안의 숫자들을 순서대로 저장 후 마지막에 한번에 출력함

따라서, 인덱스 = 단순한 순서가 아닌 의미를 부여하는 해싱 기법 사용!

 

나머지 연산의 중요성

자료형의 표현 범위를 초과하지 않고, 나머지 연산의 원리 이해가 필요함!

ex) 1부터 50까지 곱한 값을 10007로 나눈 나머지를 구하시오.

문제: 1부터 50까지 곱한 값은 long 자료형의 표현 범위 초과

해결: 나머지 연산의 분배 법칙 적용!

나머지 연산은 덧셈, 뺄셈, 곱셈의 분배 법칙이 성립함(나눗셈 제외) 

- (A + B) % C = ((A % C) + (B % C)) % C

- (A -  B) % C = ((A % C) - (B % C) % C)

- (A * B) % C = ((A % C) * (B %C) % C)

정답을 구한 후 마지막에 나머지 연산을 한 번만 적용하는 건 위험! 

따라서, 수행하는 과정마다 나머지 연산을 적용 후 마지막 결과에도 나머지 연산 적용!

(범위 초과 오류 예방 가능함)

 

정렬의 기초

1. 오름차순 

Arrays.sort(배열명)

- 시간 복잡도: O(n)

2. 내림차순

Arrays.sort(배열명, Collections.reverseOrder())

- 시간 복잡도: O(n)

음수로 활용

- negate(배열명)으로 배열의 값을 음수로 변환 후 

- Arrays.sort(배열명) -> 음수 기준으로 오름차순을 하니 결론은 내림차순 정렬이 가능함

 

다중 정렬

정렬 시 값을 비교하면 여러 조건에 맞게 정렬 가능함!

예를 들어, 영어 성적으로 정렬하면서 영어 성적이 동점인 경우엔 수학 성적으로 정렬함

1. Comparable 인터페이스

- 성적 클래스 정의, 성적 클래스에 인터페이스 상속

- 성적 클래스에 compareTo함수 override함

- 현재 성적과 비교할 성적을 비교 후 음수 또는 양수 반환

- 영어 성적이 같은 경우, 수학 성적 비교 후  음수 또는 양수 반환

Collections.sort(리스트명); -> 여러 조건에 맞게 정렬

 

2. Comparator 인터페이스

- 외부에 ScoreComparator 클래스 정의 후 Comparator<타입> 상속

- ScoreComparator 클래스 내에 compare 함수 override

Collections.sort(리스트명, new ScoreComparator()); -> 여러 조건에 맞게 정렬

 

Comparable은 한 클래스에 한 비교 함수만 구현 가능하지만,

Comparator은 외부에 선언해 여러 클래스에 비교 함수 구현 가능함.

 

이차원 ArrayList 사용

그래프 구조를 표현하는데 많이사용함 -> 그래프 관련 알고리즘에 사용

 

그래프의 구조

- 노드=원형, 에지 = 화살표

2차원 ArrayList를 이용한 그래프 구현

1. 2차원 ArrayList 선언과 초기화

-그래프의 Edge 클래스 생성(endNode, value로 구성)

- ArrayList<Edge> 리스트명[] = new ArrayList[리스트 크기];

- 리스트 크기만큼 반복하며 리스트의 값에 각각의 새 ArrayList를 할당

2. 그래프 데이터 저장

- 리스트의 인덱스 = 시작 노드로 의미 부여

- s(시작노드), e(끝 노드), v(가중치)의 3개의 값을 입력 받음(저장할 edge 개수만큼 반복)

ex) list[s].add(new Edge(e, v))

3. 그래프 데이터 가져오기

ex) 1번 노드인 경우 

- Edge tmp = list[1].get(i) 여기서 i는 0부터 list[1].size()범위까지 가져옴

저작자표시 (새창열림)

'Java' 카테고리의 다른 글

[Do it! 알고리즘 코딩 테스트 자바] 투 포인터 - 백준 2018, 1940, 1253번 (4일차)  (1) 2026.02.27
[Do it! 알고리즘 코딩 테스트 자바] 백준 10986나머지 합- 구간합/나머지 연산의 활용(3일차)  (0) 2026.02.26
[Android] JetPack Compose Compose 단계/앱개발자가 화면이 그려지는 과정을 알아야 하는 이유  (0) 2025.06.25
[Android] JetPack Compose ViewModel이 필수적인 이유/UI에 상태 관리하면 생기는 문제  (1) 2025.06.24
[Android] JetpackCompose을 사용하는 이유/Composable란  (0) 2025.06.23
'Java' 카테고리의 다른 글
  • [Do it! 알고리즘 코딩 테스트 자바] 투 포인터 - 백준 2018, 1940, 1253번 (4일차)
  • [Do it! 알고리즘 코딩 테스트 자바] 백준 10986나머지 합- 구간합/나머지 연산의 활용(3일차)
  • [Android] JetPack Compose Compose 단계/앱개발자가 화면이 그려지는 과정을 알아야 하는 이유
  • [Android] JetPack Compose ViewModel이 필수적인 이유/UI에 상태 관리하면 생기는 문제
미우딩
미우딩
다양한 프로그래밍 언어를 공부하고 있는 공대생입니다! Python, Java, C언어를 주로 공부하고 있으며 Figma를 통한 디자인도 종종 올릴 예정입니다.
  • 미우딩
    미우의 코딩 기록
    미우딩
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • Java (47)
      • C언어 (0)
      • 대외활동 (5)
      • Spring (4)
      • 프로젝트 (2)
      • 앱개발 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    IT #코딩테스트 #알고리즘 #스택 #
    android #java #kotlin #compose
    IT #알고리즘 #코딩테스트 #삽입정렬 #오름차순정렬
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #아스키코드
    IT #코딩테스트 #알고리즘 #슬라이딩윈도우 #투포인터 #함수
    Spring #정적컨텐츠 #MVC #템플릿엔진 #API #애너테이션
    IT #알고리즘 #코딩테스트 #퀵정렬 #오름차순정렬
    IT #알고리즘 #그리디알고리즘 #탐욕알고리즘 #코테
    IT #알고리즘 #코딩테스트 #우선순위큐 #힙 #절댓값 #오름차순 #정렬
    IT #큐 #알고리즘 #코딩테스트 #자바 #선입선출
    IT #코딩테스트 #알고리즘 #투포인터 #시간제한 #Scanner #BufferedReader #StringTokenizer
    java #android #개발자
    IT #BFS #코딩테스트 #구현 #큐 #재귀함수
    IT #알고리즘 #코딩테스트 #DFS
    BufferedReader
    IT #코딩테스트 #알고리즘 #DFS #재귀함수 #무방향그래프
    IT #백준 #코딩테스트 #알고리즘 #구간합 #반복문
    IT #코딩테스트 #이진탐색 #알고리즘
    IT #코딩테스트 #알고리즘 #백준 #투포인터 #배열
    IT #백준 #알고리즘 #코딩테스트 #배열 #형변환 #평균구하기
    IT #코딩테스트 #알고리즘 #버블정렬 #오름차순
    IT #알고리즘 #코딩테스트 #선택정렬 #내림차순정렬 #최댓값
    push #pop #StringBuffer
    android #java #kotlin #상태관리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
미우딩
[Do it! 알고리즘 코딩 테스트 자바] 시간복잡도/디버깅/오답 유형(1~2일차)
상단으로

티스토리툴바