케이스 워크 (Case Work) 는 문제를 여러 조건/경우로 분류하여 각각 해결하는 패턴.
if-else, switch-case, 의사결정 트리 등으로 구현. 복잡한 조건을 상호 배타적 케이스로 쪼개 가독성과 정확성 확보.
PS 에서는 “조건 A, B, C 중 어느 쪽?” 판별이 핵심. 누락 케이스 = WA, 중복 케이스 = 불필요 분기.
문제 상황과 동기
복잡한 조건이 얽힌 문제 (예: “N이 짝수면 A, 홀수면 B, 단 N=1은 예외”).
naive: 단일 if-else 로 모든 조건 한 번에 처리 → 가독성 폭망, 디버깅 지옥.
case work: 조건 분류 명시 → 각 케이스 독립 해결 → 테스트·검증 쉬움.
핵심 통찰: 상호 배타적 조건 (mutually exclusive) + 완전 (exhaustive).
자주 등장하는 PS 위치:
기하 (점/선/면 위치 관계: 교차/접촉/포함/외부)
그래프 (노드 차수: 0, 1, 2, ≥3)
정수론 (소수/합성수/1, 짝수/홀수, mod k 나머지)
시뮬레이션 (4방향 이동, 상태 전이)
시각화
핵심 아이디어
invariant: 모든 입력은 정확히 하나의 케이스에 속함 (no overlap, no gap).
체계화 방법:
조건 열거: 가능한 모든 경우 나열.
우선순위 정렬: 예외 케이스를 먼저 (예: N=0, N=1).
상호 배타성 검증: if A else if B else C (순서 중요).
완전성 검증: 모든 입력이 하나의 케이스에 들어가는가.
테스트: 각 케이스마다 입력 1개씩 확인.
알고리즘
case_work(input): if exceptional_case_1(input): return handle_case_1(input) else if exceptional_case_2(input): return handle_case_2(input) else if common_case_A(input): return handle_A(input) else if common_case_B(input): return handle_B(input) else: return default_case(input)
구현
예제 1: 삼각형 판별 (3개 변 길이)
a, b, c 로 삼각형 가능 여부 + 종류 (정삼각형, 이등변, 직각, 일반).
조건 분류:
삼각형 불가능: a + b ≤ c 또는 순열.
정삼각형: a == b == c.
이등변: a == b 또는 b == c 또는 c == a.
직각: a² + b² == c² 또는 순열.
일반 삼각형.
// 삼각형 케이스 분류, O(1)#include <bits/stdc++.h>using namespace std;int main() { int a, b, c; cin >> a >> b >> c; // 삼각형 성립 조건 if (a + b <= c || b + c <= a || c + a <= b) { cout << "not a triangle\n"; return 0; } // 정삼각형 if (a == b && b == c) { cout << "equilateral\n"; } // 이등변 else if (a == b || b == c || c == a) { cout << "isosceles\n"; } // 직각 else if (a*a + b*b == c*c || b*b + c*c == a*a || c*c + a*a == b*b) { cout << "right\n"; } // 일반 else { cout << "scalene\n"; }}
# 삼각형 케이스 분류, O(1)a, b, c = map(int, input().split())if a + b ≤ c or b + c ≤ a or c + a ≤ b: print("not a triangle")elif a == b == c: print("equilateral")elif a == b or b == c or c == a: print("isosceles")elif a**2 + b**2 == c**2 or b**2 + c**2 == a**2 or c**2 + a**2 == b**2: print("right")else: print("scalene")
// 사분면 케이스, O(1)#include <bits/stdc++.h>using namespace std;int main() { int x, y; cin >> x >> y; if (x == 0 || y == 0) { cout << "on axis\n"; } else if (x > 0 && y > 0) { cout << "Q1\n"; } else if (x < 0 && y > 0) { cout << "Q2\n"; } else if (x < 0 && y < 0) { cout << "Q3\n"; } else { cout << "Q4\n"; }}
# 사분면 케이스, O(1)x, y = map(int, input().split())if x == 0 or y == 0: print("on axis")elif x > 0 and y > 0: print("Q1")elif x < 0 and y > 0: print("Q2")elif x < 0 and y < 0: print("Q3")else: print("Q4")
stdin
1 1
결과
Q1
stdin
-1 1
결과
Q2
stdin
0 5
결과
on axis
복잡도
항목
값
시간
O(1) ~ O(K) (K=케이스 수, 보통 상수)
공간
O(1)
구현 난이도
낮음 (조건 열거만 정확하면 됨)
변형
기법
설명
의사결정 트리
조건 순서를 트리로 시각화
lookup 테이블
if-else 대신 배열/map 로 케이스 매핑
비트마스크
여러 boolean 조건을 정수 하나로 압축 (2^K 케이스)
다항식 판별
케이스마다 고유 공식 (예: 사분면 = sign(x) * 2 + sign(y))
함정
1. 케이스 누락 (gap)
“홀수/짝수” 만 처리하고 0 을 잊음. 완전성 체크리스트 작성.
2. 케이스 중복 (overlap)
if x > 0 와 if x >= 0 동시 적용 → 하나의 입력이 두 케이스에 들어감. 상호 배타성 검증.
3. 조건 순서 실수
윤년 예제: y % 4 == 0 를 먼저 체크하면 400, 100 예외 처리 안 됨. 예외 케이스를 먼저.
💬 댓글