프로그래머스 Day - 8

ᵁ-ᴷᴺᴼᵂᴺ·2023년 5월 30일
post-thumbnail

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 함수는 ObjectValue를 파라미터로 받아 해당 오브젝트에서 파라미터로 받은 Value의 값과 일치하는 key값을 찾아 Array형태로 반환한다.
  • main solution 함수에서는 a, b, c, d를 파라미터로 받아와, num에 배열의 형태로 저장한다.
  • uniqueSet함수를 사용해서 num의 값들중에 유일값을 찾는다. 즉 중복하는 값들을 제거하는 역할을 한다. 또한, .size를 사용하여 유일값들의 갯수를 결과적으로 변수에 저장한다.
  • switch-case문을 사용하여 unique의 값에 따라, 조건수행 후, 결과를 반환한다.

    unique가 1일때(case 1:)

    • 모든값이 같다고 했으므로 num[0]1111을 곱해서 반환하면된다.

    unique가 2일때(case 2:)

    • obj1변수에 중복하는 값과, 몇 번 중복하는지에 대한 정보가 반환된 Object형태의 데이터를 저장한다.
    • Object.values(obj1).includes(1)를 사용하여 obj11이라는 값이 있는지 검사한다. ( 주사위 세개가 같고 한개만 다른 경우이다. )
    • find1find2에 각각 Value가 1과 3인 key값을 가져와 연산하고 리턴한다.
    • [p, q]에 유일값만 남은 두개의 값들을 저장하고, 조건에 맞는 수식으로 계산후 반환한다. ( 주사위 두개와, 나머지 주사위 두개가 같을때이다.)

    unique가 3일때(case 3:)

    • obj2변수에 위에서와 똑같이 중복하는 값과, 몇 번 중복하는지에 대한 정보가 반환된 Object형태의 데이터를 저장한다.
    • keys라는 변수에 findKeys(object, value)함수를 사용하여, 오브젝트를 넣고, 하나씩만 나온 주사위의 key값을 찾는다.
    • Array형태로 반환된 keys0, 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의 인덱스에 해당하는 문자를 rspush해준다
  • strjoin을 사용해 문자열로 만들어 준 후 반환한다.

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에 자리수들을 더해준다.
    -buffer9로 나눈 나머지를 반환한다.

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라는 변수에 strs인덱스부터 e+1까지 자르고, reverse()함수를 사용해서 뒤집어준다.
  • s부터 e와 i가 같을때까지 반복하면서 str[i]에 해당하는 문자를 reversed에 저장된 문자로 순차적으로 치환해준다.( reversed는 0번째 인덱스부터 시작해야하기 때문에 i-s인덱스로 설정해준다.)
profile
ΔIM ΩΠ ҒULLSTΔCҜ

0개의 댓글