프로그래머스 - [2025 코드챌린지] 유연근무제 C++
오늘은 새로운 2025 프로그래머스 코드챌린지 문제를 가지고 왔다. 포스팅은 Level1 -> Level5까지 내가 풀 수 있는 문제에 한해서 글을 쓸 예정이다. 오랜만에 문제를 풀게 되어 부족할 수 있지만, 최대한 열심히 풀어보겠다.
알고리즘 난이도 및 시간 ( ※ 개인적인 의견 )
- 난이도 : Level 0 ( ※ Min : 2, Max : 10 )
- 풀이 시간 : 30분
- 제출 횟수 : 2번
- 풀이 결과 : Pass
문제 설명
아래에 중요한 부분들은 빨간색 밑줄로 표시해 놨다. 해당 문제가 Level1이라는 걸 알 수 있는 내용은 제한사항을 보면 알 수 있다. 출근 희망시간이 700 이상 1100 이하다. 만약 정말 MG 스러운 회사여서 출근 희망시간이 23:00 ~ 00:10분 사이도 할 수 있었다면 이 문제는 Level1에서 바로 Level2~Level3 문제가 되었을 것 같다. 왜냐하면 고려해야 할 예외사항이 많기 때문이다. 하지만 해당 문제는 Simple하다. 우리가 고려해야 할 예외사항은 없다. 다만 고려해야 한다면 XX:50 ~ XX:00 사이를 희망 출근시간으로 정하는 경우다.
문제풀이
- GetMaxTime
- 해당 함수는 출근 희망 시각 + 10분의 마지노선을 구하는 함수다.
- 딱히 큰 로직은 없고 이해해야 할 코드 구문은 아래와 같다.
- 50 <= (iMaxValue % 100 ) -> 만약 100으로 나눈 나머지가 50보다 크다는 것은 우리가 10분을 더 했을 때 시간을 넘어가는 것을 의미한다. 이에 따라 해당 조건을 기입하였다. 이와 같은 경우는 10을 더하는 것이 아니라 50을 10분을 넘어간 시간이 계산되기 때문이다.
- 예시 : 7:50분까지 출근인 경우 허락되는 시간은 8:00이기 때문에 750 + 50 = 800으로 계산하는 것이다.
- 그 이외에는 그냥 10을 더하면 되기 때문에 큰 문제가 없다.
- 50 <= (iMaxValue % 100 ) -> 만약 100으로 나눈 나머지가 50보다 크다는 것은 우리가 10분을 더 했을 때 시간을 넘어가는 것을 의미한다. 이에 따라 해당 조건을 기입하였다. 이와 같은 경우는 10을 더하는 것이 아니라 50을 10분을 넘어간 시간이 계산되기 때문이다.
int GetMaxTime(const int& rSchedule)
{
int iMaxValue = rSchedule;
if (50 <= (iMaxValue % 100))
{
iMaxValue += 50;
}
else
{
iMaxValue += 10;
}
return iMaxValue;
}
- IsPossbleGetGift
- 해당 함수는 전달받은 직원의 스케줄로 선물을 받을 수 있는지 구하는 함수다.
- 변수 설명은 아래와 같다.
- iTempStartDay = 7일 치 계산을 해야 하기 위해 전달받은 rStartDay를 할당 후 숫자를 증감시키기 위한 변수
- iTempTimeLog = n번째 요일에 출근한 시간을 담기 위한 변수
- iMaxTime = GetMaxTime 호출을 통해 오차 범위 내 출근 가능한 가장 큰 시간
- 구문 설명
- iTempStartDay < MAX_DAY_COUNT -1 : 6과 7은 주말이기 때문에 이벤트성으로 출근 시간 확인이 필요 없음에 따라 확인이 불필요하기 때문에 만든 구문
- 1110 < iTempTimeLog : 이론적으로 11:10분을 넘는 경우는 출근 시간을 지킬 수 없음으로 빠르게 실패 처리
- iMaxTime < iTempTimeLog : 10분 오차 범위 내에 들어왔는지 확인하는 구문
- iTempStartDay > MAX_DAY_COUNT : 일요일(7) 보다 큰 경우에는 다시 월요일(1)로 돌아가야 하기 때문에 예외처리 구문
bool IsPossbleGetGift(const int& rSchedule, const vector<int>& rTimeLogs, const int& rStartDay)
{
bool bIsPossbie = true;
int iTempStartDay = rStartDay;
int iTempTimeLog = 0;
int iMaxTime = GetMaxTime(rSchedule);
for (int iDay = 0; iDay < MAX_DAY_COUNT; ++iDay)
{
if (iTempStartDay < MAX_DAY_COUNT - 1) // 5보다 작은 경우에만 진행
{
iTempTimeLog = rTimeLogs[iDay];
if (1110 < iTempTimeLog)
{
bIsPossbie = false;
break;
}
else
{
if (iMaxTime < iTempTimeLog)
{
bIsPossbie = false;
break;
}
}
}
iTempStartDay++;
if (iTempStartDay > MAX_DAY_COUNT) // 일요일 보다 큰 경우에는 다시 월요일로 변경
{
iTempStartDay = 1;
}
}
return bIsPossbie;
}
- solution
- 정답을 반환하는 함수로 직원수에 맞게 해당 직원이 선물을 받을 수 있는지 확인하는 함수
int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
int answer = 0;
int iStaffNum = static_cast<int>(schedules.size());
for (int iSNo = 0; iSNo < iStaffNum; ++iSNo)
{
if (true == IsPossbieGetGift(schedules[iSNo], timelogs[iSNo], startday))
{
answer++;
}
}
return answer;
}
결과
내가 1번을 틀리게 된 이유는 바보 같이 GetMaxTime 함수에서 50 <= 이 아니라 50 <으로 하여 50인 경우에 제대로 Check가 되지 않아 5개의 예시에서 틀렸다.. 다음부터는 조금 더 꼼꼼히 확인하는 것이 좋을 것 같다. 다음에는 비밀 코드 해독 문제 풀이를 가지고 오도록 하겠다. 그럼 20000
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/388351?language=cpp#
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr