03. 미리 보는 코딩 테스트 오답 노트
03-1. 예상치 못한 음수 결과 해결하기
문제 원인
int 범위를 초과하면 오버플로우(overflow) 가 발생한다.
int a = 2_000_000_000;
int b = 2_000_000_000;
System.out.println(a + b); // 음수 출력됨 (오버플로우)
int의 범위
-2,147,483,648 ~ 2,147,483,647
-> 이 범위를 넘으면 값이 순환하며 음수가 된다.
해결 방법
큰 수가 나올 가능성이 있다면 처음부터 long 사용
long a = 2_000_000_000L;
long b = 2_000_000_000L;
System.out.println(a + b); // 정상 출력
실전 팁
- 곱셈이 들어간다?
- N ≤ 1,000,000,000 같은 조건이 있다?
- 누적합 문제다?
-> long부터 의심하자
03-2. 시간 초과의 원인을 찾아 해결하기
자주 틀리는 원인
- 입력이 많음
- 출력이 많음
- 불필요한 반복문
- 느린 I/O 사용
I/O 최적화
Scanner는 느리다.
대신 사용:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedReader / BufferedWriter란?
- 데이터를 버퍼에 모았다가 한 번에 처리
- I/O 횟수를 줄여 성능 향상
- 대량 입력 문제에서 필수
실전 팁
- 입력 10만 줄 이상? → 무조건 BufferedReader
- 출력도 많다면 StringBuilder 사용
StringBuilder sb = new StringBuilder();
sb.append(result).append("\n");
System.out.print(sb);
03-3. 인덱스에 의미 부여하여 풀어 보기
배열의 인덱스는 단순 번호가 아니다.
-> 문제의 의미를 담는 위치값
예:
int[] score = new int[101];
score[학생번호] = 점수
인덱스를 활용하면
별도 객체 없이도 문제를 간결하게 풀 수 있다.
실전 예시
카운팅 문제
int[] count = new int[10];
count[num]++; // num이 몇 번 나왔는지 저장
03-4. 나머지 연산의 중요성
코테에서 %는 거의 필수다.
분배 법칙
(a + b) % c = (a % c + b % c) % c
(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,000,000,007)
long result = (a % MOD * b % MOD) % MOD;
03-5. 정렬 기초 다지기
오름차순
Arrays.sort(arr);
내림차순
Arrays.sort(arr, Collections.reverseOrder());
단, Integer 배열이어야 한다 (int X)
부호 반전 활용
Arrays.sort(arr);
for(int i=0; i<arr.length; i++) {
arr[i] = -arr[i];
}
03-6. 다중 조건 정렬 익히기
Comparable
- 클래스 내부 정의
- 하나의 기준만 가능
class Person implements Comparable<Person> {
int age;
@Override
public int compareTo(Person o) {
return this.age - o.age;
}
}
Comparator
- 외부에서 정의
- 여러 기준 가능
Arrays.sort(arr, (a, b) -> {
if(a.age == b.age) {
return a.name.compareTo(b.name);
}
return a.age - b.age;
});
언제 무엇을 쓸까?
상황선택
| 정렬 기준이 하나 | Comparable |
| 문제마다 정렬 기준 다름 | Comparator |
03-7. 이차원 ArrayList 사용하기
2차원 배열 대신 사용 가능
ArrayList<ArrayList<Integer>> list = new ArrayList<>();
for(int i = 0; i < n; i++) {
list.add(new ArrayList<>());
}
값 추가:
list.get(0).add(10);
사용 시기
- 행마다 길이가 다른 경우
- 그래프 인접 리스트
- 동적 크기 필요할 때
'Do it! 알코테 자바' 카테고리의 다른 글
| [Do it] 알코테 자바 6일차 (0) | 2026.03.02 |
|---|---|
| [Do it] 알코테 자바 5일차 (0) | 2026.02.27 |
| [Do it] 알코테 자바 4일차 (0) | 2026.02.26 |
| [Do it] 알코테 자바 3일차 (0) | 2026.02.25 |
| [Do it] 알코테 자바 1일차 (1) | 2026.02.23 |