230417_Algorithm

majungha·2023년 4월 17일
1

알고리즘

목록 보기
27/71

오늘의 알고리즘 👍

📝 1. 3진법 뒤집기


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

▷ 입출력 예

solution(45) // 7
solution(125) // 229

▷ 내 풀이

▷ 해결 못함 ❌

  • 과제를 해결하느라 알고리즘을 풀지 못했다.

▷ 진법 바꾸기

let answer = ''
let num = 10
while(num > 0) {
  answer = (num % 2) + answer
  num = Math.floor(num / 2)
}
console.log(answer) // '1010'
////////////////
num = 10
String(num) // '10'
num.toString() // '10'
////////////////
10.toString() // SyntaxError가 나온다. 그러므로 변수에 한번 할당해서 사용해야 한다.
(10).toString() // '10'
////////////////
const num = 10..toString(2)
parseInt(num, 2) // 10
Number(num) // 1010

▷ 수업 풀이

function solution(n) {
  // 10진법 -> 3진법으로 변환
  n = n.toString(3);

  let reverse = '';
  for (let i = n.length - 1; i >= 0; i--) {
    reverse += n[i];
  }

  // 3진법 -> 10진법으로 변환
  return parseInt(reverse, 3);
}

▷ split, reverse, join 매서드 사용 풀이

function solution(n) {
  n = n
    .toString(3) // 10진법 -> 3진법으로 변환
    .split('') // 문자열을 배열로 변환
    .reverse() // 배열의 순서를 반전
    .join(''); // 배열을 문자열로 변환

  return parseInt(n, 3); // 3진법 => 10진법으로 변환
}

📝 2. 이진 변환 반복하기


  • 0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.
    1. x의 모든 0을 제거합니다.
    1. x의 길이를 c라고 하면, x를 "c를 2진법으로 표현한 문자열"로 바꿉니다.
  • 예를 들어, x = "0111010"이라면, x에 이진 변환을 가하면 x = "0111010" -> "1111" -> "100" 이 됩니다.
  • 0과 1로 이루어진 문자열 s가 매개변수로 주어집니다.
  • s가 "1"이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.
    입출력 예
solution('110010101001'); // [3,8]
solution('01110'); // [3,3]
solution('1111111'); // [4,1]

▷ 내 풀이

▷ 해결 못함 ❌

  • 과제를 해결하느라 알고리즘을 풀지 못했다.

▷ 수업 풀이

function solution(s) {
  let count = 0; // 이진 변환이 시도된 횟수
  let remove = 0; // 0이 제거된 개수

  while (s !== '1') {
    // s가 '1'이 될 때까지 무한하게 이진 변환을 적용
    count++;

    let temp = ''; // s에서 '1'만 남겨진 문자열(= 0이 제거된 문자열)
    for (let i = 0; i < s.length; i++) {
      if (s[i] === '0') {
        // '0'이라면 문자열에서 제거
        remove++;
        continue;
      }
      // '0'이 아니라면 (='1') 새로운 문자열 저장
      temp += s[i];
    }
    s = temp.length; // '0'이 제거된 문자열의 길이
    s = s.toString(2); // 문자열의 길이를 2진법으로 변환
  }
  return [count, remove];
}

❗ 재귀함수

let count = 0;
function recursion() {
  count++;

  if(count > 5) {
    console.log('재귀함수 종료');
    return; // 리커전 함수 종료 세이프 지점 (= 꼬리 재귀)
  }
  console.log('재귀함수 실행');
  return recursion(); // 자기 자신을 실행한다.
}

recursion() // '재귀함수 실행' * 5, '재귀함수 종료'

▷ 재귀함수 사용 풀이

function solution(s) {
  let [count, remove] = [0, 0];

  function recursion() {
    if (s === '1') {
      // 세이프 지점
      return [count, remove];
    }
    count++;

    s = s.split('').filter((num) => {
      if (num === '0') remove++;
      return num === '1';
    }).length;
    s = s.toString(2);

    return recursion(); // 다시 실행
  }
  return recursion();
}

출처: 프로그래머스
출처: 코드캠프

profile
개발자 블로그 / 항상 겸손한 자세로 배우면서 성장하자 할 수 있다!

0개의 댓글