티스토리 뷰

문제 설명:

https://school.programmers.co.kr/learn/courses/30/lessons/150370?language=java#

 

프로그래머스

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

programmers.co.kr

 

고객의 약관 동의를 얻어서 수집된 1~n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

모든 달은 28일까지 있다고 가정합니다.

 


 

풀이 코드: 

import java.util.Vector;

class Solution {
    public static int[] solution(String today, String[] terms, String[] privacies) {

        Vector<Integer> vector = new Vector<Integer>();

        //[0] today 년, 월, 일 분리하기
        int t_year = (today.charAt(0)-'0')*1000 + (today.charAt(1)-'0')*100 + (today.charAt(2)-'0')*10 + (today.charAt(3)-'0');
        int t_month = (today.charAt(5)-'0')*10 + (today.charAt(6)-'0');
        int t_day = (today.charAt(8)-'0')*10 + (today.charAt(9)-'0');


        for(int index = 0; index<privacies.length; index++){
            String p = privacies[index];

            int left_months = 0; //유효 기간

            // [1] terms에서 개인정보 약관 종류 찾아서 유효기간 가져오기
            for(String t : terms ) {
                double digit = 0;
                if (t.charAt(0) == p.charAt(p.length() - 1)) {
                    for (int i = t.length()-1; ; i--) {
                        if(t.charAt(i)==' ')break;
                        else{
                            double num = (t.charAt(i) - '0') * Math.pow(10, digit);
                            left_months += (int) num;
                            digit++;
                        }
                    }
                    break;
                }
            }

            //[2]: privacies 년 / 월 / 일 각각 분리하기
            int p_year = (p.charAt(0)-'0')*1000 + (p.charAt(1)-'0')*100 + (p.charAt(2)-'0')*10 + (p.charAt(3)-'0');
            int p_month =  (p.charAt(5)-'0')*10 + (p.charAt(6)-'0');
            int p_day = (p.charAt(8)-'0')*10 + (p.charAt(9)-'0');

            //[3]: left_months를 가지고 deadline 계산하기
            p_year+=left_months/12;
            p_month+=left_months%12;

            if(p_month>12) {
                p_year+=p_month/12;
                p_month%=12;
            }
         

            //[4]: 오늘 날짜와 비교해서 유효기간 지났는지 확인
            // [4]-1 연도가 이미 지났을 경우
            if(t_year>p_year){
                vector.add(index+1);
            }
            else if(t_year==p_year){
                //[4]-2 같은 연도에서 유효기간 달이 지났을 경우
                if(t_month>p_month) {
                    vector.add(index+1);
                }
                //[4]-3 같은 연도, 같은 달에서 하루 이상 지났을 경우
                else if(t_month==p_month && t_day>=p_day){
                    vector.add(index+1);
                }
            }
        }

        int[] answer = new int[vector.size()];
        for(int i =0; i<vector.size(); i++){
            answer[i]=vector.elementAt(i);
        }
        return answer;
    }
}

 

메인 언어를 자바로 바꾼 뒤 처음으로 풀어본 코딩 테스트 문제이다

 

[3] 번에 left_month를 가지고 deadline을 계산하는 부분 코드를 구성하면서 정말 단순함에도 많이 헤맸는데

내 초기 코드는 아래와 같았다.

//[3]: left_months를 p_month에 더하고 시작하기 (오류)
	p_month+=left_month;

	if(p_month>12){
		p_year+=p_month/12;
		p_month%=12;
		if(p_month==0) p_month=12;
	}

먼저 남은 달을 p_month에 더하고, 그게 12를 넘어가면 p_year에 누적해 가는 형태였다.

하지만 이것은 좋지 못한 풀이였다. 17번의 반례이기도 하다.

* 프로그래머스 17번 반례: 

입력값 〉 "2020.12.17", ["A 12"], [ "2019.12.17 A"]
기댓값 〉 [1]

결괏값〉 [ ]

 

위 반례에서 p_month에 left_month를 더하면 p_month는 24가 된다. 그걸 12로 나눈 값을 연도에 더하면 2를 더하게 되어 deadline이 2021년 12월 17일이 되는 것이다. (정답은 2020년 12월 17일)

 

그러므로 left_month를 먼저 분해하고 그 값을 p_month에 더하는 방향으로 코드를 수정했다.

 //[3]: left_months를 먼저 분해하고, 값을 누적하기
            p_year+=left_months/12;
            p_month+=left_months%12;

            if(p_month>12) {
                p_year+=p_month/12;
                p_month%=12;
            }

 

세 시간 만에 해결 완료!

 


아래는 인텔리제이 프로그램에서 직접 돌려보며 결과를 눈으로 확인할 수 있는 테스트 코드이다. 

 

 

테스트용 코드 Main.java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        String today = "2022.05.19";
        String[] terms = {"A 6", "B 12", "C 3"};
        String[] privacies = {"2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"};

        System.out.println(Arrays.toString(Solution.solution(today, terms, privacies)));
    }
}

 

 

테스트용 코드 Solution for test.java

import java.util.Arrays;
import java.util.Vector;

class Solution {
    public static int[] solution(String today, String[] terms, String[] privacies) {

        Vector<Integer> vector = new Vector<Integer>();

        //[0] today 년, 월, 일 분리하기
        int t_year = (today.charAt(0)-'0')*1000 + (today.charAt(1)-'0')*100 + (today.charAt(2)-'0')*10 + (today.charAt(3)-'0');
        int t_month = (today.charAt(5)-'0')*10 + (today.charAt(6)-'0');
        int t_day = (today.charAt(8)-'0')*10 + (today.charAt(9)-'0');

        System.out.println("오늘 날짜: "+t_year+ " . " + t_month+ " . "+ t_day);

        for(int index = 0; index<privacies.length; index++){
            System.out.println();////////////////////////////////////////////////////////////////////////////////////
            String p = privacies[index];

            int left_months = 0; //유효 기간

            // [1] terms에서 개인정보 약관 종류 찾아서 유효기간 가져오기
            for(String t : terms ) {
                double digit = 0;
                if (t.charAt(0) == p.charAt(p.length() - 1)) {
                    for (int i = t.length()-1; ; i--) {
                        if(t.charAt(i)==' ')break;
                        else{
                            double num = (t.charAt(i) - '0') * Math.pow(10, digit);
                            left_months += (int) num;
                            digit++;
                        }
                    }
                    System.out.println(index + " 번째 유효기간: " + left_months);///////////////////////////////////////////
                    break;
                }
            }

            //[2]: privacies 년 / 월 / 일 각각 분리하기
            int p_year = (p.charAt(0)-'0')*1000 + (p.charAt(1)-'0')*100 + (p.charAt(2)-'0')*10 + (p.charAt(3)-'0');
            int p_month =  (p.charAt(5)-'0')*10 + (p.charAt(6)-'0');
            int p_day = (p.charAt(8)-'0')*10 + (p.charAt(9)-'0');

            System.out.println("개인정보 수집 일자: "+p_year+"년 "+p_month+"월 ");///////////////////////////////////////////////

           //[3]: left_months를 가지고 deadline 계산하기
            p_year+=left_months/12;
            p_month+=left_months%12;

            if(p_month>12) {
                p_year+=p_month/12;
                p_month%=12;
            }
            System.out.println("deadline: "+p_year+"년 "+p_month+"월 "+p_day);//////////////////////////////////////////////////

            //[4]: 오늘 날짜와 비교해서 유효기간 지났는지 확인
            if(t_year>p_year){ // 연도가 이미 지났을 경우
                vector.add(index+1);
                System.out.println("vector 삽입 발생");////////////////////////////////////////////////////////////////////////////
            }
            else if(t_year==p_year){
                //같은 연도에서 유효기간 달이 지났을 경우
                if(t_month>p_month) {
                    vector.add(index+1);
                    System.out.println("vector 삽입 발생");//////////////////////////////////////////////////////////////////////
                }
                else if(t_month==p_month && t_day>=p_day){
                    vector.add(index+1);
                    System.out.println("vector 삽입 발생");//////////////////////////////////////////////////////////////////////////
                }
            }
        }

        int[] answer = new int[vector.size()];
        for(int i =0; i<vector.size(); i++){
            answer[i]=vector.elementAt(i);
        }
        return answer;
    }
}

 

위의 테스트용 코드를 사용하면 아래와 같이 콘솔창에 각 단계의 출력값을 보기 좋게 출력해 준다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함