1. 간단한 논리연산
목표 : (x1 ∨ x2) ∧ (x3 ∨ x4)
//입력(x1, x2, x3, x4)
false true true true
//출력
true
function solution(x1, x2, x3, x4) {
return (x1||x2)&&(x3||x4) ? true: false;
}
- 논리연산자를 사용하여
||, &&로 연산해주고 3항 연산자를 사용했다.
2. 주사위 게임 3 ⭐
목표 : 네개의 주사위를 굴려 각 조건에 맞게 반환
//입력 (a, b, c, d)
2 2 2 2
//출력
2222
const Count = (arr) => {
let result = {}
for(let x of arr) {
result[x] = (result[x] || 0) + 1;
}
return result;
}
function findKeys(obj, value) {
const keys = [];
for (let key in obj) {
if (obj[key] === value) {
keys.push(key);
}
}
return keys;
}
function solution(a, b, c, d) {
const num = [a, b, c, d];
const unique = new Set(num).size;
switch(unique){
case 1:
return 1111*num[0];
case 2:
const obj1 = Count(num);
if(Object.values(obj1).includes(1)){
const find1 = Object.keys(obj1).find((find) => obj1[find] === 1);
const find2 = Object.keys(obj1).find((find) => obj1[find] === 3);
return (10*Number(find2)+Number(find1))**2
}else {
const [p, q] = [...new Set(num)];
return (p+q)*Math.abs(p-q);
}
case 3:
const obj2 = Count(num);
const keys = findKeys(obj2,1);
return Number(keys[0])*Number(keys[1])
case 4:
return Math.min(...num);
}
}
문제설명
- 네 주사위에서 나온 숫자가 모두
p로 같다면 1111 × p점을 얻습니다.
- 세 주사위에서 나온 숫자가
p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)^2 점을 얻습니다.
- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각
p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
- 어느 두 주사위에서 나온 숫자가
p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
Count 함수는 배열을 파라미터로 받아 배열을 순회하며 중복하는 숫자와, 해당 숫자가 몇 번 중복하는지를 Object형태로 반환한다.
findKeys 함수는 Object와 Value를 파라미터로 받아 해당 오브젝트에서 파라미터로 받은 Value의 값과 일치하는 key값을 찾아 Array형태로 반환한다.
- main solution 함수에서는
a, b, c, d를 파라미터로 받아와, num에 배열의 형태로 저장한다.
unique는 Set함수를 사용해서 num의 값들중에 유일값을 찾는다. 즉 중복하는 값들을 제거하는 역할을 한다. 또한, .size를 사용하여 유일값들의 갯수를 결과적으로 변수에 저장한다.
switch-case문을 사용하여 unique의 값에 따라, 조건수행 후, 결과를 반환한다.
unique가 1일때(case 1:)
- 모든값이 같다고 했으므로
num[0]에 1111을 곱해서 반환하면된다.
unique가 2일때(case 2:)
obj1변수에 중복하는 값과, 몇 번 중복하는지에 대한 정보가 반환된 Object형태의 데이터를 저장한다.
Object.values(obj1).includes(1)를 사용하여 obj1에 1이라는 값이 있는지 검사한다. ( 주사위 세개가 같고 한개만 다른 경우이다. )
find1과 find2에 각각 Value가 1과 3인 key값을 가져와 연산하고 리턴한다.
[p, q]에 유일값만 남은 두개의 값들을 저장하고, 조건에 맞는 수식으로 계산후 반환한다. ( 주사위 두개와, 나머지 주사위 두개가 같을때이다.)
unique가 3일때(case 3:)
obj2변수에 위에서와 똑같이 중복하는 값과, 몇 번 중복하는지에 대한 정보가 반환된 Object형태의 데이터를 저장한다.
keys라는 변수에 findKeys(object, value)함수를 사용하여, 오브젝트를 넣고, 하나씩만 나온 주사위의 key값을 찾는다.
Array형태로 반환된 keys의 0, 1번째 인덱스의 값을 숫자로 변환 후, 연산하고 반환한다.
unique가 4일때(case 4:)
Math.min을 사용하여 num에서 가장 작은 값을 리턴하면 된다.
3. 글자 이어 붙여 문자열 만들기
목표 : 정수배열로 문자열을 이어 붙이기
//입력(my_string, index_list)
"zpiaz", [1, 2, 0, 0, 3]
//출력
"pizza"
function solution(my_string, index_list) {
let rs = [];
let str = my_string.split('');
for (let x of index_list){
rs.push(str[x])
}
return rs.join('')
}
rs, str을 선언하고, str에는 주어진 문자열을 잘라 저장한다.
index_list만큼 반복하고, str의 인덱스에 해당하는 문자를 rs에 push해준다
str을 join을 사용해 문자열로 만들어 준 후 반환한다.
4. 9로 나눈 나머지
목표 : 각 자리수를 더하고, 9로 나눈 나머지를 반환
//입력
"123"
//출력
6
function solution(number) {
let buffer = 0;
for(let x of number){
buffer += Number(x);
}
return buffer%9
}
buffer이라는 변수를 0으로 선언하고, number의 길이만큼 반복하면서 buffer에 자리수들을 더해준다.
-buffer를 9로 나눈 나머지를 반환한다.
5. 문자열 여러번 뒤집기
목표 : 문자열의 일부분을 연속해서 뒤집은 후 반환
//입력(my_string, queries)
"rermgorpsam", [[2, 3], [0, 7], [5, 9], [6, 10]]
//출력
"programmers"
function solution(my_string, queries) {
let str = my_string.split('');
for (let [s, e] of queries) {
let reversed = str.slice(s, e+1).reverse();
for (let i = s; i <= e; i++) {
str[i] = reversed[i - s];
}
}
return str.join('');
}
- 주어진 문자열을 잘라
str변수에 저장한다.
queries의 길이만큼 반복하면서, [s, e]변수를 선언한다. 각각 start인덱스와 end인덱스를 뜻한다.
reversed라는 변수에 str을 s인덱스부터 e+1까지 자르고, reverse()함수를 사용해서 뒤집어준다.
s부터 e와 i가 같을때까지 반복하면서 str[i]에 해당하는 문자를 reversed에 저장된 문자로 순차적으로 치환해준다.( reversed는 0번째 인덱스부터 시작해야하기 때문에 i-s인덱스로 설정해준다.)