6주차 알고리즘 테스트

majungha·2023년 4월 21일
1

알고리즘

목록 보기
32/71

오늘의 알고리즘 테스트 👍

📝 1. 팰린드롬 ( palindrome )


  • 팰린드롬(회문)이란, 기러기, 토마토, level, rotator 같이 거꾸로 읽어도 똑바로 읽는 것과 같은 문장, 낱말 등을 말합니다.
  • 문자열 str이 주어집니다.
  • str을 인자로 받아 해당 문자열을 기반으로
  • 해당 문자열의 앞에 문자를 추가하여 팰린드롬을 만들어야 합니다.
  • 만들 수 있는 팰린드롬 중에서 "가장 짧은 팰린드롬"을 리턴해 주세요.

▷ 입출력 예

palindrome('abcde') // 'edcbabcde'
palindrome('abcbac') // 'cabcbac'
palindrome('zxcxz') // 'zxcxz'

▷ 내 풀이

function palindrome(str) {
  // 여기에서 작업하세요.
  let answer = "";
  // for(let i = str.length - 1; i > 0; i--){
  //   answer += str[i]
  // }

  for (let i = 1; i < str.length; i++) {
    // 문자열 마지막 인덱스부터 answer에 저장
    answer += str[str.length - i];
  }
  answer += str[0];
  for (let i = 0; i > str.length; i + 2) {
    if (answer[i] !== answer[answer.length - i]) {
      answer += str[i];
    }
  }
  return answer;
}

▷ 해결 못함 ❌

  • 시간만 있었으면 풀 수 있었을 것 같은데 시간이 너무 부족했다. 해설 풀이를 보니까 못풀었을 것 같기도 하다..

▷ while문 사용 풀이

function palindrome(str) {
  function reverse(string, i, j) {
    const arr = string.split('');
    while (i < j) {
      let temp = arr[i];
      arr[i] = arr[j];
      i++;
      arr[j] = temp;
      j--;
    }
    return arr.join('');
  }

  let index = 0;

  for (let i = str.length - 1; i >= 0; i--) {
    if (str[i] === str[index]) index++;
  }

  if (index === str.length) return str;

  const remainingRev = str.substring(index, str.length);

  const start = reverse(remainingRev, 0, remainingRev.length - 1);
  const mid = palindrome(str.substring(0, index));
  const last = str.substring(index);

  return start + mid + last;
}

📝 2. 엘레베이터 고르기 ( pickElevator )


  • 당신은 지각 직전의 회사원입니다.

  • 총 2대의 엘레베이터 중 가장 빨리 도착하는 것을 찾아 탑승해야 제시간에 도착할 수 있습니다.

  • 인자로 left, right, call가 주어집니다.

  • 세 인자는 모두 number 타입입니다.

  • left와 right는 각 엘레베이터의 현재 층을 의미합니다.

  • call은 당신이 현재 위치한 층을 의미합니다.
    당신의 목표는 가장 빠르게 탑승할 수 있는 엘레베이터를 찾는 것입니다.

  • 두 엘레베이터 모두 당신이 있는 층으로 오고 있으며, 어떠한 것을 타더라도 당신이 목표한 층으로 바로 이동한다고 가정합니다.

  • left 엘레베이터가 가장 먼저 도착한다면 문자열 “left”를 리턴해주세요.

  • right 엘레베이터가 가장 먼저 도착한다면 문자열 “right”를 리턴해주세요.

  • 만약 두 엘레베이터가 동시에 도착한다면 “right”를 리턴해주세요.

  • 최고층은 13층입니다.

▷ 입출력 예

pickElevator(4, 13, 2) // "left"
pickElevator(8, 1, 2) // "right"

▷ 내 풀이

function pickElevator(left, right, call) {
  // 여기에서 작업하세요.
  return Math.abs(left - call) >= Math.abs(right - call) ? "right" : "left";
}

📝 3. 배열 회전 ( rotateArray )


  • 숫자를 요소로 가진 배열 belt과 숫자 sec가 주어집니다.

  • belt는 무한히 회전하는 컨베이어 벨트입니다.

  • 해당 belt 위에는 숫자들이 올라가 있으며 숫자들은 1초마다 한칸씩 오른쪽으로 이동합니다.

    • 예를 들어, belt가 [1, 2, 3, 4]라면
    • 1초 뒤 => [4, 1, 2, 3]
    • 2초 뒤 => [3, 4, 1, 2]
  • belt의 요소들이 sec초 동안 이동한 후의 배열을 리턴해주세요.

▷ 입출력 예

rotateArray([1, 2, 3, 4, 5, 6, 7], 3) // [5, 6, 7, 1, 2, 3, 4]
rotateArray([5, 6, -2, 3, -9, 1, -8], 12) // [-2, 3, -9, 1, -8, 5, 6]

▷ 내 풀이

function rotateArray(belt, sec) {
  // 여기에서 작업하세요.
  let answer = [];
  sec = sec % belt.length;
  for (let i = 0; i < belt.length; i++) {
    answer.push(belt[(i - sec + belt.length) % belt.length]);
  }
  return answer;
}

▷ unfhift 매서드 사용 풀이

function rotateArray(belt, sec) {
  for (let i = 0; i < sec; i++) {
    belt.unshift(belt.pop());
  }
  return belt;
}

📝 4. 지그재그 ( zigzag )


  • 문자열 str과 숫자 row가 주어집니다.
  • 해당 문자열 str을 주어진 row만큼의 열(row)의 길이를 가진 지그재그 패턴을 만들어주세요.
  • 예를 들어, "ALGORITHMTEST"(str)와 3(row)이 주어진다면 아래와 같은 패턴이 만들어집니다.
  • 만약 지그재그가 만들어질 수 없는 조건이라면 str을 그대로 리턴해야합니다.
    A       R       M       T
      L   O   I   H   T   S
        G       T       E
  • 만들어진 지그재그 패턴 str을 첫번째 row부터 차례대로 읽은 문자열을 리턴해주세요.
"ARMTLOIHTSGTE"

▷ 입출력 예

zigzag("ALGORITHMTEST", 3) // "ARMTLOIHTSGTE"
zigzag("CODECAMP", 2) // "CDCMOEAP"
zigzag("TEST", 6) // "TEST"

▷ 내 풀이

function zigzag(str, row) {
  // 여기에서 작업하세요.
  let answer = "";

  if (str.length < row) {
    answer += str;
  } else {
    answer += str[0];
    let idx = row + 1;

    for (let i = 1; i < Math.floor(str.length / row); i++) {
      answer += str[idx];
      idx += row + 1;
    }
    // for(let i = 1; i < Math.floor(str.length / row); i++){
    //   answer += str[]
    // }
  }
  return answer;
}

▷ 해결 못함 ❌

▷ 레퍼런스 코드

function zigzag(str, row) {
  // 지그재그로 만들 수 없는 조건이라면,str을 그대로 리턴
  if (row === 1 || str.length < row) return str;

  // row 세팅
  const answer = [];
  for (let i = 0; i < row; i++) answer[i] = [];

  let reverse = false;
  let idx = 0;
  for (let i = 0; i < str.length; i++) {
    answer[idx].push(str[i]);
    reverse ? idx-- : idx++;
    // 변환점에 도달할 때마다 push 방향 전환
    if (idx === row - 1 || idx === 0) reverse = !reverse;
  }

  // 완성된 문자열 결합
  return answer.map((a) => a.join('')).join('');
}

출처: 코드캠프

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

0개의 댓글