문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
이 문제는 간단한 구현 문제이다.
1. 평일을 기록해야한다.
2. 출근 인정 시각을 구하는 메소드를 하나 만들어야한다.
이 두가지가 떠올랐다.
풀이는 다음과 같다.
1. 집합에 평일에 대한 정보를 담는다.
집합을 사용한 이유는 O(1)연산으로, 평일인지 아닌지 구분하기 위해서이다.
2. startDay가 1 ~ 7이 아니라 0 ~ 6이 되면 나머지 연산하기 좋으므로 1을 감소시킨다.
3. 출근 시간과 출근 인정시간을 구하고 이벤트 시작 요일을 갱신한다. 그리고 상품을 받을 수 있는지 여부인 boolean 변수를 하나 둔다.
4. 평일이면, 출근 인정시간보다 크면 출근 인정을 받을 수 없으므로, for문을 빠져나온다.
5. boolean 변수로 상품을 받을 수 있는 사람들의 수를 센다.
소스코드
import java.util.*;
class Solution {
private static HashSet<Integer> set;
public int solution(int[] schedules, int[][] timelogs, int startday) {
set = new HashSet<>();
//평일 정수 값을 집합에 넣음(O(1) 연산에 찾기 위해서)
for (int i = 0; i <= 4; i++) {
set.add(i);
}
startday -= 1;
int answer = 0;
for (int i = 0; i < timelogs.length; i++) {
//출근 희망 시각
int attMinTime = schedules[i];
//출근 인정 시각
int attMaxTime = addMinute(attMinTime, 10);
//이벤트 시작 요일
int curDay = startday;
boolean isGiven = true;
for (int j = 0; j < 7; j++) {
//평일이라면,
if (set.contains(curDay)) {
int attTime = timelogs[i][j];
//출근 인정 시각보다 크면 받을 수 없음
if (attTime > attMaxTime) {
isGiven = false;
break;
}
}
curDay = (curDay + 1) % 7;
}
if (isGiven) {
answer += 1;
}
}
return answer;
}
private static int addMinute(int curTime, int minute) {
int curHour = curTime / 100;
int curMinute = curTime % 100;
curMinute += 10;
//60 넘어갔을 경우,
if (curMinute >= 60) {
curHour += 1;
curMinute %= 60;
}
//24시가 되었을 경우,
if (curHour >= 24) {
curHour %= 24;
}
return (curHour * 100) + curMinute;
}
}'Problem Solving > Programmers' 카테고리의 다른 글
| [Programmers] 완전범죄 - Java (0) | 2025.06.17 |
|---|---|
| [Programmers] 가장 많이 받은 선물 - Java (0) | 2025.06.16 |
| [Programmers] 봉인된 주문 - Java (0) | 2025.06.14 |
| [Programmers] 택배 상자 꺼내기 - Java (0) | 2025.06.12 |
| [Programmers] 가장 긴 팰린드롬 - Java (1) | 2025.06.11 |