본문 바로가기
코딩테스트/문제풀이 팁

[Kakao] "년/월/일" 날짜 문제 "일"로 모두 환산하기

by asdft 2024. 3. 14.

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

 

프로그래머스

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

programmers.co.kr

 

먼저 이 문제를 풀기 위해서 생각한 점은,

1. terms(약관)에 저장된 값을 key-value의 형태로 map에 저장해 key(A)값을 이용해서 value(6)인 유효기간을 가져온다.

2. 년/월/일의 형식을 지키려면 복잡하고 배열공간도 많이 요구되므로 "년/월/일" -> "일" 로 환산해서 계산한다.

3. 문자열을 마침표('.')로 구분하여 자르기 위해 str.split(".")을 이용할 경우 빈 배열이 반환된다. str.split("[.]") 사용한다.

 

 

str.split(".");

split() 메소드는 파라미터로 정규식을 입력 받는데,

정규식에서 마침표(.)는 임의의 한 문자를 의미합니다. 

 

따라서, 문자열을 마침표(.)로 구분하고 싶다면 아래와 같은 방법을 사용해야 합니다.

import java.util.Arrays; public class SplitWithDot {   
  public static void main(String[] args) {                
	String str = "a.b.c";         

	String[] strArr1 = str.split("[.]");        
	String[] strArr2 = str.split("\\.");         
			
        System.out.println(Arrays.toString(strArr1));  // [a, b, c]        
	System.out.println(Arrays.toString(strArr2));  // [a, b, c]    
	}
}

 

 

import java.util.*;
class Solution {
    public List<Integer> solution(String today, String[] terms, String[] privacies) {
        List<Integer> answer = new ArrayList<>();
        HashMap<String,Integer> map = new HashMap<>();
        
        // 1. 오늘 날짜 기준으로 년,월,일을 모두 하나로 더함. 꼭 년/월/일 형식을 지키지 않아도 됨!!
        String[] td = today.split("[.]");
        int privacyDate = (Integer.parseInt(td[0])*12*28) + (Integer.parseInt(td[1])*28)
                                + Integer.parseInt(td[2]);
        
        // 2. map으로 terms를 keu-value 형태로 저장
        for(String t : terms){
            String[] tm = t.split(" ");
            map.put(tm[0],Integer.parseInt(tm[1]));
        }
        
        for(int i=0;i<privacies.length;i++){
            String[] priv = privacies[i].split(" ");	//priv[0] : 날짜 , priv[1] : 약관종류
            
            String[] prDate = priv[0].split("[.]");     // 수집된 날짜 .로 split
            String term = priv[1];                      //String타입 약관
            
            int deadLine = (Integer.parseInt(prDate[0])*12*28) + (Integer.parseInt(prDate[1])*28)
                                + Integer.parseInt(prDate[2]) + (map.get(term)*28);        // 가입날짜 + 약관 유효기간(map)
                
            if(privacyDate >= deadLine){ //약관유효기간(deadLine)이 현재날짜(privacyDate)보다 작거나 같으면 개인정보 파기
                answer.add(i+1);
            }
        }
        return answer;
        //return answer.stream().mapToInt(integer -> integer).toArray(); -> 반환타입을 int[]로 할 경우
    }
}

 

출처: https://hianna.tistory.com/618 [어제 오늘 내일:티스토리]