Dev/Algorithm

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

VIPeveloper 2024. 5. 17. 16:54
728x90
반응형

문제

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

 

프로그래머스

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

programmers.co.kr

 

생각

 1. terms를 맵으로 변환한다.
 2. privacies 를 순회하며 해당 일자의 파기일자를 구한다.
 3. 파괴해야한다면 큐에 넣기

코드

  • 힌트를 좀 봤다.
  • 28일로 고정되어있는게 힌트고 자칫 함정에 빠질 수 있는 문제였다. (이미 함정에 빠졌었다.)
  • 년을 먼저 구한다. -> 더해서 12월이 되는경우 년도를 더하면 안된다.
    월을 구할 때 -1 해야 한다 등 어처구니 없는 행위들을 생각하느라 시간을 많이 쏟았다.
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
        System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
    }

    public static int[] solution(String today, String[] terms, String[] privacies) {
        int[] answer = {};

        String[] split = today.split("\\.");
        Integer today_year = Integer.valueOf(split[0]);
        Integer today_month = Integer.valueOf(split[1]);
        Integer today_day = Integer.valueOf(split[2]);

        int today_total = 12*28*today_year + 28*today_month + today_day;

        // 1. terms를 맵으로 변환한다.
        HashMap<String, Integer> terms_map = new HashMap<>();
        for (int i = 0; i < terms.length; i++) {
            terms_map.put(terms[i].split(" ")[0], 28*Integer.valueOf(terms[i].split(" ")[1]));
        }

        Queue<Integer> queue = new LinkedList<>();

        // 2. privacies 를 순회하며 해당 일자의 파기일자를 구한다.
        for (int i = 0; i < privacies.length; i++) {
            String suZipIl = privacies[i].split(" ")[0];
            String yakGwan = privacies[i].split(" ")[1];

            int paGiIl = getPaGiIl(suZipIl,yakGwan,terms_map);
            // 3. 하루 빼는 대신 ==도 포함시키기 큐에 넣기
            if(today_total >= paGiIl){
                queue.add(i);
            }
        }
        answer = new int[queue.size()];
        for (int i = 0; i < answer.length; i++) {
            answer[i] = queue.poll()+1;
        }
        for (int i = 0; i < answer.length; i++) {
            System.out.print(answer[i] + " ");
        }

        return answer;
    }

    // suZipIl : 2024.05.11
    // yakGwan : A
    // suZip_month : 5
    // manRowIl_Month : 100
    private static int getPaGiIl(String suZipIl, String yakGwan, HashMap<String, Integer> termsMap) {
        Integer manRowIl_Month = termsMap.get(yakGwan);
        String[] split = suZipIl.split("\\.");
        Integer suZip_year = Integer.valueOf(split[0]);
        Integer suZip_month = Integer.valueOf(split[1]);
        Integer suZip_day = Integer.valueOf(split[2]);
        int suZip_total = 12*28*suZip_year + 28*suZip_month + suZip_day;


        return suZip_total + manRowIl_Month;
    }
}

다른 사람 코드

  • 두가지 코드가 매력적이라 두 코드를 다 가져왔다.
  • 첫번째는 28일이 같다는 아이디어를 이용한 것이고
  • 두번째는 날짜 함수를 이용한 것이다.
public class Main {
    public static void main(String[] args) {
        System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
        System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
    }

    public static int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        Map<String, Integer> termMap = new HashMap<>();
        int date = getDate(today);

        for (String s : terms) {
            String[] term = s.split(" ");

            termMap.put(term[0], Integer.parseInt(term[1]));
        }
        for (int i = 0; i < privacies.length; i++) {
            String[] privacy = privacies[i].split(" ");

            if (getDate(privacy[0]) + (termMap.get(privacy[1]) * 28) <= date) {
                answer.add(i + 1);
            }
        }
        return answer.stream().mapToInt(integer -> integer).toArray();
    }

    private static int getDate(String today) {
        String[] date = today.split("\\.");
        int year = Integer.parseInt(date[0]);
        int month = Integer.parseInt(date[1]);
        int day = Integer.parseInt(date[2]);
        return (year * 12 * 28) + (month * 28) + day;
    }
}

 

  • 두번째 코드
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        System.out.println(solution("2022.05.19",new String[]{"A 6", "B 12", "C 3"},new String[]{"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"}));
        System.out.println(solution("2020.01.01",new String[]{"Z 3", "D 5"},new String[]{"2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"}));
    }

    public static int[] solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
        LocalDate date = LocalDate.parse(today, formatter);

        // 찾기 쉽도록 termsMap 구성
        Map<String, Integer> termsMap = new HashMap<>();

        for (int i = 0; i < terms.length; i++) {
            String[] term = terms[i].split(" ");
            termsMap.put(term[0], Integer.valueOf(term[1]));
        }

        for (int i = 0; i < privacies.length; i++) {
            String[] privacy = privacies[i].split(" ");
            LocalDate privacyRegisterYmdt = LocalDate.parse(privacy[0], formatter).plusMonths(termsMap.get(privacy[1])).minusDays(1);


            if (privacyRegisterYmdt.isBefore(date)) {
                answer.add(i + 1);
            }
        }
        return answer.stream().mapToInt(Integer::intValue).toArray();
    }
}
728x90
반응형