개발일지/코드트리

[코드트리] 시뮬레이션 약점 극복 학습 후기

zerossin 2026. 6. 15. 23:57

개요

최근 이것저것 일정이 겹치면서 정신없이 시간을 보냈다.

원래는 청약챌린지 첫 주가 끝나자마자 바로 다음 학습을 진행하려고 했는데, 생각보다 바쁜 일이 많아서 결국 조금 늦게 레슨을 시작하게 되었다.

그래도 첫 주 갭체크에서 현실을 확인한 이상 더 미루면 안 될 것 같았다.

 

 

 

3년 만에 돌아온, 코드트리 청약 통장 챌린지 | 코드트리

매주 학습 납입하고 7주 만기 채우면 코드트리 8월까지 무료. 매주 추첨권을 모아 맥북·에어팟·애플워치 응모까지. 신청 인원에 따라 조기마감될 수 있어요.

www.codetree.ai

 

이렇게 챕터를 알려준다.


그래서 이번 주에는 코드트리가 추천해 준 약점 유형 중 하나인 시뮬레이션에서 날짜와 시간 계산(Date & Time)레슨을 진행했다.


학습 구조

이번 레슨을 진행하면서 가장 먼저 느낀 점은 코드트리 커리큘럼의 구조였다.

 



문제만 던져주는 게 아니라 먼저 개념을 설명해 준 뒤

 

- 기본 문제(워밍업)
- 연습 문제(챌린지)
- 테스트 문제

순으로 난이도를 조금씩 높여간다.

또 특이한 점은, 문제를 풀기 전에 잠깐 개념을 먼저 설명해 준다는 것이었다.

이런 식이다.


이번 챕터에서는 시간 계산을 단순 시뮬레이션으로 하지 않고 특정 시점을 분 단위 숫자로 변환해서 차이를 계산하는 방식을 먼저 설명해 줬다.

02:05에서 04:01까지의 시간을 계산할 때, 125분과 241분으로 변환한 뒤 차이만 구하면 된다는 식이다.

사실 굉장히 당연한 이야기처럼 보였는데 막상 코딩테스트를 풀다 보면 문제에서 시키는 대로 구현부터 들어가는 경우가 많다. 그렇기에 "먼저 계산으로 단순화할 수 있는지 생각해 보라"는 메시지를 주는 느낌이다.


첫 번째 문제

이어서 문제풀이를 시작했다.

 

첫번째 문제는 2011년 11월 11일 A시 B분에서 시작하여 C시 D분까지 몇 분이 걸리는지 계산하는 문제였다.

a, b, c, d = map(int, input().split())

first = a*60+b
second = c*60+d

print(second - first)


개념 설명에서 배운 내용을 그대로 적용하면 되는 문제였다.
시와 분을 모두 분 단위로 변환한 뒤 차이를 계산하면 끝.

워밍업 문제답게 어렵지 않게 통과할 수 있었다.


두 번째 문제

다음은 2011년 m1월 d1일부터 m2월 d2일까지 며칠이 있는지 계산하는 문제였다.
추가로 시작일도 포함해서 계산해야 한다는 조건이 있었다.

m1, d1, m2, d2 = map(int, input().split())

num_of_days = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

m = 0

for i in range(m1, m2):
    m += num_of_days[i]

print(m+(d2 - d1)+1)


처음에는 날짜 계산이라고 해서 괜히 복잡하게 생각했는데 결국은 월 사이에 있는 날짜 수를 전부 더한 뒤 일(day)의 차이를 더해주면 되는 문제였다. 여기서 range를 이용해 월 사이의 날짜 수를 합산하는 방식으로 풀었다.

하지만 정답은 맞았지만 제출 후에는 "이게 가장 깔끔한 방법일까?"라는 생각도 조금 들었다. 내 답안을 평가해주는 기능이 있었으면 어땠을까 했다.

그래도 적어도 이전처럼 무작정 구현부터 들어가는 게 아니라 날짜를 숫자로 바라보려고 노력했다는 점은 긍정적이었다.


세번째 문제

첫번째 챌린지 문제이다.

 

2011년 11월 11일 11시 11분부터 특정 날짜와 시간까지 몇 분이 지났는지를 계산하는 문제였다.

a, b, c = map(int, input().split())

start = 11*24*60 + 11*60 + 11
end = a*24*60 + b*60 + c

result = end-start

if result < 0:
    result = -1

print(result)


이번에도 핵심은 같았다.
날짜와 시간을 전부 분으로 변환한 뒤 차이를 계산한다.

다만 처음에는 -1 처리 조건을 놓치고 계속 제출했다.

그러다 제출 결과 창에서 제공되는 테스트 케이스를 보다가 뒤늦게 발견했다.
문제를 대충 읽는 습관이 아직 남아 있다는 걸 다시 한 번 깨달은 순간이었다.

한편, 쓰면서 느낀 것인데, 제출 결과 창의 테스트 케이스를 바로 내 코드 창으로 가져올 수 있는 기능은 꽤 편리했다.


네번째 문제

두번째 챌린지 문제로, 난이도는 Hard로 적혀있었다.

 

특정 날짜가 월요일일 때, 다른 날짜는 무슨 요일인지 계산하는 문제였다.

m1, d1, m2, d2 = map(int, input().split())

yoil = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

months_day = [0, 31, 28, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31]

m = 0
chai = 0
yoilindex = 0

if m1*30+d1 < m2*30+d2:
    for i in range(m1, m2):
        m += months_day[i]

    chai = m + (d2-d1)
    yoilindex = chai % 7
else:
    for i in range(m2, m1):
        m += months_day[i]
    
    chai = m + (d1-d2)
    yoilindex = -(chai % 7)

print(yoil[yoilindex])


이번 레슨에서 가장 오래 고민했던 문제다.
하지만 요일은 결국 7일마다 반복된다는 점에 주목했다.

그래서 두 날짜 사이가 며칠 차이인지 계산한 뒤,

'요일 인덱스 = 날짜 차이 % 7'

이라는 아이디어를 이용해 해결했다.

지금 다시 보면 코드가 깔끔한 편은 아니다.
앞 날짜와 뒷 날짜를 따로 처리하다 보니 분기문도 많고 중복 코드도 생겼다.

하지만 적어도 "요일은 7일 주기"라는 규칙을 먼저 발견하고 접근했다는 점에서 이전보다 사고 과정이 조금 발전한 것 같았다.


다섯 번째 문제

이번 레슨의 마지막 문제로, 테스트 문제다. 앞선 문제부터 지금까지까지 학습한 것들과 경험을 바탕으로 도전해 보는 문제인듯했다. 이렇게 보니 학습 구조가 잘 짜여졌다는 생각이 들었다.

 

문제는 특정 기간 동안 원하는 요일이 몇 번 등장하는지 구하는 것이였다.

m1, d1, m2, d2 = map(int, input().split())
A = input()

yoil = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']

months_day = [0, 31, 29, 31, 30, 31, 30 ,31, 31, 30, 31, 30, 31]

m = 0

for i in range(m1, m2):
    m += months_day[i]

chai = m + (d2-d1)
yoilsu = chai // 7
yoilsu_chuga = chai % 7
if yoilsu_chuga >= yoil.index(A):
    yoilsu += 1

print(yoilsu)


처음 문제를 봤을 때는 꽤 복잡해 보였다.
하지만 앞 문제에서 사용했던 요일의 주기성을 그대로 응용할 수 있었다.

요일은 7일마다 반복되기 때문에 먼저 몇 주가 지났는지를 계산하고, 남은 날짜에서 추가로 등장하는 횟수를 계산하는 방식으로 접근했다.

앞 문제들을 풀며 익힌 개념이 자연스럽게 이어지는 느낌이 들었다.

그래서 테스트 문제임에도 생각보다 수월하게 통과할 수 있었다.


느낀 점

이번 레슨은 솔직히 말해서 DP나 최단 경로처럼 어려운 알고리즘을 배우는 시간은 아니었다.
하지만 코딩테스트에서 자주 필요한 사고방식을 연습할 수 있었다.

특히 코드트리의 기본 문제 → 연습 문제 → 테스트 문제 구조가 꽤 마음에 들었다.

그저 문제를 많이 푸는 것이 아닌,
먼저 개념을 이해하고 그 개념을 여러 문제에 적용하면서,
마지막에는 응용 문제까지 연결해 보는 흐름이 자연스러웠다.

지난 갭체크 때의 나는 문제를 보자마자 구현부터 시작하는 경우가 많았다.

이번 레슨을 하면서는 "이걸 숫자로 바꾸면 더 쉬워지지 않을까?", "반복되는 규칙은 없을까?" 같은 생각을 조금씩 하게 되었다.

아직 갈 길은 멀지만, 적어도 이전보다는 문제를 바라보는 방식이 조금은 달라진 것 같다.

다음 주에도 코드트리가 추천해 준 약점 유형을 따라가면서 바닥난 코딩테스트 체력을 조금씩 끌어올려 볼 생각이다.