20220720_TIL_CS스터디, 알고리즘 풀이

codeing999·2022년 7월 20일
0

TIL/WIL

목록 보기
5/22

CS스터디 2일차

오늘은 나도 발표가 있던 날이다. 발표했던 내용은 다른 곳에 올릴 거같고 여기엔 발표 전에 대충 정리해놨던 부분만 옮겨본다.

009. 0과 1의 세계

비트
디지털 정보를 표현하는 가장 기본적인 방식
비트는 이진 숫자라는 뜻으로 binary digit를 축약한 것이다. 1940년대 중반 통계학자 존 투키가 만든 단어.
0 또는 1 중 하나의 값을 사용하고 다른 값은 사용하지 않는 숫자. (십진수가 0~9까지 10개의 값을 사용하는 것과 대조적)
두개의 값중 하나를 선택하는 정보는 무엇이든 비트 한개로 표현될 수 있다 : 켜짐/꺼짐, 참/거짓, 예/아니요, 높음/낮음, 안/밖, 위/아래, 왼쪽/오른쪽, 북쪽/남쪽, 동쪽/서쪽 등등
더 많은 선택지를 표시하거나 더 복잡한 정보를 표현하기위해서 비트를 여러개 사용하여 0과 1로 다양한 조합에 의미를 할당하면 된다.
예) 비트 2개를 사용하여 신입생은 00, 2학년은 01, 3학년은 10, 졸업반은 11로 포현
학년이 5개가 되면 비트 2개로는 부족해진다. 대신 세개를 쓴다면 5학년을 표현하기에 충분하고 총 8가지 까지 표현할 수 있다.
비트의 개수와 비트로 표현할 수 있는 항목의 개수는 N 과 2^n 관계.

알고리즘 풀이

34. 폰켓몬 (오타 아님)

function solution(nums) { //폰켓몬
    let temp = [...new Set(nums)]; 
    let n = Math.floor(nums.length/2);
    return (temp.length > n ? n : temp.length) ;
}

@ 배열의 중복제거할 때 reduce()를 쓰는거보다 set으로 바꿨다가 되돌리는게 훨씬 빠른 것 같았다. 다음부턴 저렇게 해야지 new도 자바스크립트에선 처음 써봤는데 처음엔 N 대문자로 썼다가 안되서 좀 해맸다. 구글링으로 대문자로 쓴 글을 봐버려서..

35. [1차] 비밀지도

function solution(n, arr1, arr2) { //[1차] 비밀지도
    let dec  = 0;
    let temp1 = [];
    let temp2 = [];
    let temp = new Array(n);
    for ( let i = 0; i<n; i++){
        temp[i] = [];
        dec = arr1[i].toString(2);
        temp1 = dec.split('');
        while (temp1.length < n) {  //값이 작을 땐 5자리가 안되서 앞에 0 채워주기.
            temp1.unshift('0');
        }
        dec = arr2[i].toString(2);
        temp2 = dec.split('');
        while (temp2.length < n) {
            temp2.unshift('0');
        }
        //console.log(temp1, temp2);
        for (let j = 0; j<n; j++){
            if ( (temp1[j] !='0')|| (temp2[j] !='0')){  //둘다 벽인 경우.
                temp[i][j] = '#';    
            }
            else temp[i][j] = ' ';
            //console.log(temp1[j] , temp2[j], temp[i]);
        }
        //console.log(temp[i])
        temp[i] = temp[i].join('');
    }
    return temp;

}

@ let temp = [][]; //이런 식으로 2차원배열 선언은 불가능하다고 한다. 그래서 한번은 let temp = new Array(n); 이렇게 해주고 그 각각에 대해서 for문 안에서 temp[i] = []; 해줬다.
@ toString(2) 2진수로 변환하는 함수도 써봤고.

36. [카카오 인턴] 키패드 누르기

// 이건 다른 답들 봐도 짧은 코드가 하나도 없네. 
function distance(a, b)    //칸 이동 수 구하는 함수.
    return Math.abs(a[0]-b[0]) + Math.abs(a[1]-b[1]);

function solution(numbers, hand) {
    let pri = (hand == "left"? 'L' : 'R');
    var coo = [[1,0],       //해당 번호의 좌표값.
               [0, 3], [1, 3], [2, 3],
               [0, 2], [1, 2], [2, 2],
               [0, 1], [1, 1], [2, 1],
              ];
    var lc = [0,0];
    let rc = [2, 0];
    var answer = '';
    for ( v of numbers){    
        if ([2, 5, 8, 0].includes(v)){
            //console.log(numbers[i], lc, distance(lc, coo[numbers[i]]), rc, distance(rc, coo[numbers[i]]));
            if ( distance(lc, coo[v]) < distance(rc, coo[v]) ){
                answer+='L';
                lc = coo[v];
            }
            else if (distance(lc, coo[v]) > distance(rc, coo[v])){
                answer+='R';
                rc= coo[v];
            }
            else {
                answer+=pri;
                if (hand == "left") lc = coo[v];
                else rc = coo[v];
         }
        } 
        else if ([1, 4, 7].includes(v)){
            answer+='L';
            lc = coo[v];
        }
        else{
            answer+='R';
            rc= coo[v];
        }
    }
    return answer;
}

@ for...of를 썼는데 처음에는 for문 쓰다가 i 쓸일은 없고 numbers[i] 계속 써야되서 저거로 바꿨다. v하나로 써지니까 편안.

profile
코딩 공부 ing..

0개의 댓글