개인정보 수집 유효기간

김민준·2024년 1월 12일

코드테스트

목록 보기
26/37

개인정보 수집 유효기간

한달을 28일로 윤년이 없는 다루기 쉬운조건을 준거보면 뭔가 빡센 문제일지도 모르겠다 ㄷㄷ

일단 약관은 일단위로 보관되니까 하루마다 이런 알고리즘을 짜놓고 돌리는게 아닐까?

나의 풀이

일단 방법이 두가지 있을 것같다.
1. 자바스크립트의 내장 날짜를 쓰기
2. 월을 28일 , 연을 336(28*12)로 두고 계산하기

2번으로 가보자.

다 좋은데 terms도 privacies도 배열안에 배열 또는 key-value가 들어 있지 않고 "A 6"이런식으로 들어 있어서 이것을 어떻게 key-value 또는 배열안의 배열로 나누느냐가 관건일것같다.

생각한대로 나오긴하는데 보나마자 약관이 AAA 이런식으로 1자리수가 아닌 테스트케이스가 섞여있을 확률이 120% 정도 되기 때문에 다른 방법으로 나눠야할것같다.

.split(" ")(따옴표 사이에 공백 잊지말 것)으로 해보니 원하는 것과 비슷하게 나온다.

key-value 오브젝트를 사용해본적이 없어서 한번에 안들어가는데서 좀 놀랬다.
아무튼 원하는데로 terms를 고쳤으니 privacies도 해보자

Object.keys(또는 values)로 값을 불러온 뒤에는 [0]를 붙이자.

function sol0(today, terms, privacies) {
    const answer = [];
    const lengthTerms = terms.length;
    const lengthPrivacies = privacies.length;
    
    const todayParts = today.split(".")
    const newToday = (parseInt(todayParts[0])-1)*12*28+(parseInt(todayParts[1])-1)*28+parseInt(todayParts[2])
    
    const newTerms = []
    const newPrivacies = []
         
    for (let i = 0; i < lengthTerms; i++) {
        const termParts = terms[i].split(" ");
        const termObject = {};
        termObject[termParts[0]] = parseInt(termParts[1])*28;
        newTerms.push(termObject);
    }
    
    for (let i = 0 ; i < lengthPrivacies ; i++) {
        const date = privacies[i].split(".")
        const day = parseInt(date[2].split(" ")[0])
        const termNow = date[2].split(" ")[1]
      
        let plusDate = 0
        
        for (let j = 0 ; j < lengthTerms ; j++){
            const key = Object.keys(newTerms[j])[0]
            const value = Object.values(newTerms[j])[0]

            if (termNow === key) {
                plusDate = value
            }
        }
         const expireDate = (parseInt(date[0])-1)*12*28+(parseInt(date[1])-1)*28+day+plusDate
         newPrivacies.push(expireDate)
        

    }
    
    for (let i = 0 ; i < lengthPrivacies ; i++) {
        if (newPrivacies[i] <= newToday){
            answer.push(i+1)
        }
    }
    

    return answer;
}

(년도-1)1228 + (달수-1)*28 + 일수 로 날짜를 치환하여 만료 여부를 판별하는 방식이다.

다른 사람의 풀이

function sol1(today, terms, privacies) {
  var answer = [];
  var [year, month, date] = today.split(".").map(Number);
  var todates = year * 12 * 28 + month * 28 + date;
  var t = {};
  terms.forEach((e) => {
    let [a, b] = e.split(" ");
    t[a] = Number(b);
  });
  privacies.forEach((e, i) => {
    var [day, term] = e.split(" ");
    day = day.split(".").map(Number);
    var dates = day[0] * 12 * 28 + day[1] * 28 + day[2] + t[term] * 28;
    if (dates <= todates) answer.push(i + 1);
  });
  return answer;
}

상대적인 차이만 볼거기 때문에 -1은 필요가 없었던것같다.

function sol2(today, terms, privacies) {
    const map = new Map();
    for (let i = 0; i < terms.length; i++) {
        const [type, term] = terms[i].split(' ');
        map.set(type, term * 28);
    }

    return privacies.reduce((acc, curr, i) => {
        const [date, type] = curr.split(' ');
        const [cy, cm, cd] = date.split('.');
        const [ty, tm, td] = today.split('.');

        const currentDays = +cy * 12 * 28 + +cm * 28 + +cd;
        const todayDays = +ty * 12 * 28 + +tm * 28 + +td;

        if (todayDays - currentDays >= map.get(type)) acc.push(i + 1);
        return acc;
    }, []);
}

split한 결과물을 깔끔하게 정의했다.
그리고 return안에 return이 들어가도 되는거였다.

속도 비교

시간복잡도

terms와 privacies의 길이에 정비례한다.
O(NM)O(N*M)

처리해야할 privacies를 증가시켰을 나의 코드가 제일 많이 증가한다. 심지어 처음 작동시간도 제일 긴데... 내가 효율적으로 짜지 못한것 같다 어디서 느려진걸까?

const key = Object.keys(newTerms[j])[0];
  const value = Object.values(newTerms[j])[0];

아마 위의 부분에서 커다란 객체를 다루기때문에 좋지 못한 결과가 나온것같다.

sol2에 불필요한 반복이 있어서 개선하였다.

//반복문안에 같은 결과를 내는 것이 존재
return privacies.reduce((acc, curr, i) => {
	const [ty, tm, td] = today.split(".");
}

// 반복문 밖으로 내놓음
  const ty = today.split(".")[0];
  const tm = today.split(".")[1];
  const td = today.split(".")[2];

  return privacies.reduce((acc, curr, i) => {

공부하며 느낀 점

  1. 나름 이해하기 쉽게 코드를 짰다고 생각했는데 sol2를 보니까 생각이 확 달라졌다.
    정말 split으로 나온 것들을 직관적으로 매핑해놨다.
  2. key-value형태의 객체는 생각보다 다루기가 어려웠다. 익숙하지 않은 것도 있지만 그냥 불편한것같다.
    차라리 배열안에 배열을 넣는 방식이 편한것같다.
  3. 다뤄야할 데이터의 크기가 클 수 록 필요한 부분만 가져오도록 구현하는 것이 중요하다.
profile
node 개발자

0개의 댓글