티스토리 뷰

코드카타

 

개인정보 수집 유효기간

 

문제

 

개인정보 수집 일자에서 해당 약관의 유효기간을 더한 시점이 오늘 날짜를 지났다면

해당 개인정보를 파기한다. 파기한 개인정보 번호를 리스트로 출력한다. 

 

 

입출력 예시

 

날짜 연산을 하기 위해선 해당 입력값을 가공할 필요가 있어보인다.

 

 

풀이

class Solution {
    fun solution(today: String, terms: Array<String>, privacies: Array<String>): List<Int> {
    
    	// 오늘의 날짜 문자열을 .을 기준으로 나눠서 정수 리스트로 변환
        val today = today.split(".").map { it.toInt() }
		
        // 약관을 키로 유효기간을 값으로 가지는 맵 생성
        val termsMap = terms.associate {
            val (key, value) = it.split(" ")
            key to value.toInt()
        }
 		
        // 파기할 개인정보 번호 저장할 리스트
        val res = mutableListOf<Int>()
		
        // 개인정보 배열 순회
        // i는 (파기할 약관번호 - 1), p는 수집된 개인정보에 해당한다.
        privacies.forEachIndexed { i, p ->
        
            // 개인정보에서 날짜와 약관 분리하여 추출
            val date = p.substringBefore(" ").split(".").map { it.toInt() }  
            val term = p.substringAfter(" ") 
			
            // 약관 유효기간 불러오기
            val termMonths = termsMap[term] ?: 0 
			
            // 약관 만료 연, 월, 일 계산
            var expireY = date[0] + (date[1] + termMonths) / 12 
            var expireM = (date[1] + termMonths) % 12 
            val expireD = date[2] 
            
            // 만료 월이 0일 경우의 처리
            if (expireM == 0) {
                expireY--;
                expireM= 12;
            }
			
            // 오늘 날짜와 비교하여 만료여부 확인 후 결과 리스트에 추가
            if (expireY < today[0] || 
                (expireY == today[0] && expireM < today[1]) || 
                (expireY == today[0] && expireM == today[1] && expireD <= today[2]) 
            ) res.add(i + 1) // 인덱스는 0번부터 시작
        }

        return res
    }
}

입력받은 데이터를 가공할 수 있는 형태로 처리할 줄 알아야 문제풀이에 접근할 수 있다.

 

 

입력값 가공

val today = today.split(".").map { it.toInt() }

// "2022.05.19" > [2022, 05, 19]

오늘의 날짜는 약관 만료 여부를 확인하기 위해

년, 월, 일로 나눈다음 정수리스트로 변환한다.

 

 

val termsMap = terms.associate {
    val (key, value) = it.split(" ")
    key to value.toInt()
}

// ["A 6", "B 12", "C 3"] > {A=6, B=12, C=3}

약관에 따른 만료일을 가져오기 위해서 terms를 map으로 변환한다.

 

associate 함수는 컬렉션의 각 요소를 변환하여 새로운 맵을 생성한다.

terms의 각 요소마다 key에는 약관을 value에는 유효기간(Int)를 할당한다. 

 

 

개인정보 분리

// p는 "2021.05.02 A"이라 가정

val date = p.substringBefore(" ").split(".").map { it.toInt() }  
val term = p.substringAfter(" ")

//date -> "2021.05.02" > [2021, 05, 02]
//term -> "A"

공백을 기준으로 앞 뒤 문자열을 나눠 

약관 종류와 유효기간에 값을 각 변수에 초기화 한다. 

 

 

키 값 불러오기

val termMonths = termsMap[term] ?: 0

키 값을 불러올 땐 null 처리를 필수적으로 해줘야 한다.

엘비스 연산자를 통해 간단하게 null 처리가 가능하다.

 

해당 구문에서 termsMap[term]값이 null인 경우 0을 반환하는데

풀이에서 키값이 null인 경우는 존재하지 않으므로 오른쪽에 무슨값이 들어가도 상관없다.

 

 

 만료 여부 구하기

if (expireY < today[0] || 
    (expireY == today[0] && expireM < today[1]) || 
    (expireY == today[0] && expireM == today[1] && expireD <= today[2]) 
) res.add(i + 1)

만료일과 오늘날짜를 년, 월, 일 순으로 순서대로 비교해서

오늘날짜가 만료일과 일치하는 시점이거나 지난 시점이라면

res에 파기할 약관 번호를 추가한다.

 

 

테스트 케이스 추가

입력값 〉"2020.12.28", ["A 12", "B 1"], ["2019.01.01 A", "2020.11.28 B"]
기댓값 〉[1, 2]

약관 만료일과 오늘날짜의 '월' 부분이 12로 일치할 때의 테스트케이스를 추가해준다.

 

 

추가된 테스트케이스 처리

// 해당구문에서 date[1] + termMonths이 12일 때 expireM은 0의 값을 가진다.
var expireM = (date[1] + termMonths) % 12

expireM이 0에 해당한다면 expireM을 12로 초기화하고 expireY에서 1을 빼줘야 한다.

 


 

Kotlin 문법 강의 1주차 정리

 

프로그래밍이란?

 

컴퓨터와 소통하여 프로그램을 제작하는 행위이다.

 

컴퓨터 언어는 사람과 컴퓨터간의 소통을 목적으로 만들어졌고

다양한 언어로 소통이 가능하다.

 

특정한 목적에 맞게 사용하기 위해 많은 프로그래밍 언어가 존재한다.

예를 들자면 안드로이드 앱 개발은 Java와 Kotlin이 적합하고,

인공지능 개발 및 데이터 분석에 있어선 Python이 적합하며,

웹 개발에 있어선 JavaScript가 적합하다.

 

 

 

Kotlin이란?

 

간단하게 정리

2019년 구글에서 공식적으로 안드로이드 앱 개발 언어로 채택된 프로그래밍 언어이다.

현재 대부분의 안드로이드 앱 개발은 코틀린으로 진행한다.

 

Java 단점 개선

Kotlin은 Java의 단점을 개선한 언어이다.

자료형 추론 가능, 코드 가독성 향상, 안정적인 null 처리 등이 특징이다.

 

 

 

Android Studio 단축키 정리

 

ctrl + y : 커서가 위치한 라인의 코드를 지운다.

 

ctrl + / : 커서가 위치한 라인의 코드를 주석처리한다.

 

esc : 코드 입력창으로 포커싱을 옮긴다.

 

ctrl + shift + f : 검색창을 활성화 시켜 프로젝트 내부에서

사용중인 단어를 검색해 그 단어의 위치를 탐색할 수 있다.

 

ctrl + s : 작성한 문서의 변경사항을 저장한다.

 

ctrl + c > ctrl + v : 드래그 한 영역의 코드를 복사한 후 붙여넣기 한다.

 

shift + 방향키 : 키보드를 이용해 드래그가 가능하다.

 

Home: 구문 맨 앞으로 이동, End: 구문 맨 뒤로 이동

 

 

 

개인 과제

 

단축키만으로 파일 전체 드래그

ctrl + a < 파일 전체를 드래그 한다 

 

 

6번째 라인의 최상단 또는 최하단 내용 한번에 드래그

: 6번 눌러서 6번째 라인으로 이동

shift + home : 커서 위치에서 구문 맨 앞까지 드래그

shift + end : 커서 위치에서 구문 맨 뒤까지 드래그

 

 

단축키로 드래그, 복사, 붙여넣기

shift + 방향키로 드래그 진행하고,

ctrl + c를 눌러서 복사, ctrl + v를 눌러서 붙여넣기 한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함