< 프로그래머스 C++ > 2016년
2026. 5. 1. 09:50ㆍProgrammers
문제 설명

문제 해석
핵심 포인트는 두 가지이다
1. 1월 1일부터 며칠째인지 계산
2. 그 일수를 7로 나눈 나머지로 요일 인덱스 계산
요일은 7일마다 반복되니까 나머지 연산을 활용하면 된다
문제 풀이
#include <string>
#include <vector>
using namespace std;
string solution(int a, int b) {
int days[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string day[7] = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
int total = 0;
for(int i = 0; i < a-1; ++i)
total += days[i];
total += b;
return day[(total - 1) % 7];
}
핵심 포인트
1. 월별 일수 배열 만들기
2016년은 윤년이라 2월이 29일이라는 점만 신경 쓰면 된다
int days[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
배열 인덱스가 0부터 시작하니까 1월이 days[0] 이라는 점만 헷갈리지 않으면 된다
2. 며칠째인지 계산하기
월 수만큼 지나온 달들의 일수를 다 더한 뒤, b일을 더하면 된다
for(int i = 0; i < a-1; ++i)
total += days[i];
total += b;
a-1까지 돌리는 이유는, 5월이라면 1월~4월까지의 일수만 더하면 되기 때문이다
5월은 days 배열에서 더하지 않고, 마지막에 b로 24를 더한다
3. 요일 배열 순서가 중요
1월 1일이 금요일이기 때문에 편하게 나머지 연산을 하기 위해 인덱스 0을 금요일로 맞춘다
string day[7] = {"FRI", "SAT", "SUN", "MON", "TUE", "WED", "THU"};
// 인덱스: 0 1 2 3 4 5 6
이렇게 짜면 1일째 >> FRI, 2일째 >> SAT 같은 식으로 자연스럽게 연결된다
4. 인덱스 계산에서 -1을 하는 이유
1월 1일이 1일째인데 배열 인덱스는 0부터 시작하니까 맞춰줘야 한다
return day[(total - 1) % 7];
일째 계산 인덱스 요일
| 1일째 (1/1) | (1-1) % 7 = 0 | 0 | FRI |
| 8일째 (1/8) | (8-1) % 7 = 0 | 0 | FRI |
| 145일째 (5/24) | (145-1) % 7 = 4 | 4 | TUE |
동작 흐름 따라가보기
a=5, b=24 (5월 24일)을 직접 따라가보자
1. total 계산
i days[i] total
| 0 (1월) | 31 | 31 |
| 1 (2월) | 29 | 60 |
| 2 (3월) | 31 | 91 |
| 3 (4월) | 30 | 121 |
| + b | +24 | 145 |
5월 24일은 1월 1일부터 145일째
2. 인덱스 계산
(145 - 1) % 7 = 144 % 7 = 4
3. 요일 반환
day[4] = "TUE" ✅
정리
요일 문제는 결국 나머지 연산으로 풀린다
- 시작 요일을 0번 인덱스에 두는 것이 포인트
- 1일째가 인덱스 0이 되도록 -1 보정
- 나머지 연산으로 인덱스에 맞춰 요일이 나오도록 리턴
'Programmers' 카테고리의 다른 글
| < 프로그래머스 C++ > 과일 장수 (0) | 2026.05.06 |
|---|---|
| < 프로그래머스 C++ > 카드 뭉치 (0) | 2026.05.04 |
| < 프로그래머스 C++ > 명예의 전당(1) (0) | 2026.04.30 |
| < 프로그래머스 C++ > 콜라 문제 (0) | 2026.04.29 |
| < 프로그래머스 C++ > 푸드 파이트 대회 (0) | 2026.04.28 |