6-15 TIL

hoin_lee·2023년 6월 15일
0

TIL

목록 보기
184/236

Algorithm

2023 KAKAO BLIND RECRUITMENT 개인정보 수집 유효기간

<내풀이>

function solution(today, terms, privacies) {
    const result = []
    const map = new Map()
    const todayArr = today.split(".")
    terms.map(v=>{
        const term = v.split(" ")
        map.set(term[0],term[1])
    })
    privacies.map((v,i)=>{
       const ex = map.get(v[v.length-1])
       const date = v.substring(0,v.length-2)
       const dateArr = date.split(".")

       let year = 0
       let month = Number(dateArr[1])+Number(ex)
       if(month>12) {
           year = month%12===0?Math.floor(month/12)-1:Math.floor(month/12)
           month = month%12===0?12:month%12
       }
        dateArr[2] = Number(dateArr[2])-1===0?28:Number(dateArr[2])-1
        dateArr[1] = month
        dateArr[0] = Number(dateArr[0])+year
        if(dateArr[2]===28) {
            if(dateArr[1]-1===0){   
                dateArr[1]=12
                dateArr[0]-=1
            }else dateArr[1] -=1
        }
        for(let j=0; j<=todayArr.length-1; j++) {
            if(Number(todayArr[j])>Number(dateArr[j])){
                result.push(i+1)
                break;
            }else if(Number(todayArr[j])<Number(dateArr[j])){
                break;
            }

        }
    })
    return result;
}

첫 제출 때 깜빡하고 console.log 찍어놓은 걸 발견하지 못해 시간이 오래 나왔는데 지우고 다시하니 빠르게 나왔다.
물론 식 계산이 하드 코딩인 부분은 있다.

  • Mapterms들을 유형별로 모아놓은 뒤 privacies를 반복문을 돌려 하나씩 비교 해 나갔다
  • 이때 년 월 일 계산은 하드코딩 식으로 했는데 각 변화하는 값들을 if나 삼항연산자를 통해 변경 시켜서 계산하였다
  • 마지막엔 today와 년월일 순으로 비교하여 정답 도출

제일 추천을 많이 받은 다른사람 식을 살펴보자

function solution(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;
}

비록 시간은 조금 더 걸리게 나와도 유의미한 차이까진 아니고 더 깔끔한 코드를 볼 수 있다

  • 배열에 splitmap으로 today의 년월일을 변수 year``month``datenumber로 집어넣는다.
  • 일수의 모든 합을 구한다(조건대로 년도 월, 일 모두 합한값)
  • t객체에 terms를 반복문을 돌려 객체에 유형별로 넣는다
  • privacies를 반복문 돌려 날짜와 유형(term)을 분리하고 날짜는 또 today와 같은 형식으로 분리한다
  • 이후 privacies의 날짜의 모든 합에 유형(term)의 개월 수 합(월로 계산하니 * 28)을 도출해 내서 today의 합과 비교한다

CS

SEO 최적화란?

검색엔진이 이해하기 쉡도록 홈페이지 구조와 페이지를 개발해 검색 결과 상위에 노출 될 수 있도록 하는 작업이다
기본적으로 특정 검색어를 웹 페이지에 적절하게 배치하고 다른 웹 페이지에서 링크가 많이 연결되도록 하는 것

구글 상위 랭크 방법

  1. 문법에 맞는 HTML 작성
    <title>태그에는 사이트 제목, <div> 태그를 사용해 줄을 바꾸고, <strong><em>태그를활용해 강조하고 싶은 키워드에 붙이는 등 적절한 HTML 소스로 홈페이지를 구성하는 것은 결과적으로 검색엔진에게도 이해하기 쉬운 웹 문서가 된다.
  2. 구체적인 페이지 제목 만들기
    HTML 문서의 헤더에 들어가는 페이지 제목(title)은 구체적이고 간결하게 구성해, 검색 결과 화면에서 텍스트가 잘리지 않도록 한다.
  • 유인 키워드 반복 삼가 ex)cafe,ca fe, 카페 , 카 페 등
  • 반복적이고 틀에 박힌 제목 삼가
  • 제목의 시작이나 끝에 사이트 이름을 포함하고 나머지 제목은 하이픈(-),콜론(:),막대(|)
    ex) 가비아 - 도메인등록, 도메인연장, 도메인이전, 도메인예약, 부가서비스
  1. 메타 태그 활용하기
    최근 알고리즘 평가 대상에서 제외하고 있지만 검색엔진의 검색 결과에도 표시되고 있기에 포함하는 것이 좋을 수 있다.
    [구글 추천 작성법]
  • 웹 사이트 내 모든 페이지에 동일한 내용을 적용할 경우 효과X
  • 각 페이지의 내용을 전체적으로 요약해 서술한 내용을 넣는 것이 좋음
  • 해당 페이지의 제목(title)과 중복되는 정보는 제외하는 것이 좋음
  • 페이지가 많은 홈페이지의 경우, 최대한 잘 읽히고 스팸으로 구분되지 않게 구성해야함
  • 모든 페이지를 작성할 수 없는 상황이라면, 홈페이지 내 각 페이지에 우선수위를 두어 주요 페이지들만 작성
  1. 이미지에 alt 속성 기재
    <img>태그에 alt 속성을 넣어 적절한 대체 텍스트를 기재하자. alt속성을 붙이면 코딩 유용성 측면에서도 좋고 시각 장애인용 스크린 리더가 사용될 때 이미지 대신 alt속성 값을 읽어 대략 어떤 이미지인지 파악할 수 있도록 도움을 준다.
    검색엔진 또한 이미지를 발견하면 alt속성 안의 텍스트를 통해 인덱싱 작업을 하기 때문에 SEO에 좋다.

  2. 이미지 맵에 중요한 링크 사용 피하기
    이미지 맵은 <map>태그와 <area>태그를 이용해 한 장의 사진에 여러개의 링크를 설치하는 것. 이미지 맵은 검색엔진이 링크를 따라 이동할 때 발해될 수 있으므로, 중요한 링크 설치는 피하자

  3. 플래시 전용 페이지 피하기
    대부분 검색엔진은 Flash 애니메이션의 텍스트를 수집할 수 없고 그 링크 또한 사용X

  4. anchor 태그를 활용한 적절한 키워드 배치
    키워드가 본문에 기술되어 있지 않은 홈페이지는 검색 결과에 랭크되기 어렵다.
    앵커 텍스트란, 홈페이지에 삽입되는 링크 위에 있는 설명 문구(text)를 의미

  5. 여러개의 페이지로 나누어진 콘텐츠 검색 최적화 - 시리즈/연재
    시리즈 및 연재 등과 같이 한 주제로 글이 길어질 경우, 동일 제목을 가진 콘텐츠를 여러 페이지로 나누어 만들게 됨. 이때 해당 페이지를 검색엔진에게 잘 알리기 위해 다음과 같은 방법을 사용한다.

  • 전체보기 페이지를 만들어 제공 : 각각의 나누어진 페이지에 rel="canonical"링크를 삽입해 전체보기 페이지를 표시
  • rel="next" 및 rel="prev" 링크로 연재글 사이의 순서를 알림:Google에서는 해당 페이지를 논리적 순서로 처리하여 페이지의 링크 속성을 통합하고 검색자에게 주로 첫번째 페이지를 표시해준다.
  1. 모든 페이지가 유입 페이지가 되도록 사이트 구성
    사용자가 꼭 홈페이지의 메인 페이지만 방문하는 것은 아니다. 가령 Google에서 키워드나 내용으로 검색하면, 검색 결과에는 원하는 정보가 있는 콘텐츠 페이지가 나타나고, 클릭하면 해당 페이지로 유입된다.
    홈페이지 내 어떤 페이지로 방문이 유입될지 모르기 때문에 모든 페이지에는 메인 페이지로 이동할 수 있는 링크를 설치해 전체 사이트의 '동선'을 개선하는 것이 무엇보다 중요!

  2. HTTPS 사용권장
    동일 사이트라면 http로 서비스 하는 것보다, https로 서비스 할 경우 구글 검색엔진에서 전체 점수의 약 1% 정도에 해당하는 랭킹 가산점을 부여한다.



UTF-8이란?

UTF-8을 이해하기 위해 UNICODE를 먼저 살펴보자.

유니코드

전 세계의 모든 문자를 컴퓨터에 일관되게 표현하고 다룰 수 있도록 설계된 산업표준.
이것을 규율하는 단체는 유니코드 콘소시엄이라 한다. 전 세계의 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자체계에 따른 충돌 문제를 해결하였다.
따라서 유니코드를 사용하면 한글과 신자체 간자체, 아랍문자 등을 통일된 환경에서 깨뜨리지 않고 사용할 수 있다.

UTF-8

UTF-8은 유니코드를 위한 가변 길이 문자 인코딩 방식 중 하나로, 켄 톰프슨과 롭 파이크가 만듬
풀네임은 Unicode Transformation Format - 8bit 8의미는 8비트 1바이트를 기준으로 인코딩 한다는 의미

코드 페이지는 65001로, UTF-8로 표현 가능한 길이는 최대 6바이트지만 다른 인코딩과의 호환을 위해 4바이트까지만 사용한다
그래서 한 글자가 1~4바이트 중 하나로 인코딩 될 수 있으며, 1바이트 영역은 아스키 코드와 하위 호환성을 가진다. 아스키 모드의 0~127까지는 UTF-8로 완전히 동일하게 기록된다.
유니코드는 U+10FFFF까지만(10진법으로는 1,114,111) 이용하는데, UTF-8은 아래에 나와 있듯이 가변 바이트 길이를 선언하기 위해 꽤 많은 비트를 잡아먹고도 2,097,151까지 인코딩 할수 있기때문에 4바이트만으로도 충분하고도 남는다.

가변길이 인코딩 한다면?

문자열 집합과 인코딩 형태를 8비트 단위로 한다는 의미를 가지고 있다. 유니코드 한 문자를 나타내기 위해서 1바이트에서 4바이트까지를 사용한다. 그래서 이를 가변 길이 인코딩 방식
0xxxxxxx 첫번째 바이트가 0으로 시작한다면 0 이외의 7비트를 ASCII로 인식한다.

110xxxxx 10xxxxxx 두번째 바이트까지 읽어서 하나의 문자로 표현

1110xxxx 10xxxxxx 10xxxxxx 세번째 바이트까지 읽어서 하나의 문자로 표현

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 네번째 바이트까지 읽어서 하나의 문자로 표현

여기서 UTF-8의 강점은 ASCII방식과 완벽하게 호환된다는 것이다. 첫자리를 0으로 채우고 나머지 7비트를 통하여 ASCII와 일대일로 대응하도록 표현이 가능하다. 2바이트 이상일 때는 첫 바이트의 최상위비트부터 0인 비트까지의 1인 비트의 수가 바이트의 수를 나타낸다. 위에서 설명했듯이 110 이면 1인 비트가 2개이므로 2바이트까지를 하나의 문자로 보는 것이다. 그리고 첫 바이트다음에 나오는 바이트는 10으로 시작하는 원칙을 따른다. 이것은 한 문자를 표현하는 바이트들이 다른 문자의 것으로 혼동되는 것을 막기위한 방법

profile
https://mo-i-programmers.tistory.com/

0개의 댓글