Skip to content
 
 

Repository files navigation

자바 알고리즘 인터뷰 with 코틀린

102가지 알고리즘 문제 풀이로 완성하는 코딩 테스트

《자바 알고리즘 인터뷰 with 코틀린》은 다음 판매처에서 구매하실 수 있습니다.

및 전국 교보문고 매장

★ 정오표: (아직 등록된 정오사항이 없습니다)
★ 도서정보: https://www.onlybook.co.kr/entry/java-algorithm-interview

★ 참고: 《파이썬 알고리즘 인터뷰》 https://github.com/onlybooks/python-algorithm-interview

마인드맵

빌드 / 코드 품질

Java 25 + Kotlin 2.3 + Gradle 9.4.1 기반의 Gradle 프로젝트입니다. Spotless 하나로 Java와 Kotlin 포맷팅을 통합하고, Checkstyle로 Java 정적 분석을, JaCoCo로 테스트 커버리지를 측정합니다.

도구 구성

도구 역할 대상
Spotless + google-java-format 자동 포맷팅 src/**/*.java, test/**/*.java
Spotless + ktlint 자동 포맷팅 src/**/*.kt
Checkstyle 정적 분석 (네이밍·import·코드 품질) src/**/*.java, test/**/*.java
JaCoCo 테스트 커버리지 리포트 전체 소스

ktlint 플러그인을 별도로 쓰지 않는 이유 Spotless가 ktlint 엔진을 내장하고 있어 기능이 동일합니다. ./gradlew spotlessApply 하나로 Java와 Kotlin을 동시에 처리할 수 있어 설정을 단순하게 유지합니다.


Spotless — 자동 포맷팅

Java: google-java-format AOSP 모드 (4-space 들여쓰기) Kotlin: ktlint (4-space 들여쓰기)

# 파일을 직접 수정해 포맷을 맞춤 (커밋 전 실행)
./gradlew spotlessApply

# 포맷이 올바른지 검사만 수행 (파일 수정 없음, CI 용)
./gradlew spotlessCheck

spotlessApply가 자동으로 처리하는 항목:

  • 들여쓰기·공백 정규화
  • 미사용 import 제거
  • 줄 끝 공백 제거
  • 파일 끝 개행 보장
  • Kotlin 코드 ktlint 스타일 정렬

이 프로젝트에서 비활성화한 ktlint 규칙

알고리즘 문제 풀이 특성상 아래 규칙은 비활성화되어 있습니다 (build.gradle.ktseditorConfigOverride).

규칙 비활성화 이유
class-naming 파일명이 문제 번호 기반 (P001_3, P096_2)
function-naming 문제 인터페이스 메서드명 그대로 사용 (Front(), Push())
property-naming 알고리즘 관례 변수 허용 (N, M, INF)
no-wildcard-imports 알고리즘 코드에서 java.util.* 관행적 사용

Checkstyle — 정적 분석

Spotless가 포맷을 담당하므로 Checkstyle은 포맷 규칙을 포함하지 않습니다. 검사 항목: 미사용·중복 import / 네이밍 컨벤션 / equals·hashCode 누락 / switch fall-through / 문자열 == 비교 / 접근 제어자 순서·중복 / @Override 누락 등.

# src/ 검사
./gradlew checkstyleMain

# test/ 검사
./gradlew checkstyleTest

리포트 읽는 법

Checkstyle 검사 후 아래 경로에 HTML 리포트가 생성됩니다.

build/reports/checkstyle/
├── main.html    # src/ 결과
└── test.html    # test/ 결과

브라우저에서 열면 위반 파일·줄 번호·규칙명을 한눈에 확인할 수 있습니다.

# macOS에서 바로 열기
open build/reports/checkstyle/main.html

리포트 항목 예시:

항목 설명
File 위반이 발생한 소스 파일 경로
Line 해당 줄 번호 (클릭하면 소스 확인 가능)
Message 위반 내용 (Variable 'x' must match pattern 등)
Rule Checkstyle 규칙 이름 (RedundantModifier, UnusedImports 등)

자주 나오는 규칙 설명:

규칙 의미 수정 방법
RedundantModifier 비공개 중첩 클래스 생성자의 불필요한 public 해당 public 제거
ModifierOrder static public 등 JLS 권장 순서 위반 public static으로 변경
UnusedImports 사용하지 않는 import 해당 import 제거
StringLiteralEquality 문자열을 ==로 비교 .equals()로 변경
FallThrough switch case에 break 누락 break 추가 또는 // falls through 주석
MissingOverride 오버라이드 메서드에 @Override 없음 @Override 추가

특정 줄 억제

부득이하게 규칙을 무시해야 할 경우, 어노테이션으로 억제할 수 있습니다.

// 단일 규칙 억제
@SuppressWarnings("checkstyle:RedundantModifier")
public MyConstructor() { ... }

// 여러 규칙 동시 억제
@SuppressWarnings({"checkstyle:ModifierOrder", "checkstyle:UnusedImports"})

전체 검사 (Spotless + Checkstyle + 테스트 + 커버리지)

./gradlew check

check 한 번으로 아래 단계가 순서대로 실행됩니다.

spotlessApply → compile → checkstyle → test → jacocoTestReport
단계 내용
spotlessApply Java·Kotlin 파일 자동 포맷 (파일 직접 수정)
compile src/ + test/ 컴파일
checkstyleMain / checkstyleTest 정적 분석
test JUnit 5 테스트 실행
jacocoTestReport 커버리지 리포트 생성

빌드

./gradlew build

check 완료 후 JAR 패키징(assemble)을 수행합니다.

테스트 실행

./gradlew test

소스나 테스트 파일이 변경되지 않으면 Gradle이 UP-TO-DATE로 건너뜁니다. 강제로 재실행하려면 아래 명령을 사용합니다.

# test 태스크만 강제 재실행 (Gradle 7.6+)
./gradlew test --rerun

# 또는 테스트 결과물을 삭제하고 재실행
./gradlew cleanTest test

테스트가 끝나면 JaCoCo 커버리지 리포트도 자동으로 생성됩니다.

테스트 리포트

build/reports/tests/test/index.html        # JUnit 결과 (통과·실패·시간)
build/reports/jacoco/test/html/index.html  # JaCoCo 커버리지 (라인·브랜치)
build/reports/jacoco/test/jacocoTestReport.xml  # XML (CI 연동용)
# macOS에서 바로 열기
open build/reports/tests/test/index.html
open build/reports/jacoco/test/html/index.html

JaCoCo 리포트 항목:

항목 설명
Element 패키지 → 클래스 → 메서드 단위로 드릴다운 가능
Missed Instructions 실행되지 않은 바이트코드 명령 수
Cov. 커버리지 비율 (녹색 = 커버됨, 빨간색 = 미커버)
Missed Branches 실행되지 않은 분기 수 (if/switch)
Missed/Total Lines 미실행 줄 수 / 전체 실행 가능 줄 수

문제 풀이

번호 제목 난이도 풀이 코드
1 유효한 팰린드롬 6장. 문자열 조작 P001_1.java
P001_2.java
P001_3.kt
2 문자열 뒤집기 6장. 문자열 조작 P002_1.java
P002_2.kt
3 로그 파일 재정렬 6장. 문자열 조작 P003_1.java
P003_2.kt
4 가장 흔한 단어 6장. 문자열 조작 P004_1.java
P004_2.kt
5 그룹 애너그램 ★★ 6장. 문자열 조작 P005_1.java
P005_2.kt
6 가장 긴 팰린드롬 부분 문자열 ★★ 6장. 문자열 조작 P006_1.java
P006_2.kt
7 두 수의 합 7장. 배열 P007_1.java
P007_2.java
P007_3.java
P007_4.java
P007_5.kt
8 빗물 트래핑 ★★★ 7장. 배열 P008_1.java
P008_2.java
P008_3.kt
9 세 수의 합 ★★ 7장. 배열 P009_1.java
P009_2.java
P009_3.kt
10 배열 파티션 I 7장. 배열 P010_1.java
P010_2.java
P010_3.kt
11 자신을 제외한 배열의 곱 ★★ 7장. 배열 P011_1.java
P011_2.kt
12 주식을 사고팔기 가장 좋은 시점 7장. 배열 P012_1.java
P012_2.java
P012_3.kt
13 팰린드롬 연결 리스트 8장. 연결 리스트 P013_1.java
P013_2.java
P013_3.java
P013_4.kt
14 두 정렬 리스트의 병합 8장. 연결 리스트 P014_1.java
P014_2.kt
15 역순 연결 리스트 8장. 연결 리스트 P015_1.java
P015_2.java
P015_3.kt
16 두 수의 덧셈 ★★ 8장. 연결 리스트 P016_1.java
P016_2.java
P016_3.kt
17 페어의 노드 스왑 ★★ 8장. 연결 리스트 P017_1.java
P017_2.java
P017_3.java
P017_4.kt
18 홀짝 연결 리스트 ★★ 8장. 연결 리스트 P018_1.java
P018_2.kt
19 역순 연결 리스트 II ★★ 8장. 연결 리스트 P019_1.java
P019_2.kt
20 유효한 괄호 9장. 스택, 큐 P020_1.java
P020_2.kt
21 중복 문자 제거 ★★★ 9장. 스택, 큐 P021_1.java
P021_2.java
P021_3.kt
22 일일 온도 ★★ 9장. 스택, 큐 P022_1.java
P022_2.kt
23 큐를 이용한 스택 구현 9장. 스택, 큐 P023_1.java
P023_2.kt
24 스택을 이용한 큐 구현 9장. 스택, 큐 P024_1.java
P024_2.kt
25 원형 큐 디자인 ★★ 9장. 스택, 큐 P025_1.java
P025_2.kt
26 원형 데크 디자인 ★★ 10장. 데크, 우선순위 큐 P026_1.java
P026_2.kt
27 k개 정렬 리스트 병합 10장. 데크, 우선순위 큐 P027_1.java
P027_2.kt
28 원점에 가장 가까운 k개의 점 ★★ 10장. 데크, 우선순위 큐 P028_1.java
P028_2.java
P028_3.kt
29 더 맵게 10장. 데크, 우선순위 큐 P029_1.java
30 해시맵 디자인 11장. 해시 테이블 P030_1.java
P030_2.kt
31 보석과 돌 11장. 해시 테이블 P031_1.java
P031_2.java
P031_3.kt
32 중복 문자 없는 가장 긴 부분 문자열 ★★ 11장. 해시 테이블 P032_1.java
P032_2.kt
33 상위 k 빈도 엘리먼트 ★★ 11장. 해시 테이블 P033_1.java
P033_2.java
P033_3.kt
34 완주하지 못한 선수 11장. 해시 테이블 P034_1.java
P034_2.kt
35 섬의 개수 ★★ 12장. 그래프 P035_1.java
P035_2.kt
36 전화번호 문자 조합 ★★ 12장. 그래프 P036_1.java
P036_2.kt
37 순열 ★★ 12장. 그래프 P037_1.java
P037_2.kt
38 조합 ★★ 12장. 그래프 P038_1.java
P038_2.kt
39 조합의 합 ★★ 12장. 그래프 P039_1.java
P039_2.kt
40 부분집합 ★★ 12장. 그래프 P040_1.java
P040_2.kt
41 일정 재구성 ★★ 12장. 그래프 P041_1.java
P041_2.java
P041_3.kt
42 여행 경로 ★★ 12장. 그래프 P042_1.java
P042_2.kt
43 코스 일정 ★★ 12장. 그래프 P043_1.java
P043_2.java
P043_3.kt
44 네트워크 딜레이 타임 ★★ 13장. 최단 경로 문제 P044_1.java
P044_2.kt
45 k 경유지 내 가장 저렴한 항공권 ★★ 13장. 최단 경로 문제 P045_1.java
P045_2.java
P045_3.kt
46 게임 맵 최단 거리 ★★ 13장. 최단 경로 문제 P046_1.java
47 이진 트리의 최대 깊이 14장. 트리 P047_1.java
P047_2.java
P047_3.kt
48 이진 트리의 직경 14장. 트리 P048_1.java
P048_2.kt
49 가장 긴 동일 값의 경로 14장. 트리 P049_1.java
P049_2.kt
50 이진 트리 반전 14장. 트리 P050_1.java
P050_2.java
P050_3.java
P050_4.java
P050_5.java
P050_6.kt
51 두 이진 트리 병합 14장. 트리 P051_1.java
P051_2.kt
52 이진 트리 직렬화 & 역직렬화 ★★★ 14장. 트리 P052_1.java
P052_2.kt
53 균형 이진 트리 14장. 트리 P053_1.java
P053_2.kt
54 최소 높이 트리 ★★ 14장. 트리 P054_1.java
P054_2.kt
55 정렬된 배열의 이진 탐색 트리 변환 14장. 트리 P055_1.java
P055_2.kt
56 이진 탐색 트리(BST)를 더 큰 수 합계 트리로 ★★ 14장. 트리 P056_1.java
P056_2.kt
57 이진 탐색 트리(BST) 합의 범위 14장. 트리 P057_1.java
P057_2.java
P057_3.java
P057_4.java
P057_5.kt
58 이진 탐색 트리(BST) 노드 간 최솟값 14장. 트리 P058_1.java
P058_2.java
P058_3.kt
59 전위, 중위 순회 결과로 이진 트리 구축 ★★ 14장. 트리 P059_1.java
P059_2.java
P059_3.kt
60 배열의 k번째 큰 엘리먼트 ★★ 15장. 힙 P060_1.java
P060_2.java
P060_3.kt
61 이중 우선순위 큐 ★★★ 15장. 힙 P061_1.java
P061_2.java (예정)
P061_3.kt
62 트라이 구현 ★★ 16장. 트라이 P062_1.java
P062_2.kt
63 팰린드롬 페어 ★★★ 16장. 트라이 P063_1.java
P063_2.java
P063_3.kt
64 리스트 정렬 ★★ 17장. 정렬 P064_1.java
P064_2.java
P064_3.kt
65 구간 병합 ★★ 17장. 정렬 P065_1.java
P065_2.kt
66 삽입 정렬 리스트 ★★ 17장. 정렬 P066_1.java
P066_2.java
P066_3.kt
67 가장 큰 수 ★★ 17장. 정렬 P067_1.java
P067_2.kt
68 유효한 애너그램 17장. 정렬 P068_1.java
P068_2.kt
P068_3.kt
69 색 정렬 ★★ 17장. 정렬 P069_1.java
P069_2.kt
70 이진 검색 18장. 이진 검색 P070_1.java
P070_2.java
P070_3.java
P070_4.java
P070_5.kt
71 회전 정렬된 배열 검색 ★★ 18장. 이진 검색 P071_1.java
P071_2.kt
72 두 배열의 교집합 18장. 이진 검색 P072_1.java
P072_2.java
P072_3.java
P072_4.kt
73 두 수의 합 II 18장. 이진 검색 P073_1.java
P073_2.java
P073_3.java
P073_4.kt
74 2D 행렬 검색 II ★★ 18장. 이진 검색 P074_1.java
P074_2.kt
75 입국심사 ★★★ 18장. 이진 검색 P075_1.java
P075_2.kt
76 싱글 넘버 19장. 비트 조작 P076_1.java
P076_2.kt
77 해밍 거리 19장. 비트 조작 P077_1.java
P077_2.kt
78 두 정수의 합 ★★★ 19장. 비트 조작 P078_1.java
P078_2.java
P078_3.kt
79 UTF-8 검증 ★★ 19장. 비트 조작 P079_1.java
P079_2.kt
80 1비트의 개수 19장. 비트 조작 P080_1.java
P080_2.java
P080_3.kt
81 최대 슬라이딩 윈도우 ★★★ 20장. 슬라이딩 윈도우 P081_1.java
P081_2.java
P081_3.java
P081_4.kt
82 부분 문자열이 포함된 최소 윈도우 ★★★ 20장. 슬라이딩 윈도우 P082_1.java
P082_2.java
P082_3.kt
83 가장 긴 반복 문자 대체 ★★ 20장. 슬라이딩 윈도우 P083_1.java
P083_2.kt
84 주식을 사고팔기 가장 좋은 시점 II 21장. 그리디 알고리즘 P084_1.java
P084_2.kt
85 키에 따른 대기열 재구성 ★★ 21장. 그리디 알고리즘 P085_1.java
P085_2.kt
86 태스크 스케줄러 ★★ 21장. 그리디 알고리즘 P086_1.java
P086_2.kt
87 주유소 ★★ 21장. 그리디 알고리즘 P087_1.java
P087_2.java
P087_3.kt
88 쿠키 부여 21장. 그리디 알고리즘 P088_1.java
P088_2.kt
89 과반수 엘리먼트 22장. 분할 정복 P089_1.java
P089_2.java
P089_3.java
P089_4.kt
90 괄호를 삽입하는 여러가지 방법 ★★ 22장. 분할 정복 P090_1.java
P090_2.java
P090_3.kt
91 피보나치 수 23장. 다이나믹 프로그래밍 P091_1.java
P091_2.java
P091_3.java
P091_4.java
P091_5.kt
92 최대 서브 배열 23장. 다이나믹 프로그래밍 P092_1.java
P092_2.java
P092_3.java
P092_4.kt
93 계단 오르기 23장. 다이나믹 프로그래밍 P093_1.java
P093_2.java
P093_3.kt
94 집 도둑 23장. 다이나믹 프로그래밍 P094_1.java
P094_2.java
P094_3.kt
95 도둑질 ★★★ 23장. 다이나믹 프로그래밍 P095_1.java
96(문제 1) 신고 결과 받기 부록. 2022년 카카오 공채 만점 가이드 P096_1.java
P096_2.kt
97(문제 2) k진수에서 소수 개수 구하기 ★★ 부록. 2022년 카카오 공채 만점 가이드 P097_1.java
P097_2.java
P097_3.java
P097_4.java
P097_5.kt
98(문제 3) 주차 요금 계산 ★★ 부록. 2022년 카카오 공채 만점 가이드 P098_1.java
P098_2.kt
99(문제 4) 양궁대회 ★★ 부록. 2022년 카카오 공채 만점 가이드 P099_1.java
P099_2.kt
100(문제 5) 양과 늑대 ★★★ 부록. 2022년 카카오 공채 만점 가이드 P100_1.java
P100_2.kt
101(문제 6) 파괴되지 않은 건물 ★★★ 부록. 2022년 카카오 공채 만점 가이드 P101_2.java
P101_3.kt
102(문제 7) 사라지는 발판 ★★★ 부록. 2022년 카카오 공채 만점 가이드 P102_1.java
P102_2.kt

기타 코드

About

<자바 알고리즘 인터뷰 with 코틀린> 102가지 알고리즘 문제 풀이로 완성하는 코딩 테스트

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages