난이도: Lv. 2
정답률: 50%
문제: https://school.programmers.co.kr/learn/courses/30/lessons/155651
알고리즘
- 파라미터로 주어진 배열을 순회하며 대실 시각을 저장하는 새로운 배열에
[대실 시작 시각, 1], [대실 종료 시각 + 10분, -1] 두 배열을 담는다. - 1에서 만든 배열을 시각 기준으로 오름차순 정렬한다. 동일한 시각이 있을 경우 대실 종료인 시각이 앞에 와야 한다.
- 2에서 정렬한 배열을 순회하며 각 배열의 첫 번째 인덱스의 값을 더한다. 더하면서 현재 값과 answer을 비교하여 최댓값인지 확인한다.
코드
function solution(book_time) {
let answer = 0, roomCount = 0;
const timeArr = [];
for (let time of book_time) {
timeArr.push([convertToMinute(time[0]), 1]);
timeArr.push([convertToMinute(time[1]) + 10, -1]);
}
timeArr.sort((a, b) => {
if (a[0] < b[0])
return -1;
else if (a[0] > b[0])
return 1;
else
return a[1] > b[1] ? 1 : -1;
});
for (let [time, startOrEnd] of timeArr) {
roomCount += startOrEnd;
if (roomCount > answer)
answer = roomCount;
}
return answer;
}
function convertToMinute(time) {
return +time.substring(0, 2) * 60 + +time.substring(3);
}
주저리
어떻게 풀지 감도 안와서 20분 동안 가만히 생각만 했다. 이게 정녕 2단계 문제가 맞냐고 땡깡부리다가 다 풀고 나니까 이건 2단계 문제가 맞다고 생각했다. 머쓱타드
1트의 실패 사유는 청소 시간을 더해주지 않았기 때문
2트의 실패 사유는 a[0]과 b[0]이 동일할 때의 정렬이 잘못되었음을 깨달음 & 클리닝 타임 더해주는 함수에서 실수
function addCleaningTime(time) {
let hour = +time.substring(0, 2);
let minute = +time.substring(3) + 10;
if (minute >= 60) {
hour += 1;
minute -= 60;
}
if (hour < 10)
hour = `0${hour}`;
if (minute < 10)
minute = `0${minute}`;
return `${hour}:${minute}`;
}
처음 풀 때는 분 단위로 변환 안하고 위 함수처럼 청소 시간 더해주는 함수를 만들어서 'HH:MM' 리턴하도록 써서 통과도 했었는데 남의 풀이 보다가 분 단위로 변환하는 방법이 있다는 걸 그제야 깨닫고......... 다시 고쳤다.
내일 역량진단평가 친대서 쫄리기 때문에 오랜만에 코테 문제를 풀어봤다.
'코딩테스트' 카테고리의 다른 글
[Python] 크레인 인형 뽑기 게임 (1) | 2024.09.03 |
---|---|
[JS] 시소 짝꿍 (0) | 2024.05.07 |
[JS] 마법의 엘리베이터 (0) | 2024.04.30 |
[JS] 메뉴 리뉴얼 (1) | 2024.04.16 |
[JS] 전력망을 둘로 나누기 (0) | 2024.04.09 |