Algorithm
<내풀이>
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 찍어놓은 걸 발견하지 못해 시간이 오래 나왔는데 지우고 다시하니 빠르게 나왔다.
물론 식 계산이 하드 코딩인 부분은 있다.
Map
에 terms
들을 유형별로 모아놓은 뒤 privacies
를 반복문을 돌려 하나씩 비교 해 나갔다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;
}
비록 시간은 조금 더 걸리게 나와도 유의미한 차이까진 아니고 더 깔끔한 코드를 볼 수 있다
split
과 map
으로 today
의 년월일을 변수 year``month``date
에number
로 집어넣는다.t
객체에 terms
를 반복문을 돌려 객체에 유형별로 넣는다privacies
를 반복문 돌려 날짜와 유형(term)을 분리하고 날짜는 또 today
와 같은 형식으로 분리한다privacies
의 날짜의 모든 합에 유형(term)의 개월 수 합(월로 계산하니 * 28
)을 도출해 내서 today
의 합과 비교한다CS
검색엔진이 이해하기 쉡도록 홈페이지 구조와 페이지를 개발해 검색 결과 상위에 노출 될 수 있도록 하는 작업이다
기본적으로 특정 검색어를 웹 페이지에 적절하게 배치하고 다른 웹 페이지에서 링크가 많이 연결되도록 하는 것
<title>
태그에는 사이트 제목, <div>
태그를 사용해 줄을 바꾸고, <strong>
과 <em>
태그를활용해 강조하고 싶은 키워드에 붙이는 등 적절한 HTML 소스로 홈페이지를 구성하는 것은 결과적으로 검색엔진에게도 이해하기 쉬운 웹 문서가 된다.이미지에 alt 속성 기재
<img>
태그에 alt 속성을 넣어 적절한 대체 텍스트를 기재하자. alt속성을 붙이면 코딩 유용성 측면에서도 좋고 시각 장애인용 스크린 리더가 사용될 때 이미지 대신 alt속성 값을 읽어 대략 어떤 이미지인지 파악할 수 있도록 도움을 준다.
검색엔진 또한 이미지를 발견하면 alt속성 안의 텍스트를 통해 인덱싱 작업을 하기 때문에 SEO에 좋다.
이미지 맵에 중요한 링크 사용 피하기
이미지 맵은 <map>
태그와 <area>
태그를 이용해 한 장의 사진에 여러개의 링크를 설치하는 것. 이미지 맵은 검색엔진이 링크를 따라 이동할 때 발해될 수 있으므로, 중요한 링크 설치는 피하자
플래시 전용 페이지 피하기
대부분 검색엔진은 Flash 애니메이션의 텍스트를 수집할 수 없고 그 링크 또한 사용X
anchor 태그를 활용한 적절한 키워드 배치
키워드가 본문에 기술되어 있지 않은 홈페이지는 검색 결과에 랭크되기 어렵다.
앵커 텍스트란, 홈페이지에 삽입되는 링크 위에 있는 설명 문구(text)를 의미
여러개의 페이지로 나누어진 콘텐츠 검색 최적화 - 시리즈/연재
시리즈 및 연재 등과 같이 한 주제로 글이 길어질 경우, 동일 제목을 가진 콘텐츠를 여러 페이지로 나누어 만들게 됨. 이때 해당 페이지를 검색엔진에게 잘 알리기 위해 다음과 같은 방법을 사용한다.
모든 페이지가 유입 페이지가 되도록 사이트 구성
사용자가 꼭 홈페이지의 메인 페이지만 방문하는 것은 아니다. 가령 Google에서 키워드나 내용으로 검색하면, 검색 결과에는 원하는 정보가 있는 콘텐츠 페이지가 나타나고, 클릭하면 해당 페이지로 유입된다.
홈페이지 내 어떤 페이지로 방문이 유입될지 모르기 때문에 모든 페이지에는 메인 페이지로 이동할 수 있는 링크를 설치해 전체 사이트의 '동선'을 개선하는 것이 무엇보다 중요!
HTTPS 사용권장
동일 사이트라면 http로 서비스 하는 것보다, https로 서비스 할 경우 구글 검색엔진에서 전체 점수의 약 1% 정도에 해당하는 랭킹 가산점을 부여한다.
UTF-8을 이해하기 위해 UNICODE를 먼저 살펴보자.
전 세계의 모든 문자를 컴퓨터에 일관되게 표현하고 다룰 수 있도록 설계된 산업표준.
이것을 규율하는 단체는 유니코드 콘소시엄이라 한다. 전 세계의 모든 문자를 담는 ISO/IEC 10646 코드표를 사용함으로써, 각 언어와 문자체계에 따른 충돌 문제를 해결하였다.
따라서 유니코드를 사용하면 한글과 신자체 간자체, 아랍문자 등을 통일된 환경에서 깨뜨리지 않고 사용할 수 있다.
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으로 시작하는 원칙을 따른다. 이것은 한 문자를 표현하는 바이트들이 다른 문자의 것으로 혼동되는 것을 막기위한 방법