본문 바로가기
Algorithm-Java

프로그래머스 - 개인정보 수집 유효기간

by wwns 2023. 2. 27.
반응형

최근 코딩테스트 준비를 열심히 해보겠다고 다른 공부 다 내려놓고 열심히 풀었지만 특정 유형에 대한 양치기를 했던 것 같다.. 빠른 시간 내에 백준 골드정도를 찍었지만 유형 파악을 하기 위해 잘 모르면 금방 답지를 보고 유형을 외우는 식이었다.. 실제 코딩테스트에 들어가서 문제를 보면 문제 이해능력이 너무 떨어져 시험을 망쳤고.. 기출문제를 풀면서 이해한 내용을 정리하고 스스로 문제를 이해하는 시간을 가지려고 한다!

 

 2023 KAKAO BLIND RECUITMENT lv1에 해당하는 문제부터 차근차근 고민하며 푸는 습관을 길러보자.!

https://school.programmers.co.kr/learn/courses/30/lessons/150370

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://school.programmers.co.kr/learn/courses/30/lessons/150370
https://school.programmers.co.kr/learn/courses/30/lessons/150370

문제 해석

개인정보를 수집한 일자를 기록해 놓고, 약관의 종류에 따라 유효기간이 지났는지를 판단하는 문제이다.

제한사항의 길이가 적어 전체를 순회하면서 기간이 지났는지를 체크하면 된다라고 생각을 했다.

1레벨답게 쉽게 아이디어가 떠올랐다.

 

약관의 종류는 중복 없이 주어지므로 Map을 통해 약관 유형과 기간을 Key-Value로 관리하고

모든 달은 28일이기 때문에, 개인정보 수집일자를 split 하여 총일수를 구해 오늘 날짜와 비교해 주면 된다고 생각했다.

 

바로 구현에 들어갔다.

 IDE 없이 처음에 구현을 했고, 에러가 나서 IDE로 옮겨 확인해보니 ㅠㅠ "."으로 split 할 때 "\\."으로 해주지 않아 에러가 발생..

총시간은 40분 정도 걸린 것 같다. 에러를 너무 늦게 처리함..

 


import java.util.*;
class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> termMap = new HashMap<>();
        for(String t : terms){
            String[] term = t.split(" ");
            termMap.put(term[0], Integer.parseInt(term[1]));    // 중복되는 key는 없다
        }
        for(int i=0; i<privacies.length; i++){
            String[] privacy = privacies[i].split(" ");
            int term = termMap.get(privacy[1]);
            if(!checkTerm(term, privacy[0], today)) answer.add(i+1);
        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
    public boolean checkTerm(int term, String date, String today){
        int[] curr = Arrays.stream(today.split("\\.")).mapToInt(Integer::parseInt).toArray();
        int[] past = Arrays.stream(date.split("\\.")).mapToInt(Integer::parseInt).toArray();
        int days = term * 28;
        int cDays = (curr[0] * 12 * 28) + (curr[1] * 28) + curr[2];
        int pDays = (past[0] * 12 * 28) + (past[1] * 28) + past[2];
        return cDays - pDays < days;
    }
}

일자를 비교할 때 유효기간까지 포함해야 되는 것이 아닌가 했지만, 2022.02.19에 약관 동의를 했고, 유효기간이 3 달이라면

2022.05.18일까지 유효기간이므로 포함하지 않았다.

 

목표는 매일 한 문제씩 풀고, 시간이 좀 된다면 백준 양치기 문제를 복습하려고 한다.. 매일 풀고 포스팅은 어렵겠지..ㅠ

 

 

 

반응형