[알고리즘] 3진법 뒤집기, 일곱난쟁이, 특정 문자 모두 바꾸기

Perfume·2022년 4월 24일
2

Algorithm

목록 보기
3/11
post-thumbnail

이번 주말에 3문제를 풀었다. 공부할수록 조금씩 풀 수 있는 문제가 늘어나고 자신감도 생기는듯 🥳

💡 3진법 뒤집기

➡️ 문제 링크

자연수 n이 매개변수로 주어집니다. n을 3진법 상에서 앞뒤로 뒤집은 후, 이를 다시 10진법으로 표현한 수를 return 하도록 solution 함수를 완성해주세요.

일단 10진법으로 표현한 수를 3진법으로 바꿔야 했다. 검색해보니 toString(2)를 사용하면 10진수를 2진수로 바꿀 수 있다길래 그럼 3 넣으면 3진수인가? 하고 별 생각없이 toString(3)을 해봤다. 그런데 진짜 됐다 ㅋㅋㅋㅋㅋㅋㅋ. toString().. 정말 대단한걸.

const ternary = n.toString(3)

자, 이제 숫자가 3진수로 변했다. 다음 고민은 어떻게 앞뒤로 뒤집는가였다. 간단하게 ternary를 배열로 바꾸고, reverse() 메소드를 이용해 뒤집기로 했다.

배열로 바꾸는 방법은 크게 세 가지다.

🔑 배열로 변환하는 방법

1. Array.from() 사용하기
e.g)

 Array.from(ternary)

2. 스프레드 연산자 사용하기
e.g)

[...ternary]

3. split() 사용하기
e.g)

ternary.split('')

이중 Array.from()을 사용했다. 내가 이 문제를 해결한 플로우는

전달받은 n을 3진수로 바꾸기
-> 바꾼 값을 배열로 변환하기
-> reverse()를 이용해 앞뒤로 뒤집기
-> join()을 이용해 다시 하나의 string으로 붙이기
-> parseInt(n, 3)을 이용해 다시 10진수로 만들기

이다.

최종 코드는 다음과 같다.

function solution(n) {
    const ternary = n.toString(3)
    const decimal = parseInt(Array.from(ternary).reverse().join(''),3);
    return decimal;
}

💡 일곱난쟁이

왕비를 피해 일곱 난쟁이들과 함께 평화롭게 생활하고 있던 백설공주에게 위기가 찾아왔다. 일과를 마치고 돌아온 난쟁이가 일곱 명이 아닌 아홉 명이었던 것이다.
아홉 명의 난쟁이는 모두 자신이 "백설 공주와 일곱 난쟁이"의 주인공이라고 주장했다. 뛰어난 수학적 직관력을 가지고 있던 백설공주는, 다행스럽게도 일곱 난쟁이의 키의 합이 100이 됨을 기억해 냈다.
아홉 난쟁이의 키가 주어졌을 때, 백설공주를 도와 일곱 난쟁이를 찾는 프로그램을 작성하시오.

이 문제는 좀 어려웠다. reduce()를 이용해 난쟁이들 키의 합계를 구한 다음 그 합계에서 100을 빼는 것까지는 떠올렸는데, 그 다음 단계로 넘어가질 못했다. 😓

결국 풀이를 확인했는데 이중 for문을 이용해 arr[i] + arr[j]가 sum에서 100을 뺀 값과 동일할 경우 splice를 통해 배열에서 제거하는 방법으로 푸는 듯 했다.

function solution(arr) {
  let answer = arr;
  let sum = arr.reduce((a, b) => a + b, 0);
  const over = sum - 100;
  for (let i = 0; i < arr.length - 1; i++) {
    for (let j = i + 1; j < arr.length; j++) {
      if (sum - (arr[i] + arr[j]) === 100) {
        arr.splice(j, 1);
        arr.splice(i, 1);
      }
    }
  }
  return answer;
}

역시 막힌다 싶으면 for문이군..

💡 A를 #으로

대문자로 이루어진 영어단어가 입력되면 단어에 포함된 ‘A'를 모두 ’#‘으로 바꾸어 출력하는 프로그램을 작성하세요.

보자마자 replaceAll 쓰면 되겠는데? 하고 풀었는데 바로 맞아서 뿌듯했다.
알고리즘 잘 푸시는 분들은 매번 이런 기분인건가..?

        function solution(s) {
          let answer = s.replaceAll("A", "#");
          return answer;
        }

풀이를 보니 for-of로도 풀 수 있었다. 만능열쇠 for문 🔑

      function solution(s) {
        let answer = "";
        for (let x of s) {
          if (x === "A") answer += "#";
          else answer += x;
        }
        return answer;
      }
profile
공부하는 즐거움

0개의 댓글