Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Java, only for Coding Tests

코딩테스트 직전 빠르게 훑어보기 위한 치트시트입니다. 각 항목의 기억포인트는 "이게 뭘 하는지 + 뭘 조심해야 하는지"를 함께 담았고, 링크를 누르면 관련 문제/풀이로 연결됩니다.

목차


🧰 코테 준비물

개념 기억포인트 링크
import 기본 세트 * java.util.*, java.io.* 코테 시작 전 무조건 추가 🔗
Scanner vs BufferedReader * 코테는 BufferedReader 권장
 - Scanner보다 빠름, 시간초과 시 의심 1순위
* br.readLine()+StringTokenizer로 토큰 분리
 - 토큰은 한 번 꺼내면 재사용 불가
* 끝에 공백 있을 수 있으니 readLine().trim() 습관화
🔗
throws Exception * main에 붙여 예외처리 JVM에 위임
 - 코테에선 try-catch 대신 간단히 사용
* BufferedReader.readLine()IOException 발생 가능
 → 안 붙이면 "Unhandled exception type" 컴파일 에러
🔗
StringBuilder * 문자열 +는 매번 새 문자열 생성(느림)
 - StringBuilder는 버퍼에 누적(O(1) 수준)
* append()는 메서드 체이닝 가능
 - .append(a).append(b) 식으로 연결
* 큰 루프에서 문자열 누적할 때 거의 필수, 안 쓰면 시간초과 위험
🔗
배열 출력 디버깅 * 1차원: Arrays.toString(arr) → [1, 2, 3]
* 2차원
 - for(row) println(Arrays.toString(row))
 - 또는 Arrays.deepToString(map) 한 줄로
* 제출 전 꼭 삭제!
🔗

목차로 돌아가기


☕ Java 문법

개념 기억포인트 링크
최대/최소 구하기 * Math.max(a,b)/min(a,b)로 2개 비교
* 배열 초기화
 - 그냥 순회: arr[0]
 - 탐색(누적): MIN/MAX_VALUE
🔗
Integer.parseInt() * 문자열→int 변환
* 공백 있으면 예외 → trim() 먼저
🔗
split() * 문자열을 구분자로 잘라 String[] 반환
* 끝 공백 보존하려면 split(" ", -1)
🔗
println/printf/String.format * println
 - 자동줄바꿈, 포맷 불가
* printf
 - 포맷팅+즉시출력, 줄바꿈은 \n 직접
* String.format
 - 문자열로 반환만, 출력은 안 함
🔗
toUpperCase/toLowerCase * char: Character.toUpperCase()
* String: s.toUpperCase()
* 알파벳만 영향, 숫자·공백은 그대로
🔗
charAt() * 인덱스로 문자 하나 꺼냄(0부터 시작)
 - 빈 문자열에 호출 시 에러 주의
* 숫자문자열: line.charAt(j) - '0'로 char→int 변환
* 공백구분: StringTokenizer로 토큰 뽑은 후 .charAt(0)
🔗
length vs length() vs size() * 배열: .length(속성, 괄호X)
 - 선언 크기 그대로, 실제 데이터 개수 아님
* 문자열: .length()(메서드) — 실제 길이 반환
* 리스트: .size() — 실제 담긴 개수, null 걱정 없음
🔗
isEmpty() * 문자열 길이 0인지 검사(length()==0과 동일)
 - true/false 반환
* split() 결과 빈 문자열에 charAt(0) 호출 시 에러 방지용으로 자주 씀
* null과는 다른 개념 — null에 호출하면 NullPointerException
🔗
substring() * substring(i): i부터 끝까지
* substring(i,j): i이상 ~ j미만(끝 미포함)
* charAt(0)+substring(1) 조합
 - "첫 글자만 다르게 처리" 패턴 (JadenCase 등)
🔗
String.join() * join(구분자, 배열/List)로 합치기
 - 빈 문자열("")도 자리 그대로 살림
* split으로 나눈 걸 다시 join하면 원래 공백 구조 복원
 → 둘은 짝 메서드
🔗
char+char vs char+String * char는 사실 정수(유니코드 코드값)
 - char+char는 숫자 더하기(int로 승격)
* String이 하나라도 섞이면 전체가 문자열 결합으로 바뀜
* 혼합 연산은 왼쪽부터 순서대로 계산
 → String 등장 시점부터 결합 시작
🔗
Deque * 스택(LIFO)·큐(FIFO) 둘 다 구현 가능
 - 삽입 속도가 ArrayList보다 빠름
* add/remove/get은 예외 발생
 - offer/poll/peek은 false/null 반환 → 코테엔 후자 추천
* 스택처럼: push/pop/peek (=addFirst/removeFirst/peekFirst)
* 큐처럼: offer/poll/peek (=addLast/pollFirst/peekFirst)
🔗
String 순회 방법 * String은 Iterable 미구현
 - for(char c : s) 안 됨
* 인덱스 불필요: toCharArray()+for-each (가장 간결)
* 인덱스 필요(앞뒤 비교 등): charAt(i)+일반 for문
🔗
StringTokenizer vs split() * 구분자
 - ST: 단일문자/문자열만
 - split: 정규식 가능(여러 구분자 동시)
* 빈문자열
 - ST: 무시함
 - split: 남김 ("A,,B" → ST는 2토큰, split은 빈칸 포함)
* 속도는 ST가 더 빠름(정규식 파싱 없음) → 코테는 보통 ST가 더 흔함
* 접근 방식: ST는 순차 접근만, split은 배열이라 인덱싱 가능
🔗
int vs long * 값이 10^9 넘으면 int 오버플로우 위험 → long 사용
* 연산 전에 캐스팅해야 함
 - (long) a * b (O)
 - 곱한 후 캐스팅은 이미 망가진 값 (X)
* long 리터럴엔 끝에 L 필수
 - 12345678900L, 안 붙이면 int 범위로 인식돼 에러
🔗
나눗셈/나머지(/,%) * int/int는 소수점 버리고 정수만 반환
 - 7/2 → 3, 3.5 아님
* 소수점 원하면 피연산자 하나만 (double)로 캐스팅
 - (double)7/2 또는 7/(double)2
* %는 나머지를 정수로 반환 (7%2 → 1)
🔗
Math.ceil/floor/round * 반환 타입
 - ceil: 올림, double 반환
 - floor: 내림, double 반환
 - round: 반올림, long 반환(float 인자는 int)
* 음수 주의
 - ceil(-3.1) = -3.0 (큰 쪽)
 - floor(-3.1) = -4.0 (작은 쪽)
 - round(-3.5) = -3 (0.5는 위로 반올림)
* 자리수 맞춰 출력하려면 String.format("%.2f", ...)
🔗
ArrayList * 크기 가변 배열
 - 핵심 메서드: add/get/set/remove/size/isEmpty
* ==는 참조 비교(false)
 - equals()는 요소+순서 비교 → 동등 비교는 꼭 equals()
* 순서 무관 비교는 new HashSet<>(list) 변환 후 equals()
🔗
Arrays.fill() * Arrays.fill(배열, 값)로 모든 요소를 한 값으로 채움
* for문으로 직접 채우는 것과 동일, 코드만 한 줄로 단축
🔗
char-인덱스 변환 * 문자→숫자: ch - 'A'
 - 둘 다 int로 승격, 'A'=65 기준 오프셋
* 숫자→문자: (char)(idx + 'A')
 - 더하기 먼저 하고 캐스팅해야 함, 안 그러면 int로 남음
🔗
== vs equals() * 기본타입(int, char 등): ==로 값 비교
* 참조타입(String, 객체): ==가 메모리주소 비교
* String 내용 비교는 무조건 equals()
 - new String()은 같은 내용도 ==는 false
* 사용자 정의 클래스는 equals() 직접 오버라이드 필요
 - hashCode()도 같이 오버라이드
🔗
String.contains() * 부분 문자열 포함 여부 boolean 반환, 대소문자 구분함
* char는 직접 안 됨
 - String.valueOf(ch)로 변환 필요, null 넣으면 NPE
* 대소문자 무시하려면 toLowerCase()/toUpperCase() 먼저 처리
🔗
Arrays.sort/Collections.sort * int[]는 reverseOrder 못 씀
 → 오름차순 후 뒤에서부터 읽기(또는 양끝 swap)
* 람다 정렬 공식
 - 오름차순: o1-o2
 - 내림차순: o2-o1
 - 다중조건: 같으면 다음 조건으로 흘려보내기
 - String: compareTo() 사용
* 뺄셈은 오버플로우 위험(21억↑)
 → Integer.compare() / Double.compare() 권장
* sort()는 원본 직접 수정(void 반환)
 - 1차원: clone()으로 복사
 - 2차원: clone은 얕은복사라 위험 → for문으로 deep copy
* ArrayList는 Collections.sort(list,...) 또는 list.sort(...)
 → 문법은 배열과 동일
🔗
Math.pow() * Math.pow(a,b) = a의 b제곱, 반환형은 항상 double
* int/long 넣으면 자동으로 double로 승격(widening)
* int로 받고 싶으면 캐스팅
 - 단순 캐스팅은 정밀도/범위 문제 위험
 - 범위 초과 시 클램핑됨(MAX/MIN_VALUE로), NaN은 0
🔗
배열 리터럴 {} * int[] arr = {1,2}처럼 선언과 동시에만 축약 리터럴 가능
* 메서드 인자 등 선언이 아닌 곳에서 쓰려면 new int[]{...} 필수
 - list.add({y,x}) (X) → list.add(new int[]{y,x}) (O)
🔗
얕은 복사 vs 깊은 복사 * 변수엔 실제값이 아니라 참조(주소)만 담김
 → copy = original은 같은 거 가리킴
* 1차원 배열은 clone()으로 충분
* 2차원 배열·객체 배열은 clone()해도 안쪽이 공유됨(얕은 복사)
 → 2차원: for문으로 각 행 clone()
 → 객체 배열: new 객체(...)로 새로 생성
🔗
Math.abs() * 절댓값 반환, 음수든 양수든 항상 양수로
* 두 값의 차이(거리) 구할 때 자주 씀 → Math.abs(a-b)
🔗
Math.sqrt() * 제곱근 반환(항상 double, 양수만)
* 제곱수 판별 패턴: (long)Math.sqrt(n) 구한 뒤 r*r==n으로 검증
 - 단순 캐스팅(버림)이라 오차 가능성 있어 꼭 역검증 필요
🔗
String.valueOf() * 기본타입(int,char 등)→문자열, 객체는 내부적으로 toString() 호출
* null 안전: valueOf(null)은 "null" 문자열 반환, 예외 없음
 - 반면 obj.toString()은 obj가 null이면 NPE 발생
🔗
HashSet * 중복 불허, 순서 보장 안 함, add/contains/remove 다 O(1)
* 핵심 메서드: add/remove/contains/size/isEmpty/clear/iterator()
* add()는 중복 시도하면 false 반환(에러 아님)
* equals()는 순서 무관하게 요소만 같으면 true (ArrayList와 다른 점!)
🔗
PriorityQueue * 힙 기반, 기본은 최소힙(작은 값 먼저)
* 최대힙 원하면 new PriorityQueue<>(Collections.reverseOrder())
* 객체 우선순위 정하는 법
 - Comparable 구현 (compareTo 오버라이드)
 - 또는 생성자에 Comparator 직접 넘기기
* add는 실패시 예외, offer는 false 반환(Deque와 동일 패턴)
🔗
Integer.bitCount() * n을 2진수로 봤을 때 1의 개수 카운트 (bitCount(7)→3)
* 활용 패턴
 - 1의 개수 같은지 비교: bitCount(a)==bitCount(b)
 - 부분집합 탐색: bitCount(mask)==k로 k개 선택된 경우 필터
 - 2의 거듭제곱 판별: bitCount(n)==1
* 확인용으로 Integer.toBinaryString(n)과 같이 쓰면 좋음
🔗
String.replace() * 문자열 그대로 찾아서 교체(정규식 아님)
* 빈문자열("")로 바꾸면 제거 효과
* 원본 불변 → 반드시 s = s.replace(...)로 재할당해야 적용됨
* 활용: 제거 전후 length() 차이로 제거된 개수 계산 가능
🔗
2차원 배열 초기화
(원시 vs 참조타입)
* 원시타입(int 등): 선언만으로 기본값 자동 초기화, 바로 사용 가능
* 참조타입(String, Set 등): 선언 직후 전부 null
 → 각 칸에 new 직접 해줘야 함
 - 안 하고 쓰면 NullPointerException
* Set/List 같은 제네릭은 new Set<T>[N][N] 자체가 컴파일 에러
 → new HashSet[N][N]처럼 Raw Type으로 생성(경고만 뜸, 비대칭 선언)
🔗
if-else if-else * else는 선택사항, 안 써도 문법적으로 문제없음
* 모든 조건이 false면 그냥 아무것도 실행 안 하고 넘어감
🔗
toString() * println(객체)는 내부적으로 객체.toString() 자동 호출
* 오버라이드 안 하면 클래스명@해시값 형태로 출력됨 (의미없는 값)
* 커스텀 클래스 만들 때
 → @Override toString() 정의하면 원하는 형태로 출력 가능
* List/배열도 내부 요소마다 toString() 호출해서 출력 ([(1,2), (3,4)])
🔗

목차로 돌아가기


🧩 알고리즘

개념 기억포인트 링크
다익스트라 vs 플로이드워셜 * 다익스트라: 단일 출발점→모든 정점, O((V+E)logV), 음수 가중치 불가
* 플로이드워셜: 모든 정점 쌍, O(V³), 음수 가중치 허용(음의 사이클은 불가)
* 선택 기준
 - 정점 많고 간선 적음 + 출발점 하나 → 다익스트라
 - 정점 적음(≤100) + 모든 쌍 필요 → 플로이드워셜
🔗
1차원→2차원 배열 변환 * n = (int)Math.sqrt(arr.length)로 한 변의 길이 구함
* matrix[i/n][i%n] = arr[i]로 순서대로 배치
 - i/n: 몇 번째 행인지, i%n: 그 행의 몇 번째 칸인지
🔗
BFS 연결요소 크기 * 큐에 넣을 때 visited=true 표시 → 중복 방문 차단
* count는 "꺼낼 때"(poll 시점) 증가
 - visited 덕분에 각 칸은 딱 한 번만 큐에 들어갔다 나옴
 → 꺼낸 횟수 = 방문한 칸 수 = 연결된 영역 크기
🔗
투포인터 * 연속된 구간을 다루는 문제에서 의심 (포인터 2개로 O(n²)→O(n))
 - 핵심 전제: 단조성 (포인터 옮기면 결과가 한 방향으로만 변함, 안 그러면 못 씀)
* 구간형 (start, end 같은 방향으로 전진)
 - 정렬 불필요, 연속 부분합/구간 문제에 사용
 - sum<target → end++, sum>target → start++(앞 버리기)
 - 종료 조건은 무한히 늘어날 수 있는 포인터(end) 말고, 상한이 있는 포인터(start) 기준으로
* 좁히기형 (left=0, right=n-1에서 좁혀옴)
 - 반드시 정렬 필요, 두 원소의 합/차·회문 판별에 사용
 - sum<target → left++, sum>target → right--
* 구분 기준: 두 포인터가 구간의 경계(사이값 전부 포함)인가, 원소 2개(둘만 비교)인가
🔗

목차로 돌아가기


📐 수학

개념 기억포인트 링크
곱의 합 최소/최대 (재배열 부등식) * 최소화: A↑ × B↓ (한쪽 오름차순, 한쪽 내림차순)
* 최대화: A↑ × B↑ (둘 다 같은 순서)
* 구현: 둘 다 오름차순 정렬 후, B는 B[n-1-i]로 역순 접근
🔗
모듈러 연산 (오버플로우 방지) * 사칙연산은 모듈러를 씌운 채로 진행해도 결과가 같음
 - (a%M+b%M)%M = (a+b)%M, 곱셈/뺄셈도 동일
* 마지막에만 % MOD 하면 늦음 → 중간 연산마다 매번 적용해야 함
 - ex) dp[i] = (dp[i-1]+dp[i-2]) % MOD (덧셈마다 적용)
🔗
등차수열 합 공식 * 1부터 n까지의 합: n(n+1)/2
 - 가우스 합, 등차수열 합 일반형(첫항+끝항)×개수/2의 특수 케이스
* a부터 b까지의 합: b(b+1)/2 - (a-1)*a/2
 - 1부터 b까지 합에서 1부터 (a-1)까지 합을 뺀 것
* 구간 하나의 합을 한 번에 계산할 때 적합
 - 투포인터처럼 구간을 한 칸씩 옮길 땐, 이 공식 매번 재계산보다 sum+=end/sum-=start 누적 갱신이 더 효율적
🔗
연속한 자연수 합의 표현 개수 * 자연수 n을 연속한 자연수의 합으로 표현하는 방법의 수 = n의 홀수 약수 개수
 - 유도: 2n = k*(2a+k-1)에서 k와 (2a+k-1) 중 정확히 하나는 홀수
* 코드: i*i<=n까지만 약수 탐색하면 O(√n)
 - i가 홀수 약수면 카운트, n/i도 약수이고 홀수면 카운트(단, i≠n/i일 때만)
* 빠르지만 증명 없이 암기만 하면 변형 문제(구간 길이 제약 등)에서 못 써먹을 위험 있음
 - 투포인터로 원리 이해 후, 더 빠른 선택지로 알아두는 게 안전
🔗

목차로 돌아가기

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages