알고리즘

프로그래머스 LV.1 개인정보 수집 유효기간 스위프트

Thor_yeom 2023. 5. 22. 12:15

오늘은 2023 카카오 블라인드 코테 문제였던 것을 풀어보겠습니다

확실히 정답률이 낮네요... ㅎㅎ

 

자 그럼 시작하겠습니다.

 

지문을 읽어보면 중요한 부분이 있습니다.

 

즉 , if 현재 날짜 > 유효기간 날짜  {

     파기

}

예시 1) 현재 날짜 ( 2022.05.19 ) > 유효기간 날짜 ( 2021년 11월 1일 ) ? 파기  : 파기 안함  => 파기
예시 2) 현재 날짜 ( 2022.05.19 ) > 유효기간 날짜 ( 2022년 6월 28일 ) ? 파기  : 파기 안함 => 파기 안함
예시 3) 현재 날짜 ( 2022.05.19 ) > 유효기간 날짜 ( 2022년 5월 18일 ) ?  파기  : 파기 안함 => 파기 
예시 4) 현재 날짜 ( 2022.05.19 ) > 유효기간 날짜 ( 2022년 5월 19일 ) ? 파기 : 파기 안함  => 파기 안함 

자 이런 식으로 계산이 된다는 겁니다

흠... 일단 큰틀은 어떻게 진행되는지 알겠군요

 

자 그러면 코드를 통해 하나씩 해결해 봅시다.

 

이 문제는 String보다 배열이 활용범위가 더 넓기 때문에 배열로 만들어줍니다.

// today의 String을 배열로 만들어줌  .을 기준으로 배열을 만들고 Int로 형 변환시킴
var todayTime = today.components(separator:".").map{Int($0)!}

// todayTime: [2022, 05, 19]

 

자 그리고 terms를 보면
A(String) 일때 6(Int)

B(String) 일때 12(Int)

C(String) 일때 3(Int)

 

이런 구조로 되어있습니다. key와 value 값으로 나타내면 좋을거같습니다.

// 빈 딕셔너리 만들기
var dict: [String:Int] = [:]

// terms를 for문으로 돌리면서 하나씩 뽑아오기 
for i in 0..<terms.count {
	// 뽑아온 것을 "(띄어쓰기)" 기준으로 배열 만들고, ["A", "6"]
	var array = terms[i].components(separateBy: " ")
    // ["A", "6"]의 0번째를 key로 1번째를 value로 설정하여 딕셔너리를 만든다.
    dict[array[0]] = Int(array[1])
}

// dict: ["B": 12, "A": 6, "C": 3]

여기까지는 참 쉽죠?

 

큰틀로 봤을때 

 

자 그럼 todayterms를 만들었고, 

1) dict의 key가 privacies에 포함되어 있으면  value를 더하기

 

2) 파기 조건에 맞게 설정 

 

3) 더해진 유효기간을 today와 비교

 

4) 파기 라면 privacies의 인덱스 + 1

 

 

 

자 그렇다면 privacies도 똑같이 배열로 만들어 봅시다 .

 

자 어떻게 만들면 좋을까요? 

한번 생각해보시길...

뭘 어떻게 만들어 위에서 만든거하고 똑같이 만들면 되지 

 

그럼 만들어 보겠습니다.

// 변수에 할당합니다. 
var priv = privacies

// privacies의 요소를 하나씩 뽑아서 쓰기 위해 for문을 만들어줍니다.
for j in 0..<priv.count {

	// 위에서 만들었던 방법하고 똑같습니다. "2021.05.02 A" => ["2021.05.02", "A"]으로 만들어줍니다.
	var arrays = priv[j].components(separateBy: " ")
    
    // 사용해야 하는 부분은 "2021.05.02" 이므로 이것또한 components를 사용합니다. 
    // arrays = ["2021.05.02", "A"]
    // "2021.05.02" => [2021, 05, 02]
    var date = arrays[0].components(separateBy: ".")
    // dict에서 만들었던 값을 활용하여 day에 할당합니다.
    var day = dict[arrays[1]]!
}

 

day부분을 조금 더 보자면

dict: ["B": 12, "A": 6, "C": 3]

이렇게 되어 있습니다. 

 

for j in~ 구문에서 arrays가 만들어지고

arrays[0]은 숫자 , arrays[1]은 문자로 나뉘어 집니다. 

 

 arrays[1]을 사용하여 dict의 key값과 비교하여 value를 뽑아냅니다. 

간단한 예제를 하나 들어보겠습니다.

var exampleDict = ["B": "끝난게", "A": "끝날때 까지", "C": "아니다"]
var exampelArray = ["A", "B", "C"]

var result: String = ""

for i in 0..<exampelArray.count {
	var count = exampleDict[exampleArray[i]] 
    result += count
}

// "끝날때 까지 끝난게 아니다"

 

자 그렇다면 만들어진 

day를 date에 더해볼까요?

// 변수에 할당합니다. 
var priv = privacies

// privacies의 요소를 하나씩 뽑아서 쓰기 위해 for문을 만들어줍니다.
for j in 0..<priv.count {

	// 위에서 만들었던 방법하고 똑같습니다. "2021.05.02 A" => ["2021.05.02", "A"]으로 만들어줍니다.
	var arrays = priv[j].components(separateBy: " ")
    
    // 사용해야 하는 부분은 "2021.05.02" 이므로 이것또한 components를 사용합니다. 
    // arrays = ["2021.05.02", "A"]
    // "2021.05.02" => [2021, 05, 02]
    var date = arrays[0].components(separateBy: ".")
    // dict에서 만들었던 값을 활용하여 day에 할당합니다.
    var day = dict[arrays[1]]!
    
    // date = [2021, 05, 02]
    // 여기서 date[1]은 달을 나타남
    date[1] = date[1] + day
    
    // date = [2021, 11, 02]
    
    // 조건문을 통해 설정해주기
}

 

여기까지는 이해가 안되는 부분은 없겠죠? ㅎㅎ

만약있다면 댓글 남겨주세요 

 

1) dict의 key가 privacies에 포함되어 있으면  value를 더하기

 

2) 파기 조건에 맞게 설정 

 

3) 더해진 유효기간을 today와 비교

 

4) 파기 라면 privacies의 인덱스 + 1

 

 

자 이제 2번째 사항을 해볼건데요

파기 조건을 만들어 봅시다. 여기서 포인트는 

 

1. month이 12를 넘어가게 되면
1) year에 month/12만큼 올려준다.
2) month에 month%12만큼 한다.

    2.month이 12를 넘어가고, == 12가 된다면 
         1) year에 month/12만큼 올려주고, -1를 한다. 
    3. month이 12를 넘어가고, != 12가 된다면 
         1) year에 month/12만큼 올려준다
2. while문을 돌려서 -12만큼 해준다.

 

// 변수에 할당합니다. 
var priv = privacies

// privacies의 요소를 하나씩 뽑아서 쓰기 위해 for문을 만들어줍니다.
for j in 0..<priv.count {

	// 위에서 만들었던 방법하고 똑같습니다. "2021.05.02 A" => ["2021.05.02", "A"]으로 만들어줍니다.
	var arrays = priv[j].components(separateBy: " ")
    
    // 사용해야 하는 부분은 "2021.05.02" 이므로 이것또한 components를 사용합니다. 
    // arrays = ["2021.05.02", "A"]
    // "2021.05.02" => [2021, 05, 02]
    var date = arrays[0].components(separateBy: ".")
    // dict에서 만들었던 값을 활용하여 day에 할당합니다.
    var day = dict[arrays[1]]!
    
    // date = [2021, 05, 02]
    // 여기서 date[1]은 달을 나타남
    date[1] = date[1] + day
    
    // date = [2021, 11, 02]
    
    // date[1]을 12보다 큰 경우
    if date[1] > 12 {
    	// date[1]이 12보다 큰데 12로 나누어 떨어지는경우 ex) date[1] = 24, 36,48 ...
        if date[1] % 12 == 0 {
        	// -1를 해준다!
        	date[0] = (date[0] + date[1]/12) -1
        // date[1]이 12보다 큰데 12로 나누어 떨어지 않는경우 
        } else {
        	date[0] = (date[0] + date[1]/12)
        }
        // date[1]이 12보다 클 경우 while문을 사용해서 -12씩 해준다
        while date[1] > 12 {
        	date[1] = date[1] - 12
        }
    }
    
    // date[1] == 12일 경우는 그 값을 그대로 쓰면 되기 때문에 조건을 적지 않는다.
    // ex) date = [2021.12.01] 일때 해당 date를 사용
}

 

여기서 중요 포인트는 이 부분 입니다.

 

date[0] = (date[0] + date[1]/12)에서

-1을 해주는가?

 

 

풀이를 해보면 

date[1] = date[1] + day

if문을 타면서 이렇게 플로우가 됩니다. 

 

ex) 

date = [2020, 24, 01]

date[1] == 24 일때 가정해봅시다. 

    // date[1] == 24
    if date[1] > 12 {
    	// date[1]이 12보다 큰데 12로 나누어 떨어지는경우 ex) date[1] = 24, 36,48 ...
        if date[1] % 12 == 0 {
        	// -1를 해준다!
        	date[0] = (date[0] + date[1]/12) -1
        // date[1]이 12보다 큰데 12로 나누어 떨어지 않는경우 
        } else {
        	date[0] = (date[0] + date[1]/12)
        }
        // date[1]이 12보다 클 경우 while문을 사용해서 -12씩 해준다
        while date[1] > 12 {
        	date[1] = date[1] - 12
        }
    }

1) date[1] % 12 == 0 조건문

if date[1] % 12 == 0 조건문을 먼저 타면서
date[0] = (2020 + 2)-1 를 해줍니다.  ==> date[0] = 2021이 되죠

 

2) while문

date[1] > 12보다 크기 때문에 
while문이 실행 됩니다.
date[1] = date[1] - 12 가 실행되어 ==> date[1] = 12가 됩니다. 

그러면 while문은 더이상 실행되지 않습니다.

 

3) 결과 

date = 2021.12.01 이렇게 만들어져야 최종 결과물입니다. 

 

 

첫번째 조건문  if date[1] % 12 == 0 에서 실행문에 -1을 해주는 이유가 여기에 있습니다.

만약 -1이 없다면 어떻게 될까요??

if date[1] % 12 == 0 조건문을 먼저 타면서
date[0] = (2020 + 2)를 해줍니다.  ==> date[0] = 2022이 되죠

그렇게 되면 결과물 또한 달라지게 됩니다.

 

1) dict의 key가 privacies에 포함되어 있으면  value를 더하기

 

2) 파기 조건에 맞게 설정 

 

3) 더해진 유효기간을 today와 비교

 

4) 파기 라면 privacies의 인덱스 + 1

 

 

자 이제 그럼 3번과 4번을 같이 해결해 보겠습니다.

 

저희가 만들어낸

todayTime = [2020.01.01] 과 date해당 데이트의 인덱스 끼리 비교

 

현재 for j in 0..<priv.count 구문 안에 있기 때문에

if문으로 분기 처리하여 진행하였습니다.

 

일단 0번째 인덱스 끼리 비교합니다. 

1) 만약 0번째 인덱스끼리 같으면  1번째 인덱스 끼리 비교하고

2) 1번째 인덱스끼리 같으면 2번째 인덱스를 비교합니다.

 

흠... 뭔가 타고 타고 하는게 재밌네요 ㅎㅎ

// 결과물을 담을 수있는 배열 
var reuslt: [Int] = []

// 현재 priv.count for문 안에 있음 

// 유효기간 보다 todayTime이 크다면
if date[0] < todayTime[0] {
	result.append(j + 1)
    // date[0] == todayTime[0] 같은 경우 일때는 1번째 인덱스와 비교합니다.
} else if date[0] == todayTime[0] {
	if date[1] < todayTime[1] {
    	result.append(j + 1)
    	}
    // date[1] == todayTime[1] 같은 경우 일때는 2번째 인덱스와 비교합니다.
	}  else if date[1] == todayTime[1] {
    	if date[2] < todayTime[2] {
    	result.append(j + 1)
    	}
    }

 

자 이제 드디어 해치웠습니다. 

긴 시간 포스팅 봐주셔서 감사합니다. 

 

혹시 이해가 안되는 부분 있으면 댓글 부탁드립니다!

 

1) dict의 key가 privacies에 포함되어 있으면  value를 더하기

 

2) 파기 조건에 맞게 설정 

 

3) 더해진 유효기간을 today와 비교

 

4) 파기 라면 privacies의 인덱스 + 1

 

 

최종코드입니다.

import Foundation
 func solution(_ today:String, _ terms:[String], _ privacies:[String]) -> [Int] {
     
     var today = today.components(separatedBy: ".").map { Int(String($0))! }
     var dict = [String:Int]()
     
     for i in 0..<terms.count {
         var arrs = terms[i].components(separatedBy: " ")
         dict[arrs[0]] = Int(arrs[1])
     }
     
     var reuslt: [Int] = []

     for j in 0..<privacies.count {
         
         var arr = privacies[j].components(separatedBy: " ")
         var date = arr[0].components(separatedBy: ".").map { Int(String($0))! }
         var term = dict[arr[1]]!
         
         
         
         date[1] = date[1] + term
         
         if date[1] > 12 {
            if date[1] % 12 == 0 {
                date[0] = (date[0] + date[1] / 12) - 1
            } else {
                date[0] = date[0] + date[1] / 12
            }
            while date[1] > 12 {
                date[1] -= 12
            }
        }

         if date[0] < today[0] {
             reuslt.append(j+1)
         } else if date[0] == today[0] {
             if date[1] < today[1] {
                 reuslt.append(j+1)
             } else if date[1] == today[1] {
                 if date[2] < today[2] {
                     reuslt.append(j+1)
                 }  else if date[2] == today[2] {
                        reuslt.append(j+1)
                    }
             }
         }
     }

     return reuslt
 }