99클럽 코테 스터디 17일차 TIL + 프로그래머스 유연근무제 문제 풀이
오늘의 문제
https://school.programmers.co.kr/learn/courses/30/lessons/388351
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 풀이
간단한 문제 요약은 아래와 같다.
일주일 간 설정한 출근 희망 시각에 늦지 않은 직원에게 상품 이벤트
직원들 출근 희망 시각 + 10분까지 출근해야 함
토, 일요일은 이벤트에 영향 X
매일 한번 어플로 출근
시간은 10:13 -> 1013 이렇게 표현
설정한 출근 희망 시각과 실체 출근 기록 주어짐
이것으로 상품 받을 직원 몇명인지 구하기
n = 직원 명 수
schedules = 출근 희망 시각 1차원 배열
timelogs = 일주일 간 출근한 시각 2차원 배열
startday = 이벤트 시작한 요일
중요한 것은 아래와 같다.
- 토, 일요일은 제외하기
- 인정되는 시간 = +10분 하는 시간 구하기
- 인정되는 시간 안에 들어왔는지 판별하기
이제 어떻게 풀었는지 보자.
먼저 토요일, 일요일의 index를 구했다.
보면 startday가 5라면 금요일부터 시작하는 것으로 schedules, timelogs의 0번 index가 금요일이다.
따라서 1, 2 index가 토요일, 일요일이다.
이렇게 토요일, 일요일 index를 구하고 계산할 때 무시해야 한다.
그래서 처음에는 위의 예제만 보고 아래처럼 구하면 되겠다고 생각하였다.
startday -> 7-startday = 일요일, 6-startday = 토요일
그런데 생각해보니 startday가 일요일이면 즉 7이면 위의 식에는 문제가 생긴다.
index가 음수가 나오는 경우가 생긴다.
그래서 일요일 일 때는 따로 빼줘야 한다.
코드에서는 왜 토요일 또 따로 뺐는지 모르겠다 허허.
int saturdayIndex=0;
int sundayIndex=0;
// 토요일, 일요일 index 구하기
if(startday<=5){
saturdayIndex = 6-startday;
sundayIndex = 7-startday;
}
else if(startday==6){
saturdayIndex = 0;
sundayIndex = 1;
}
else{
saturdayIndex = 6;
sundayIndex = 0;
}
이제 각 인원의 출근 희망 시각을 보면서 확인하면 된다.
여기에서 인정되는 시간 즉 10분을 추가했다.
왜냐하면 아래에서 출근 시간이 출근 희망 시각 + 10보다 작은지 판별하려고 하니 문제가 많았다.
코드에서 볼 수 있듯이 출근 희망 시각이 10시 51분 이런 경우에 minute를 판별할 때 어지러워진다.
그래서 아예 먼저 10분을 더한 시간을 구해 놓았다.
for(int i=0;i<schedules.size();i++){
int wantHour = schedules[i]/100;
int wantMinute = schedules[i]%100;
// 인정되는 시간 구하기 (+10분)
if(wantMinute>=50){
wantHour++;
wantMinute-=50;
}
else{
wantMinute+=10;
}
이제 timelogs 배열 = 실제 출근 시간들을 보며 각 시간이 위에서 구한 출근 희망 시각 + 10분보다 작은지 확인하면 된다.
위에서 구한 토요일, 일요일 index인 경우 continue 했다.
그리고 실제 출근 시간이 위에서 구한 출근 희망 시각 + 10분보다 작다면 safeDay++ 했다.
그래서 safeDay가 5이면 answer를 1 올렸다.
int safeDay = 0;
// 일주일 출근 시간 확인
for(int j=0;j<7;j++){
// 토요일, 일요일이면 pass
if(j==saturdayIndex || j==sundayIndex){
continue;
}
// 통과한 날 찾기
int todayHour = timelogs[i][j]/100;
int todayMinute = timelogs[i][j]%100;
if(wantHour>todayHour
||(wantHour==todayHour&&wantMinute>=todayMinute)){
safeDay++;
}
}
// 5일 이상 통과면 추가
if(safeDay==5){
answer++;
}
}
전체 코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
일주일 간 설정한 출근 희망 시각에 늦지 않은 직원에게 상품 이벤트
직원들 출근 희망 시각 + 10분까지 출근해야 함
토, 일요일은 이벤트에 영향 X
매일 한번 어플로 출근
시간은 10:13 -> 1013 이렇게 표현
설정한 출근 희망 시각과 실체 출근 기록 주어짐
이것으로 상품 받을 직원 몇명인지 구하기
n = 직원 명 수
schedules = 출근 희망 시각 1차원 배열
timelogs = 일주일 간 출근한 시각 2차원 배열
startday = 이벤트 시작한 요일
startday -> 7-startday = 일요일, 6-startday = 토요일 timelogs index
*/
int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) {
int answer = 0;
int saturdayIndex=0;
int sundayIndex=0;
// 토요일, 일요일 index 구하기
if(startday<=5){
saturdayIndex = 6-startday;
sundayIndex = 7-startday;
}
else if(startday==6){
saturdayIndex = 0;
sundayIndex = 1;
}
else{
saturdayIndex = 6;
sundayIndex = 0;
}
for(int i=0;i<schedules.size();i++){
int wantHour = schedules[i]/100;
int wantMinute = schedules[i]%100;
// 인정되는 시간 구하기 (+10분)
if(wantMinute>=50){
wantHour++;
wantMinute-=50;
}
else{
wantMinute+=10;
}
int safeDay = 0;
// 일주일 출근 시간 확인
for(int j=0;j<7;j++){
// 토요일, 일요일이면 pass
if(j==saturdayIndex || j==sundayIndex){
continue;
}
// 통과한 날 찾기
int todayHour = timelogs[i][j]/100;
int todayMinute = timelogs[i][j]%100;
if(wantHour>todayHour
||(wantHour==todayHour&&wantMinute>=todayMinute)){
safeDay++;
}
}
// 5일 이상 통과면 추가
if(safeDay==5){
answer++;
}
}
return answer;
}
회고
간단한 구현 문제라 다행히 풀 수 있었다.
중점은 토, 일요일 index구하기와 인정되는 시간을 구하는 것과 통과되는 시간을 판별하는 것이였다.
바로 이전에 셔틀버스 문제에서 탈 수 있는 시간 체크하는 것을 해서 이번에는 다행히 오류 없이 시간 체크할 수 있었다.
토, 일요일 index 구하기는 그냥 간단하게 생각했으면 틀렸을 것 같다.
다행히 한번 더 생각해서 넘어갈 수 있었던 것 같다.