알고리즘/프로그래머스

프로그래머스 - [2025 코드챌린지] 유연근무제 C++

초심을 찾자 2025. 6. 24. 16:23
SMALL

 오늘은 새로운 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을 더하면 되기 때문에 큰 문제가 없다.
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