0. 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17676
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 핵심
1초란 범위 내에 처리할 수 있는 최대 요청 처리 개수를 구하는 문제입니다.
1초 == 1000ms라고는 했지만 시작시간과 끝시간을 포함하기 때문에 실제론 999ms라고도 할 수 있습니다.
기준 시간은 종료 시간으로 정렬이 되어있습니다.
2. 문제 접근
일반적 접근법 :
그림 1

1. 부터 N-1까지를 기준
2. 부터 N까지 기준값과 비교
3. 비교 데이터의 끝 값이 기준 값의 시작 값보다 작거나 같고 두 값의 간격이 999이하라면 겹치는 것
4. 혹은 기준 데이터의 끝값에서 비교데이터의 시작 값 차이가 999ms 이하라도 가능
3. 최소 시간 코드 분석
4. 문제 후기
정렬이 되어있는 점을 고려해서 문제를 풀면 쉽게 풀 수 있습니다.
5. 코드
더보기
public class PG_추석트래픽 {
public int solution(String[] lines) {
// 0 : 시작 시간, 1 : 종료 시간
int[][] data = new int[lines.length][2];
int max = 1, cnt = 1, tmp = 0, mod = 100, mul = 100;
String[] split, times, size;
// **********************
// 데이터 전처리 시작
// 1초 => 1000으로 변환
for (int i = 0; i < lines.length; i++) {
mod = 100;
mul = 100;
// 날짜, 시간, 타임아웃 분리
split = lines[i].split(" ");
// 시간 분리
times = split[1].split(":");
size = split[2].split("\\.");
// 초단위 하나만 존재하는 경우
if (size.length == 1) {
data[i][0] -= Integer.parseInt(size[0].substring(0, 1)) * 1000;
}
// 밀리초 포함
else {
// 앞자리 초 추가
data[i][0] -= Integer.parseInt(size[0]) * 1000;
// 0, 1, 2자리 추가해야 함
tmp = Integer.parseInt(size[1].substring(0, size[1].length() - 1));
if (size[1].length() >= 2)
data[i][0] -= (size[1].charAt(0) - '0') * 100;
if (size[1].length() >= 3)
data[i][0] -= (size[1].charAt(1) - '0') * 10;
if (size[1].length() >= 4)
data[i][0] -= size[1].charAt(2) - '0';
}
// 시, 분 추가
data[i][1] += Integer.parseInt(times[0]) * 3600 + Integer.parseInt(times[1]) * 60;
// 밀리조 분리
times = times[2].split("\\.");
// 초 추가
data[i][1] += Integer.parseInt(times[0]);
// 미리초 단위를 위해 추가
data[i][1] *= 1000;
// 미리초 추가
data[i][1] += Integer.parseInt(times[1]);
data[i][0] += data[i][1] + 1;
}
// 데이터 전처리 끝
// **********************
// 체크
// 0부터 N-1까지를 기준
// 1부터 N까지 기준값과 비교
// 1. 비교 데이터의 끝 값이 기준 값의 시작 값보다 작거나 같고 두 값의 간격이 999이하라면 겹치는 것
// 2. 혹은 기준 데이터의 끝값에서 비교데이터의 시작 값 차이가 999ms 이하라도 가능
for (int i = 0; i < lines.length - 1; i++) {
cnt = 1;
// i+1부터 n까지
for (int j = i + 1; j < lines.length; j++) {
if (data[i][1] <= data[j][0] && data[j][0] - data[i][1] <= 999) {
cnt++;
} else if (data[i][1] + 999 >= data[j][0]) {
cnt++;
}
}
max = Math.max(max, cnt);
}
return max;
}
}
'programming > 알고리즘' 카테고리의 다른 글
[PG, 자바] 등산코스정하기 (0) | 2022.09.20 |
---|---|
[PG, 자바] 피로도 (0) | 2022.09.06 |
[프로그래머스, 자바] PG_전력망을둘로나누기 (0) | 2022.08.25 |
[백준, 1917, 자바] 정육면체 전개도 (0) | 2022.08.24 |
[백준, 1113, 자바] 수영장 만들기 (0) | 2022.08.04 |
댓글