Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |
Tags
- 자료구조
- 자바스크립트
- 갭체크
- 프로그래밍 언어
- 자바
- 코딩테스트
- 연결 리스트
- 오블완
- 개발자취업
- 코드트리
- 알고리즘
- 코테공부
- 99클럽
- 코딩테스트준비
- 티스토리챌린지
- 프로그래머스
- C
- 개발자루틴
- 1일1코테
- 인접 행렬
- 파이썬
- 웹
- 운영체제
- 항해99
- Java
- til
- 데이터베이스
- 플로이드-워셜
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 코딩테스트사이트추천
Archives
- Today
- Total
와드의 블로그
유연근무제 본문
문제
직원들이 일주일 동안 자신이 설정한 출근 희망 시각 + 10분 이내에 출근하는 이벤트를 진행합니다. 단, 토요일과 일요일의 출근 시각은 이벤트에 영향을 끼치지 않습니다. 직원들의 출근 희망 시각과 실제 출근 기록, 이벤트를 시작한 요일이 주어질 때 상품을 받을 직원이 몇 명인지 구하는 프로그램을 작성하는 문제입니다. 모든 시각은 시에 100을 곱하고 분을 더한 정수 형식(예: 9시 58분 -> 958)으로 주어집니다.
- 입력: * 직원 n명이 설정한 출근 희망 시각 schedules (1차원 배열)
- 일주일 동안의 실제 출근 시각 timelogs (2차원 배열)
- 이벤트를 시작한 요일 startday (1: 월, 2: 화, 3: 수, 4: 목, 5: 금, 6: 토, 7: 일)
- 출력: 상품을 받을 직원의 수를 반환합니다.
링크: https://school.programmers.co.kr/learn/courses/30/lessons/388351
풀이: 요일 판별 및 시간 올림을 활용한 구현
정수형으로 주어지는 시간을 시와 분으로 올바르게 분리하여 더하고, 주말을 제외하는 조건 분기가 핵심인 시뮬레이션 문제입니다.
- 주말(토, 일) 제외: 이벤트를 시작한 요일 startday에 현재 일차 j(0~6)를 더한 뒤 7로 나눈 나머지(modDay)를 구합니다. 나머지가 6이면 토요일, 0이면 일요일이 되므로, modDay == 0 || modDay == 6인 경우에는 출근 시각을 검사하지 않고 무시(continue)합니다.
- 인정 시각 계산 (60분 초과 처리): 출근 희망 시각에 10분을 더했을 때(tmp = schedules[i] + 10), 분(minute) 단위가 60을 넘어가면 시(hour)를 올려주어야 합니다.
- 분 추출 및 판별: tmp % 100이 60 이상인지 확인합니다.
- 초과한 경우: 시(hour)는 tmp / 100 + 1로 계산하고, 분(minute)은 tmp % 100 % 60으로 보정하여 새로운 한계 시각(tmp)을 재조립합니다.
- 지각 여부 판별: 최종 인정 시각 tmp가 실제 출근 시각 timelogs[i][j]보다 작다면 이벤트에 실패한 것이므로 flag를 false로 바꾸고 다음 사람으로 넘어갑니다(break).
- 일주일 동안 한 번도 지각하지 않아 flag가 true로 유지된 직원의 수만 정답에 누적하여 반환합니다.
코드
class Solution {
public int solution(int[] schedules, int[][] timelogs, int startday) {
int ans = 0;
for (int i = 0; i < schedules.length; i++) {
boolean flag = true;
for (int j = 0; j < 7; j++) {
// 요일 계산: 6은 토요일, 0은 일요일
int modDay = (startday + j) % 7;
if (modDay == 0 || modDay == 6) continue;
// 인정 한계 시각 (희망 시각 + 10분)
int tmp = schedules[i] + 10;
// 분(minute)이 60을 초과하는 경우 시(hour) 올림 처리
if (tmp % 100 >= 60) {
int m = tmp % 100 % 60;
int h = tmp / 100 + 1;
tmp = h * 100 + m;
}
// 실제 출근 시각이 인정 시각보다 늦은 경우 지각 처리
if (tmp < timelogs[i][j]) {
flag = false;
break;
}
}
// 지각을 한 번도 하지 않은 경우
if (flag) {
ans++;
}
}
return ans;
}
}
알고리즘 분류
구현 (Implementation), 시뮬레이션 (Simulation), 수학 (Mathematics)