[Hackerrank] Between Two Sets 문제 해설 - Algorithms > Implementation / Easy

이미지
Between Two Sets 1. 문제 설명 이 문제는 정수로 이루어진 두 배열 A, B의 원소 중 다음 조건을 충족하는 정수(x)의 갯수를 구하는 문제이다. All elements in A are factors of x. x is a factor of all elements in B. 이를 다르게 표현하면 다음과 같이 표현 할 수 있다. x mod a[i] = 0 for every a[i] in A b[i] mod x = 0 for every b[i] in B 예를 들어, A = {2, 6} 이고 B = {12} 일 경우 x 에 속할 수 있는 값은 6 과 12 가 된다. *원본 링크 :  https://www.hackerrank.com/challenges/between-two-sets/problem 변수 설명 A: a[i]로 구성된 정수 배열 B: b[i]로 구성된 정수 배열 n: A의 원소 갯수 m: B의 원소 갯수 x: 위의 조건을 충족하는 정수 2. Input Format 첫번째 줄에는 n과 m값이 주어진다. 두번째 줄엔는 A의 원소인 a[i] 값이 주어진다. 세번째 줄엔는 B의 원소인 b[i] 값이 주어진다. 3. Output Format A와 B 배열에서 위의 조건을 만족하는 정수 x의 갯수 출력 4. 제약조건 Sample Input 2 3 2 4 16 32 96 Sample Output 3 Solution 처음 접근했던 방법은 위에서 주어진 식을 그대로 풀어서 문제를 해결하는 식이었다. 순서는 다음과 같다. B에 속해있는 원소들의 공약수를 모두 구한다. 1번에서 구한 공약수 중 A에 속한 모든 원소로 나누었을 때, 나머지 값이 모두 0이 되는 공약수가 있는지 찾는다. 2번을 충족하는 공약수로 이루어진 새로운 배열을 만든다. 3번에서 구한 배열의 length 값을 출력한다. 위의...

[Hackerrank] Kangaroo 문제 해설 - Algorithms > Implementation / Easy

이미지
Kangaroo 1. 문제 설명 이 문제는 서로 다른 시작 지점과 점프 크기를 가진 두 마리의 캥거루가 경주를 할 때, 뒤에서 출발한 캥거루와 앞선 지점에서 출발한 캥거루가 똑같은 시점에 같은 지점에 있을 수 있는지 묻는 문제이다(마치 어렸을 적 수학 책에서 나왔던 문제와 비슷하다..). * 원본 링크 :  https://www.hackerrank.com/challenges/kangaroo/problem 변수 설명 x1 : 첫번째 캥거루의 시작 지점 x2 : 두번째 캥거루의 시작 지점 v1 : 첫번째 캥거루가 한 번에 점프 할 수 있는 거리 v2 : 두번째 캥거루가 한 번에 점프 할 수 있는 거리 2. Input Format 첫번째 줄에 x1, v1, x2, v2의 값이 주어진다. 3. Output Format 두 캥거루가 똑같은 지점에 똑같은 타이밍에 존재 할 수 있다면 YES 출력, 그렇지 않다면 NO 출력 4. 제약 조건 Sample Input1 0 3 4 2 Sample Output1 YES Sample Input2 0 2 5 3 Sample Output 2 NO Solution 이 문제를 처음 접하고 떠올린 풀이 방법은 다음과 같다. x1 < x2 이므로, v1 < v2 면 두 캥거루는 만날 수 없으므로 NO 출력 1 <= v1, v2 <= 10000 이므로 10000번 반복문을 수행하면서 두 캥거루가 같아지는 지점이 존재하면 YES 출력, 아니면 NO 출력 1번은 괜찮지만, 2번의 경우 시간 복잡도가 최대 O(10000)까지 올라갈 수 있는 무적이나 비효율적인 알고리즘이 탄생할 것 같았다. 그래서 조금 더 생각해보니 아래와 같은 식이 도출 되었다. 두 캥거루가 동일한 지점에서 만나려면 아래 식이 성립해야 한다. x1 + n * v1 = x2 + n ...

[Hackerrank] Apple and Orange 문제 해설 - Algorithms > Implementation / Easy

이미지
Apple and Orange 1. 문제 설명 이 문제는 사과 나무와 오랜지 나무 사이에 있는 Sam의 집에 사과와 오랜지 열매가 얼마나 많이 떨어졌는지 구하는 알고리즘 문제다. 자세한 내용은 아래 링크에서 확인 할 수 있다. * 원본 링크 :  https://www.hackerrank.com/challenges/apple-and-orange/problem 문제 이해를 위한 이미지 위의 이미지에서 볼 수 있듯이 모든 사물은 x-축 상에 있다고 가정한다. 주어지는 변수를 설명하면 다음과 같다. s: Sam의 집이 시작되는 지점 t: Sam의 집이 끝나는 지점 a: 사과 나무의 위치 b: 오랜지 나무의 위치 m: 사과의 갯수 n: 오랜지의 갯수 d: 각각의 열매(사과, 오랜지)가 해당 과일 나무와 떨어져있는 거리. 값이 음수(-)일 경우 x-축의 좌측에, 양수(+)일 경우 우측에 존재한다는 의미이다. 2. Input Format 첫번째 줄에는 s와 t값이 구분되어 주어진다. 두번째 줄에는 a와 b값이 구분되어 주어진다. 세번째 줄에는 m과 n값이 주어진다. 네번쨰 줄에는 m개의 사과가 떨어진 지점과 a지점까지의 거리를 표시한다. 다섯번쨰 줄에는 n개의 오랜지가 떨어진 지점과 b지점까지의 거리를 표시한다. 3. Output Format 첫번째 줄에는 Sam의 집에 떨어진 사과의 갯수를 표시한다. 두번째 줄에는 Sam의 집에 떨어진 오랜지의 갯수를 표시한다. 4. 제약조건 Sample Input 7 11 5 15 3 2 -2 2 1 5 -6 Sample Output 1 1 Solution 처음 이 문제를 접했을 때 내가 생각한 해결 방법은 너무 단순했다. a < s < t < b 이므로,  떨어진 각 사과( apple[i] )의 좌표와 사과 나무의 위치를 더한 값이 s보...

[Hackerrank] Grading Students 문제 해설 - Algorithms > Implementation / Easy

Grading Students 1. 문제 설명 이번 문제는  HackerLand University의 성적 판별 기준을 제시하고 입력된 학생들의 최종 grade 를 산출하는 문제다. * 원본 링크 :  https://www.hackerrank.com/challenges/grading/problem HackerLand University의 기준은 다음과 같다. 모든 학생은 0 ~ 100점 사이의 grade 를 부여 받는다. 40점보다 낮은 점수는 fail 처리 한다. 교수인 Sam의 기준은 다음과 같다. 해당 학생의 grade 와 다음 5의 배수인 값의 차가 3점 이하면 해당 grade 를 해당 값으로 올려준다. 점수가 38점보다 낮을 경우 반올림 하지 않는다. 예를 들어, grade = 84 라면 점수를 상향 조정 해 최종 결과는 85가 된다.  하지만 grade = 29 라면 40점보다 낮은 점수이므로 반올림 하지 않으며, 최종 결과는 29가 된다. 2. Input Format 첫번째 줄에는 Sam의 수업에 참여하는 학생의 수( n )가 주어진다. 이후 i번째 줄에는 각 학생의 점수가 주어진다. 3. Output Format i번째 줄에 반올림 처리가 된  grade i 가 표시된다. Sample Input 4 73 67 38 33 Sample Output 75 67 40 33 Solution 이 문제의 제약 사항은 2가지다.  다음 5의 배수인 값과의 차이가 3보다 작을 경우 해당 값으로 반올림 해준다. 40점 미만인 학생은 반올림 하지 않고 기존 점수를 유지한다. 일단, 반올림 최소 점수인 38점을 기준으로 한 번 점수를 검증한다. 이후에 5의 배수 값으로 반올림 할 것인지 판단하다. 이 때 판단 기준은 5 - (점수 % 5) < 3 이 된다. 학생의 점수를 5로 나누면 5다음 5의 배수와의 차이를 알 수 있다. ex1. grade = 37 5 - (37...

[카카오] 3차 코딩 테스트 문제1(N진수 게임) 풀이 using Javascript

나는 아직 코딩 테스트를 한 번도 격어보지 못했다. 그래서 최근 공개된 카카오의 신입 공채 문제를 풀어보기로 했다. 그 첫번쨰 문제는 다음과 같다. 문제1. N진수 게임 튜브가 활동하는 코딩 동아리에서는 전통적으로 해오는 게임이 있다. 이 게임은 여러 사람이 둥글게 앉아서 숫자를 하나씩 차례대로 말하는 게임인데, 규칙은 다음과 같다. 숫자를 0부터 시작해서 차례대로 말한다. 첫 번째 사람은 0, 두 번째 사람은 1, … 열 번째 사람은 9를 말한다. 10 이상의 숫자부터는 한 자리씩 끊어서 말한다. 즉 열한 번째 사람은 10의 첫 자리인 1, 열두 번째 사람은 둘째 자리인 0을 말한다. 입력 형식 진법 n, 미리 구할 숫자의 갯수 t, 게임에 참가하는 인원 m, 튜브의 순서 p 가 주어진다. 2 ≦ n ≦ 16 0 < t ≦ 1000 2 ≦ m ≦ 100 1 ≦ p ≦ m 출력 형식 튜브가 말해야 하는 숫자  t 개를 공백 없이 차례대로 나타낸 문자열. 단,  10 ~ 15 는 각각 대문자  A ~ F 로 출력한다. 보다 자세한 문제 설명은 아래 카카오 공식 블로그 링크에서 확인할 수 있다. http://tech.kakao.com/2017/11/14/kakao-blind-recruitment-round-3/ 문제 풀이 내가 생각했을 때 이 문제의 키워드는 진법 변환, 반복문 정도다.  먼저 이 문제에서 반복문이 시행되어야 하는 횟수는 미리 구할 숫자의 갯수(t) * 게임에 참가하는 인원(m)으로 나타낸다. 다음으로 진법 변환을 먼저 살펴보자. Javascript에서는 아래와 같은 방법으로 원하는 진법으로 숫자를 변경 할 수 있다. (3).toString(2); //11 위와 같은 방법으로 진법을 변경한 숫자의 글자수만큼 다시 loop를 진행 해 튜브의 순서가 되면 output에 해당 문자열을 추가해준다. 최종...

[Javascript, ECMAScript] float(실수) 연산 오류 원인과 해결 방법

Javascript에서 float(실수) 연산을 수행하다 보면 원치않는 결과가 발생하는 경우가 있다. 예를 들어 아래와 같은 연산을 수행하는 경우 0.3이라는 결과를 기대하지만, 실제로는 0.30000000000000004라는 값이 표시된다. console.log(0.1 + 0.2); //0.30000000000000004 이러한 오류가 발생하는 이유는 Javascript(ECMAScript)가 IEEE-754 를 표준으로 사용하고 있기 때문이다. IEEE-754는 컴퓨터에서 부동소수점을 표시하는 방법을 정하는 표준이다. 사실 위와같은 결과가 나오는 것은 표준을 따르고 있는 것이기 때문에 정상 작동하고 있는 것이지만... 우리가 원하는 결과는 0.3이므로 수정이 필요하다. 아래와 같이 parseFloat() 와 toFixed() 메서드를 이용해 해결 할 수 있다. console.log(0.1 + 0.2); //0.30000000000000004 const num1 = parseFloat(0.1); const num2 = parseFloat(0.2); console.log((num1 + num2).toFixed(2)); //0.3 toFixed() 메서드의 인자값은 소수 몇째 자리까지 표시할 것인지를 지정한다.

[Javascript] destructure에 대해서 알아보자

ES2015(ES6)에 추가된 문법으로 배열이나 객체를 쪼개서..? 사용할 수 있다. 자세한 사용 방법은 아래 링크 참조할것 http://beomy.tistory.com/18