FrontEnd

    [JS] 숫자 카드 나누기

    한쪽 카드뭉치는 모두 나눌 수 있어야 하고, 반대쪽 카드뭉치는 모두 나눌 수 없어야 한다. 따라서 우선 한쪽카드뭉치를 모두 나눌 수 있는 수는 해당 카드뭉치의 가장 작은 값의 약수들이란 생각이 들었다. 만약 해당 값의 가장 작은 약수들로 남은 수들을 나눌 수 있고, 반대편 카드뭉치의 수들을 나눌 수 없다면 답이된다. 따라서 철수와 영희의 입장에서 정답이 될 수 있는 후보들인 가장 작은값의 약수를 구한 이후 every 함수를 활용해서 나눌 수 있는지 없는지를 확인하였다. 조금 주의할 점은 일반적인 약수 알고리즘과 다르게 자기 자신을 넣어줘야 한다는 것이다. const getDivisor = (n) => { const ret = [] for (let i = 1 ; i a-b) arrayB.sort((a,b)..

    [JS] 귤 고르기

    Map 자료형에 값을 넣고 이를 개수에 대해 정렬한 다음 큰 값부터 우선적으로 빼내면 쉽게 해결할 수 있을 것 같은 문제였다. 근데 저번에 최대힙을 공부하기도 했고 힙을 빠르게 구현하는걸 연습 해볼겸 힙을 활용해서 문제를 풀어보았다. 정렬해서 큰값을 빼내는 부분을 Heap으로 대체해주었다. 다만.. 생각보다 신기한건 정렬을 활용해서 푼 문제와 생각처럼 시간이 많이 차이나지 않았고, 오히려 정렬이 더 빠른 경우가 많았다. 물론 가장 테스트케이스가 큰 경우에는 Heap이 빠르기 했지만 실제로 테스트를 보는 입장이라면 heap구현은 시간이 많이 걸리므로 테스트 케이스의 개수를 잘 보아 가면서 사용해야 할 것 같다. class Heap { constructor () { this.heap = [0] this.le..

    [JS] 점 찍기

    이전에 풀어보았던 원 문제와 같은 방식으로 해결할 수 있었다. 원안의 점을 수식으로 구할때, x축을 기준으로 k씩 증가시키면서 그 위로 찍을수 있는 점들을 세면 된다. k가 0,2,4 일때 찍을 수 있는 점은 (0,0) (0,2) (0,4) (0,6) (2,0) (2,2) (4,0) 가 나오게 된다. 즉 각각 4개 2개 1개가 나온다. 이때 k의 x값과 대각선 값을 알기에 최대로 나올 수 있는 세로값을 피타고라스 정리에 의해서 구할 수 있고, 이를 활용해서 개수를 구해주면 된다. function solution(k, d) { let ret = 0 for ( let i = 0 ; i

    [JS] 디펜스 게임

    배열을 한바퀴 순회하면서 최대값을 항상 가지고 있으면 되겠다.. 라는 생각을 하게 되었다 처음에는 아무생각 없이 이분탐색을 활용한 정렬을 사용해서 정렬된 리스트를 가지고 해결하려다가 시간초과가 발생했다. 그런데 어차피 전체 정렬된 배열이 필요한게 아니라 그때그때 최대값만 가지고 있으면 되므로 힙 자료구조를 활용하면 되겠다.. 라는 생각이 들었다. 힙 자료구조란 완전이진트리 구조를 활용한 자료구조로 최대 혹은 최대값을 배열의 첫 값으로 가지고, 이후에는 반쯤 정렬된 구조를 가진 자료구조이다. 힙을 배열로 구현하였으며 , 몇가지 특성을 알고 나면 구현하기 어렵지 않다. 1. 편의상 1번노드와 1번 idx를 맞춰주기 위해서 0번 공간은 비워둔다. 2. 부모의 idx가 n이라면 자식 왼쪽은 n*2 , 오른쪽은 ..

    [JS] 테이블 해시 함수

    문제에서 주어진 대로 구현하면 되는 구현문제였다. 1. 자바스크립트 sort함수를 활용해서 정렬하기 2. reduce를 활용해서 나머지의 합 구하기 3. ^ 연산자 활용해서 XOR 연산하기 function solution(data, col, row_begin, row_end) { data.sort((a,b) => { if (a[col-1] > b[col-1]) return 1 else if (a[col-1] === b[col-1]) return b[0]-a[0] else return -1 }) let ret = 0 for (let i = row_begin-1 ; i a + c%(i+1),0) ret ^= S_i } return ret }

    [JS] 유사 칸토어 비트열

    생각보다 너무 까다로운 문제였다... 처음에 문제를 딱 보았을때는 수학적 성질을 활용해서 간단하게 풀거나, 재귀함수로 풀 수 있겠다라는 생각이 들었다. 수학적 성질을 활용해서 풀어보려고 머리를 쓰다가 포기하고 결국은 재귀함수를 활용해서 풀기로 해보았다. 결국 두 좌표의 차이를 계산하기 위해서는 r까지의 1의 개수, l까지의 1의 개수를 구한 다음, 두 수의 차를 구하면 되는 문제이다. 처음에 굉장히 많이 헤맸는데, 해당 배열을 재귀로 넘겨줄때 5로 나누어진 몫을 넘겨줘야 한다고 생각했었다. 11011 11011 00000 11011 11 까지 만약에 다음 재귀사이클로 넘겨준다면 , 11011 11011 00000 11011 즉 4라는 값을 넘겨주고, 11을 1의개수를세면 된다고 생각했었다. 그런데 전혀 ..