(Java) 프로그래머스 - 개인정보 수집 유효기간

2023. 4. 25. 00:03·코딩 테스트

카카오 문제치고 쉬운 문제였다.

인풋 값도 적어서 시간 초과를 생각하지 않고 편한 마음으로 풀었다.

Date와 SimpleDateFormat를 이용해서 계산하는 방법도 생각했지만

그냥 계산하는게 더 간단해 보여서 사용하지는 않았다.


로직

먼저 terms 배열을 순회하며 map에 약관종류와 유효기간을 넣어준다.

그리고 privacies를 순회하며 약관 종류에 맞는 유효기간을 가져와 cal 메서드를 호출한다.

유효기간이 1이 될 때까지 날짜를 계산하여 년월일을 일자로 바꾸어 현재 날짜와 비교한다.

cal 메서드의 반환값이 false이면 list에 추가하고 모든 순회가 끝나면 stream을 이용해 배열로 변환한다.

 

 

최종 코드

import java.util.*;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
        int[] answer = {};
        
        // 유효기간을 담을 map
        Map<String, Integer> map = new HashMap<>();
        // 파기해야할 정보를 담을 list
        List<Integer> list = new ArrayList<>();
        
        // terms을 순회하며 map에 삽입
        for(String s : terms) {
            String[] temp = s.split(" ");
            map.put(temp[0], Integer.parseInt(temp[1]) * 28);
        }
        
        // privacies를 순회하며 cal()메서드 호출
        for(int i = 0; i < privacies.length; i++) {
            String[] pSplit = privacies[i].split(" ");
            int valid = map.get(pSplit[1]);
            if(cal(pSplit[0], valid, today)) {
                list.add(i + 1);
            }
        }
        
        answer = list.stream().mapToInt(Integer::intValue).toArray();
        return answer;
    }
    
    // 날짜 계산 메서드
    public boolean cal(String date, int valid, String today) {
        int[] dateSplit = Arrays.stream(date.split("\\.")).mapToInt(Integer::parseInt).toArray();
        int[] todaySplit = Arrays.stream(today.split("\\.")).mapToInt(Integer::parseInt).toArray();
        
        // valid가 1이 될떄까지 유효날짜 계산
        while(valid > 1) {
            dateSplit[2]++;
            valid--;
            
            if(dateSplit[2] > 28) {
                dateSplit[2] = 1;
                dateSplit[1]++;
            }
            
            if(dateSplit[1] > 12) {
                dateSplit[1] = 1;
                dateSplit[0]++;
            }
        }
        
        // 계산한 유효날짜와 현재 날짜를 일수로 바꿔 비교
        int todayResult = todaySplit[0] * 12 * 28 + todaySplit[1] * 28 + todaySplit[2];
        int dateResult = dateSplit[0] * 12 * 28 + dateSplit[1] * 28 + dateSplit[2];
        
        // 계산한 유효날짜가 현재 날짜보다 크거나 같으면 false 리턴
        if(dateResult >= todayResult) {
            return false;
        }
        
        return true;
    }
}
저작자표시 (새창열림)

'코딩 테스트' 카테고리의 다른 글

(Java) 프로그래머스 - 연속 부분 수열 합의 개수  (0) 2023.04.28
(Java) 프로그래머스 - 공원 산책  (0) 2023.04.26
(Java) 백준 15652 - N과 M (4)  (0) 2023.02.17
(Java) 프로그래머스 - 둘만의 암호  (0) 2023.02.16
(Java) 프로그래머스 - 카드 뭉치  (0) 2023.02.16
'코딩 테스트' 카테고리의 다른 글
  • (Java) 프로그래머스 - 연속 부분 수열 합의 개수
  • (Java) 프로그래머스 - 공원 산책
  • (Java) 백준 15652 - N과 M (4)
  • (Java) 프로그래머스 - 둘만의 암호
로승리
로승리
  • 로승리
    Roy's Blog
    로승리
  • 전체
    오늘
    어제
    • 분류 전체보기
      • Issuefy
      • Language
      • Spring
      • Database
      • Network
      • Kubernetes
      • AWS
      • 코드스쿼드
      • 코딩 테스트
      • 생각정리
      • 국비지원
      • 회고
      • 컨퍼런스, 세미나
  • 블로그 메뉴

    • 홈
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
로승리
(Java) 프로그래머스 - 개인정보 수집 유효기간
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.