일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 비밀 코드 해독
- orthographic projection
- 프로그래밍공부
- DirectX
- 홀짝트리
- 브루트포스
- 지게차와 크레인
- boj 1958
- c++
- lock based stack
- render target
- boj 21921
- boj 1074
- boj 22942
- pccp 기출문제 풀이
- lock based queue
- DirectX12
- dp
- LCS
- boj 20207
- PCCE
- boj 11053
- 색종이와가위
- lock free stack
- 데이터 체커
- tessellation
- pcce 기출문제 풀이
- boj 15724
- 2025 프로그래머스 코딩챌린지 1차예선
- boj 6443
- Today
- Total
오구의코딩모험
[C++] [2025 프로그래머스 코드챌린지 1차 예선] 1번 / 유연근무제 본문


https://school.programmers.co.kr/learn/courses/30/lessons/388353
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제 3줄 요약
1. 일주일동안 지각하지 않은 직원은 상준다.
2. 본인의 희망 출근 시각 + 10분까지 출근해야만 한다.
3. 상을 받는 직원은 몇 명일까요?

주말에 일정이 생겨서
1차 예선은 참가하지 못하고 2차 예선만 참가하였다..!
그런데
프로그래머스에 1차 예선 문제가 올라온 것을 보고
하나씩 풀어봐야지 싶었다!
1번은
코테에서 종종 봤던 시간 계산과 관련된 문제였다.
60분이 넘어가면 1시간을 추가해주는 연습을 할 수 있는 문제라
생각하고 풀어보자!

입출력 예시를 보면
schedules에 직원들의 희망 출근 시각을 담아두고 있으며,
timelogs에 일주일 간의 출근 기록을 담아두고 있습니다.
startday는?

이벤트가 시작한 날짜를 의미하네요!
첫 번째 예시는 5이니, 금요일부터 시작입니다.
요일이 왜 중요하냐..
주말엔 출근을 하지 않기 때문에 출근 시각이 이벤트에 영향을 주지 않기 때문!!
그럼
직원들의 희망 시각 + 10분과
출근 기록들을 하나씩 비교해보고자 합니다.
for(int i=0; i<schedules.size(); i++) { int goal = ((schedules[i]/100 + (schedules[i]%100+10)/60)*100) + (schedules[i]%100+10)%60; int start_cnt = startday-1, chk=1; for(int j=0; j<timelogs[i].size(); j++) { int cmp_time = timelogs[i][j]; if(goal < cmp_time) { chk=0; break; } } if(chk) answer++; }
출근 목표 시각인 희망 시각 + 10을
goal 이란 변수에 담았는데요.
무식하게 작성해놔서
좀 풀어서 살펴보겠습니다.
schedules[i]/100 // 1. 출근 희망 시각에서 분을 제외 (ex. 710 -> 7) (schedules[i]%100+10) // 2. 희망 시각에서 분만 추출하여 10분 추가하기 (schedules[i]%100+10)/60 // 2-1. 10분 추가한 시간이 60분이 넘지 않아야한다. (ex. 65분 -> 1시간) (schedules[i]%100+10)%60 // 2-2. 10분 추가한 시간이 60분이 넘지 않아야한다. (ex. 65분 -> 5분) (schedules[i]/100+ (schedules[i]%100+10)/60)) *100 // 3. *100을 하여 시각으로 만들어주기. ((schedules[i]/100 + (schedules[i]%100+10)/60)*100) + (schedules[i]%100+10)%60 // 4. 분도 더해주기! // 실행 시, 855 -> 905
이젠 위의 코드에서
날짜만 고려해서 추가해주면 되겠습니다.
문제에서는
1이 월요일을 표시하지만,
저는 -1을 해주어 0부터 월요일, 1은 화요일 .... 6은 일요일을 표기하도록 하겠습니다.
int answer = 0; for(int i=0; i<schedules.size(); i++) { int goal = ((schedules[i]/100 + (schedules[i]%100+10)/60)*100) + (schedules[i]%100+10)%60; int start_cnt = startday-1, chk=1; for(int j=0; j<timelogs[i].size(); j++) { int cmp_time = timelogs[i][j]; if(start_cnt%7 < 5) { if(goal < cmp_time) { chk=0; break; } } start_cnt++; } if(chk) answer++; } return answer;
따라서
start_cnt는 for문을 통해 날짜가 변할 때마다
1씩 증가하게 됩니다.
그때 start_cnt의 7로 나눈 나머지가
이벤트 시작한 요일 이후의 요일들을 차례대로 순회하게 됩니다.
< 예 시 >
이벤트 금요일(4) 시작 → 토요일(5) → 일요일(6) → 월요일(7%7 = 0) → 화요일(8&7 = 1) ....
따라서
7로 나눈 나머지가 5와 6일 경우에는 주말일테니
그 경우에는 목표 시각과 비교해주지 않아도 됩니다!
만일
하루라도 지각 했다면,
이미 이벤트 탈락이니 for문을 break 해주고 answer 체크에서 제외시킵니다.
따라서 정답은
아래와 같이 작성할 수 있습니다.
#include <string> #include <vector> using namespace std; int solution(vector<int> schedules, vector<vector<int>> timelogs, int startday) { int answer = 0; for(int i=0; i<schedules.size(); i++) { int goal = ((schedules[i]/100 + (schedules[i]%100+10)/60)*100) + (schedules[i]%100+10)%60; int start_cnt = startday-1, chk=1; for(int j=0; j<timelogs[i].size(); j++) { int cmp_time = timelogs[i][j]; if(start_cnt%7 < 5) { if(goal < cmp_time) { chk=0; break; } } start_cnt++; } if(chk) answer++; } return answer; }
문제에 자주 나오는 요일 계산과 시간 계산이므로
꼭 풀어보면 좋은 문제인 것 같네요!!

끝!
'프로그래밍 공부 > 프로그래머스' 카테고리의 다른 글
[C++] [2025 프로그래머스 코드챌린지 1차 예선] 2번 / 비밀 코드 해독 (0) | 2025.03.19 |
---|---|
[C++] [2025 프로그래머스 코드챌린지 1차 예선] 4번 / 홀짝트리 (0) | 2025.03.18 |
[C++] [PCCE 기출문제] 9번 / 지폐 접기 (1) | 2024.12.21 |
[C++] [PCCE 기출문제] 10번 / 공원 (1) | 2024.12.20 |
[Python] [PCCP 기출문제] 4번 / 수식 복원하기 (1) | 2024.09.13 |