Unreal 개발 본 캠프 45일차

HappyCircle·2026년 1월 30일

Unreal 개발

목록 보기
62/163

📘 TIL – 코딩테스트 날짜 문제 & 문자열 파싱 정석 정리

🎯 오늘의 주제

코딩테스트에서 날짜 문제를 어떻게 판단하고 접근할 것인가

substr / find / stringstream 선택 기준

substr에서 가장 많이 헷갈리는 포인트 정리

1️⃣ 날짜 문제의 본질: 달력이 아니라 숫자다

날짜 문제를 처음 보면 달력부터 떠올리기 쉽다.
하지만 코딩테스트에서 날짜 문제는 대부분 수학 문제에 가깝다.

특히 이런 문장이 보이면 바로 방향을 바꿔야 한다.

“모든 달은 28일까지 있다고 가정한다”

“윤년은 고려하지 않는다”

“1년은 동일한 일수로 계산한다”

👉 실제 달력 구현 금지 신호

핵심 사고 전환

날짜를 그대로 다루지 말고
하나의 숫자(일 단위)로 환원하자

2️⃣ 날짜 문제 접근 판단 기준 (체크리스트)
✅ 1. 비정상적인 달력 규칙이 있는가?

YES → 날짜를 숫자로 변환

NO → 그래도 대부분 숫자가 안전

✅ 2. 날짜 비교 / 만료 여부 판단인가?

문자열 비교 ❌

연/월/일 나누기 ❌

정수 비교 ⭕

✅ 3. “n개월 후”, “유효기간 n달” 같은 표현이 있는가?

월 단위 연산은 100% 꼬이기 쉬움

개월 × 고정 일수로 환산

✅ 4. substr / erase / replace가 늘어나고 있는가?

YES → 설계가 잘못된 신호

3️⃣ 날짜 문제 정석 패턴

모든 날짜를 일(day) 단위 정수로 통일한다.

// 모든 달이 28일일 때
// 1년 = 12 × 28 = 336일

days = year 336 + month 28 + day;

이렇게 하면

날짜 비교

유효기간 계산

파기 여부 판단
모두 int 비교 한 번으로 끝난다.

4️⃣ substr의 정확한 개념 (중요)
string substr(size_t start, size_t length);

❌ 끝 인덱스가 아님
✅ 시작 인덱스부터의 길이

예시
string s = "2022.05.19";

s.substr(0, 4); // "2022"
s.substr(5, 2); // "05"
s.substr(8, 2); // "19"

🚨 가장 흔한 착각

s.substr(5, 7); // ❌ 5~7 인덱스 아님

→ 실제로는 index 5부터 7글자

5️⃣ 문자열 파싱 도구 선택 기준
🔹 substr

언제 쓰나

포맷이 완전히 고정

인덱스가 항상 동일

장점

빠르고 코드가 짧음

단점

포맷 조금만 바뀌어도 깨짐

year = stoi(s.substr(0,4));
month = stoi(s.substr(5,2));
day = stoi(s.substr(8,2));

🔹 find + substr

언제 쓰나

구분자는 명확하지만 길이가 가변

1자리/2자리 숫자 혼합

size_t pos = s.find(' ');
char type = s[0];
int value = stoi(s.substr(pos + 1));

주의

find가 2번 이상 나오면 실수 확률 급증

🔹 stringstream

언제 쓰나

공백 기반 토큰 분리

순서대로 읽으면 끝나는 입력

stringstream ss(s);
int a, b;
ss >> a >> b;

장점

직관적, 실수 적음
단점

속도는 가장 느림 (코테에선 거의 무관)

6️⃣ 코테용 결정 트리 (암기용)
포맷 고정인가? → substr
구분자 위치 가변인가? → find
공백 토큰 분리인가? → stringstream

그리고 날짜가 보이면 항상 한 번 더 생각:

“이거 숫자로 바꿀 수 있지 않나?”

7️⃣ 오늘 문제(개인정보 파기)에서의 교훈

날짜를 문자열로 조작하려다 로직이 복잡해짐

실제 정답 루트는:

날짜 → day 정수
유효기간 → 개월 × 28
비교 → int 비교

👉 문제에서 준 ‘모든 달은 28일’ 문장이 힌트였다

profile
개발합시다!

0개의 댓글