문제 풀이 설계법: 입력·제약·예외·복잡도 점검
23강. 문제 풀이 설계법: 입력·제약·예외·복잡도 점검
1. 이번 강의에서 해결할 문제
예제를 보고 바로 코딩하면 데이터가 비었거나 중복되고 입력이 커졌을 때 실패하는 해법을 만들기 쉽습니다.
2. 학습 목표
3. 핵심 개념
풀이 전에 ① 입력의 의미와 최대 크기, ② 출력과 동점 규칙, ③ 반복되는 연산, ④ 빈 값·중복·최솟값·최댓값, ⑤ 허용 시간·메모리를 적습니다. 그 뒤 단순한 기준 풀이를 세우고 필요한 부분만 개선합니다. 복잡도는 자료구조 구축, 질의, 출력 정렬을 모두 더해 계산합니다. 성능 측정값은 환경·JVM 워밍업·입력 분포에 따라 달라지므로 복잡도 분석을 대체하지 않습니다.
4. 단계별 실습
1. 예제 파일 작성
실행 환경: 코드 편집기
실행 위치: C:\dev\game-ranking-algorithms
실행 전 확인: 같은 이름의 파일이 있다면 덮어쓰기 전에 Git diff로 변경 범위를 확인합니다. 선택한 LTS JDK의 java -version과 javac -version이 모두 실행되어야 합니다.
대상 파일: src/RankingProblemDesign.java
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RankingProblemDesign {
record GameRecord(String playerId, int score) {}
static List<GameRecord> bestPerPlayer(List<GameRecord> records) {
Map<String, GameRecord> best = new HashMap<>();
for (GameRecord record : records) {
if (record.playerId() == null || record.playerId().isBlank() || record.score() < 0) continue;
best.merge(record.playerId(), record,
(a, b) -> a.score() >= b.score() ? a : b);
}
List<GameRecord> ranking = new ArrayList<>(best.values());
ranking.sort(Comparator.comparingInt(GameRecord::score).reversed()
.thenComparing(GameRecord::playerId));
return ranking;
}
public static void main(String[] args) {
List<GameRecord> input = List.of(new GameRecord("P1", 900),
new GameRecord("P2", 1200), new GameRecord("P1", 1400),
new GameRecord("", 9999));
System.out.println(bestPerPlayer(input));
System.out.println(bestPerPlayer(List.of()));
}
}
2. PowerShell에서 컴파일·실행
실행 환경: Windows PowerShell
실행 위치: C:\dev\game-ranking-algorithms
실행 전 확인: src/RankingProblemDesign.java가 저장되었고 out 폴더에는 삭제해도 되는 컴파일 결과만 있는지 확인합니다.
대상: src/RankingProblemDesign.java와 out 아래 생성되는 class 파일
Set-Location C:\dev\game-ranking-algorithms
New-Item -ItemType Directory -Force .\out | Out-Null
javac -Xlint:all -d .\out .\src\RankingProblemDesign.java
java -cp .\out RankingProblemDesign
예상 결과: 유효한 플레이어별 최고 기록이 점수순으로 출력되고 빈 입력은 빈 목록을 반환합니다.
실행 시간은 PC의 CPU·메모리, JDK 버전, JVM 워밍업, 백그라운드 작업과 입력 분포에 따라 달라질 수 있습니다. 측정값은 같은 조건에서 여러 번 비교하고 Big-O 분석과 함께 해석합니다.
5. 코드와 알고리즘이 동작하는 이유
n개 기록을 Map으로 집계하는 평균 시간은 O(n), 서로 다른 플레이어 p명을 정렬하는 시간은 O(p log p), 공간은 O(p)입니다. ID가 빈 기록과 음수 점수 정책을 코드에서 명시합니다. 요구가 상위 K뿐이면 전체 정렬 대신 힙을 선택할 수 있습니다.
6. 자주 하는 실수와 해결법
7. 직접 실습
8. 이해 점검 질문 3개
9. 핵심 요약
문제 풀이 설계법: 입력·제약·예외·복잡도 점검 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.