티스토리 뷰
[JAVA] 2023 KAKAO Blind Recruitment 개인정보 수집 유효 기한 문제 풀이 / 프로그래머스 17번 반례
YouJungJang 2023. 11. 2. 15:36문제 설명:
https://school.programmers.co.kr/learn/courses/30/lessons/150370?language=java#
고객의 약관 동의를 얻어서 수집된 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;
}
}
위의 테스트용 코드를 사용하면 아래와 같이 콘솔창에 각 단계의 출력값을 보기 좋게 출력해 준다.
'Study > JAVA' 카테고리의 다른 글
[JAVA] SW Expert Academy #2001 파리 퇴치 문제 풀이 | ArrayList | 완전 탐색 (0) | 2023.11.16 |
---|---|
[JAVA] SW Expert Academy #1961 숫자 배열 회전 풀이 | ArrayList | 2차원 배열 (0) | 2023.11.16 |
[JAVA] SW Expert Academy #18662 등차수열 만들기 문제 풀이 (0) | 2023.11.16 |
[JAVA] 백준 #4358 생태학 문제 풀이 | HashMap | TreeMap | Buffered Reader (0) | 2023.11.16 |
[JAVA] 문자열을 쉽고 능숙하게 다루는 방법 / String to Integer 쉽게 하는 방법 ParseInt / SubString (2) | 2023.11.03 |