Do it! 알코테 자바

[Do it] 알코테 자바 2일차

namerong 2026. 2. 24. 23:25

 

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. 시간 초과의 원인을 찾아 해결하기

자주 틀리는 원인

  1. 입력이 많음
  2. 출력이 많음
  3. 불필요한 반복문
  4. 느린 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