https://school.programmers.co.kr/learn/courses/30/lessons/150370
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
LV 1
구현 방법
1 ≤ terms의 길이 ≤ 20
1 ≤ privacies의 길이 ≤ 100
런타임 에러 걱정없이 구현 할 수 있다.
문제는 String 형식으로 된 날짜 형식을 어떤 식으로 바꿔서 날짜 비교를 할지 였다. 처음에는 일일히 년,월,일을 StringTokenizer를 이용해서 나누고, 이걸 int 형식으로 바꾸고, 필요한 만큼 더하기 한 후, today와 비교 하는 식으로 구현 하려고 했다. 하지만 이렇게 하면 더하면서 12월을 넘은 경우, 1일 인 경우 예외 처리를 해야 하는데 이 과정이 복잡했다.
그래서 애초에 처음부터 년, 월, 일을 일로 변환하여 계산하고, 이를 비교하면 깔끔해게 해결 된다.
terms의 경우는 Map 형식으로 바꿔서, O(1)으로 term을 찾을 수 있어서, O(n)의 시간 복잡도로 구현 가능하다.
코드
import java.util.StringTokenizer;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
class Solution {
public int[] solution(String today, String[] terms, String[] privacies) {
StringTokenizer st = new StringTokenizer(today, ".");
int todaySum = 0;
todaySum += Integer.parseInt(st.nextToken()) * 12 * 28 +
Integer.parseInt(st.nextToken()) * 28 +
Integer.parseInt(st.nextToken());
Map<String, Integer> termsMap = new HashMap<>();
for(int i = 0; i < terms.length; i++) {
st = new StringTokenizer(terms[i], " ");
termsMap.put(st.nextToken(), Integer.parseInt(st.nextToken()) * 28);
}
List<Integer> answerList = new ArrayList<>();
for(int i = 0; i < privacies.length; i++) {
st = new StringTokenizer(privacies[i], ".| ");
int curSum = 0;
curSum += Integer.parseInt(st.nextToken()) * 12 * 28 +
Integer.parseInt(st.nextToken()) * 28 +
Integer.parseInt(st.nextToken()) +
termsMap.get(st.nextToken());
if (todaySum >= curSum) {
answerList.add(i + 1);
}
}
int[] answer = answerList.stream()
.mapToInt(Integer::intValue)
.toArray();
return answer;
}
}
느낀 점
string 형식의 날짜나 시간이 나오는 경우 미리 다 합쳐놓고 비교해야겠다.
localdatetime 형식으로도 풀어볼 예정.
'알고리즘' 카테고리의 다른 글
자바 - 프로그래머스 / 짝지어 제거하기 (0) | 2023.05.05 |
---|---|
자바 - 프로그래머스 / 피보나치 수 (1) | 2023.05.03 |
자바 - 프로그래머스 / [1차]캐시 (0) | 2023.05.02 |
자바 - 프로그래머스 / 이모티콘 할인 행사 (0) | 2023.04.28 |
자바 - 프로그래머스 / 광물 캐기 (0) | 2023.04.24 |