[JS] CDT 로 배우는 Javascript 기능과 기술들 [23.0]

김현수·2023년 11월 13일
0

cdt

목록 보기
24/51


📰 Coding Test 에서 익히는 javscript 기능과 기술 등


알고리즘 ( 해시 )

  • 전화번호 목록

전화번호부에 적힌 전화번호를 담은 배열 
phone_book 매개변수로 주어질 때, 

어떤 번호가 다른 번호의 접두어인 
경우가 있으면 false 를 그렇지 않으면 true 를 return

입력값: ["119", "97674223", "1195524421"]
       ["123", "456", "789"]
       ["12", "123", "1235", "567", "88"]
function solution(phoneBook) {
	return !phoneBook.sort().some((t, i) => {
    	if (i === phoneBook.length - 1) return false;
      	return phoneBook[i+1].startsWith(phoneBook[i]);
    })
}
  • 해석
* .sort() : 각 숫자의 크기가 아닌, 
            문자열로서의 사전식 정렬 순서에 따른 것
			
            => 사전식 정렬이기 때문에 접두사와 같이
               사전순이며 동일한 문자열을 접두사처럼 
               가진 경우, 길이 짧은 문자열이 선 정렬
               
* !(...).some() : 하나라도 조건이 만족하면 true 아니면 false

                  => 하지만 문제는 논리가 반대이기 때문에
                  => ! 를 앞에 적용

* i === phoneBook.length - 1 : 마지막을 접두사로 확인할 필요
							   없기 때문에 해당 조건 작성

* phoneBook[i+1].startsWith(phoneBook[i]);
	: 사전순으로 정렬된 phoneBook 이기 때문에 
      접두사를 startsWith 를 통해 확인 

  • 의상

각 종류별로 최대 1가지 의상만 착용
서로 다른 방법으로 옷을 착용한 것으로 계산

하루에 최소 한 개의 의상

가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 
서로 다른 옷의 조합의 수를 return 

입력값: [["yellow_hat", "headgear"], 
	    ["blue_sunglasses", "eyewear"],
        ["green_turban", "headgear"]]

		[["crow_mask", "face"], 
        ["blue_sunglasses", "face"], 
        ["smoky_makeup", "face"]]
function solution(clothes) {
	return Object.values(clothes.reduce((acc, cur) => {
    	acc[cur[1]] = acc[cur[1]] ? acc[cur[1]] + 1 : 1;
    }, {})).reduce((a, b) => a * (b+1), 1) -1;
}
  • 해석
* Object.values : 객체의 값 목록을 배열로 전환   
            => 경우의 수를 구하기 위해 전환

* clothes.reduce : 배열의 누적 계산
			=> 종류별로 개수를 담은 객체 반환

* acc[cur[1]] = acc[cur[1]] ? acc[cur[1]] + 1 : 1
	: cur[1] 은 key 이며 삼항연산자로 해당 key 의
      값이 존재하면 1 아니면 누적 + 1 계산

* reduce((a * (b+1), 1) -1 : 누적으로 조합 계산 공식
profile
일단 한다

0개의 댓글