본문 바로가기
알고리즘/프로그래머스

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

by KDW999 2023. 2. 10.

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

today : 오늘 날짜를 의미하는 문자열
terms : 약관의 유효기간을 담은 1차원 문자열 배열
privacies : 수집된 개인정보의 정보를 담은 1차원 문자열 배열
말이 구구절절 긴데 읽어보면 되게 뭐 없지만 푸는 건 구구절절하게 풀었다.

머릿속에 떠오르는 생각의 흐름대로 풀었는데 코드가 너무 길고 너저분하다.

 

import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
		ArrayList<Integer> list = new ArrayList<Integer>();
		String twoChar = "";
        String threeChar = "";
		
		HashMap<Character, Integer> termsType = new HashMap<Character, Integer>();
	
		for(int i=0; i<terms.length; i++) {// 해쉬맵에 terms의 타입에 정보 저장기간을 저장
			if(terms[i].length() == 3) { // 저장기간이 한 자릿수일 때
		    termsType.put(terms[i].charAt(0), Integer.valueOf(terms[i].charAt(terms[i].length()-1)) - '0');
			}
		    else if(terms[i].length() == 4) { // 저장기간이 두 자릿수일 때
				twoChar = String.valueOf(terms[i].charAt(terms[i].length()-2))
                + String.valueOf(terms[i].charAt(terms[i].length()-1));
				termsType.put(terms[i].charAt(0), Integer.valueOf(twoChar));
			}
			else { // 저장기간이 세 자릿수일 때
				threeChar = String.valueOf(terms[i].charAt(terms[i].length()-3))
                + String.valueOf(terms[i].charAt(terms[i].length()-2))
                + String.valueOf(terms[i].charAt(terms[i].length()-1));
				termsType.put(terms[i].charAt(0), Integer.valueOf(threeChar));
			}
		}

		for(int i=0; i<privacies.length; i++) { // privacies 날짜와 타입 쪼개기
		String[] privaciesDate = privacies[i].split("[.]"); // split은 구분자로 .을 쓸려면 []안에 넣고 써야된다.
		String[] privaciesDateEndPart = privaciesDate[2].split(" ");
		char privaciesTermsType = privaciesDateEndPart[1].charAt(0); // privacies요소 마지막에 있는 알파벳 타입 저장

		int year = Integer.valueOf(privaciesDate[0]);
		int month = Integer.valueOf(privaciesDate[1]);
		int day = Integer.valueOf(privaciesDateEndPart[0]);
		
		String[] todayDate = today.split("[.]");
	    int todayYear = Integer.valueOf(todayDate[0]);
	    int todayMonth = Integer.valueOf(todayDate[1]);
	    int todayDay = Integer.valueOf(todayDate[2]);
	    System.out.println("오늘 날짜 : "+todayYear + " / " + todayMonth + " / " + todayDay);
		
		for (Character key: termsType.keySet()){ // 해쉬 맵 키 사용, 모든 키와 값 비교 후 같으면 날짜 계산
		
		    if(privaciesTermsType == key) { // 같은 유형이면 날짜 계산해주고 오늘 날짜와 비교
		    	month += termsType.get(key);
		    	day -= 1;
		    	
		    	if(month > 12) {
		    		if(month % 12 != 0) {
		    		int monthShare = month / 12;
		    		int monthRest = month % 12;
		    		year += monthShare;
		    		month = monthRest;
		    		}
		    		else if(month % 12 == 0) {
		    	    int countTwelve = (month / 12)-1;
		    	    year += countTwelve;
		    	    month -= 12 * countTwelve;
		    		}
		    	}
		    	if(day < 1) {
		    		month -= 1;
		    		day = 28;
		    	}
		    	System.out.println("보관 날짜 : "+ year + " / " + month + " / " + day);
		    	
		    	int count = 0;
			    if(year < todayYear) count = i+1;
			    else if(year == todayYear && month < todayMonth) count = i+1;
			    else if(year == todayYear && month == todayMonth && day < todayDay) count = i+1;
			    
			    if(count > 0) list.add(count);
		    }
		}
	}
		int[] answer = list.stream().mapToInt(i -> i).toArray(); // Integer 리스트를 int 배열로 바꾸는 방법
                                                                 // String은 그냥 list.toArryay() 쓰면 됨
		return answer;
	}
}

 

다른 사람 풀이

 

연 / 월 / 일의 달력의 형태가 아닌 연과 월을 다 일수로 만들어서 현재 날짜와 비교한게 인상적이다.

package chapter_01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

class Solution {
	public int[] solution(String today, String[] terms, String[] privacies) {
		List<Integer> answer = new ArrayList<>(); // 가변 크기의 List
		Map<String, Integer> termMap = new HashMap<>();
		int date = getDate(today); // 날짜를 연, 월, 일로 나누어주고 전부 일로 합산해서 int로 돌려주는 메서드

		for (String s : terms) {
			String[] term = s.split(" "); // 저장유형과 저장기간을 분리
			termMap.put(term[0], Integer.parseInt(term[1])); // 저장유형에 저장기간 삽입
		}
		System.out.println(termMap);
		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(); // List를 배열로 변환
	}

	private int getDate(String today) {
		String[] date = today.split("\\."); // .을 구분자로 쓰려면 [.] or \\. 사용
		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; // year과 month를 전부 day와 똑같은 수치로 만들어주고 리턴
	}
}

댓글