✔️ 코딩테스트 입문

✅ check

  • index 활용: indexOf(), findIndex(), find()
  • sort()
  • 구조 분해 할당 활용
  • 메서드 활용 방법
  • for문에서 길이 조건 생략하기
  • new Set()
  • map()에서 데이터 값 조건 생략하기 (map((_, i) => i + 1))

🌿 암호 해독

🌱 문제 설명

군 전략가 머쓱이는 전쟁 중 적군이 다음과 같은 암호 체계를 사용한다는 것을 알아냈습니다.

암호화된 문자열 cipher를 주고받습니다.
그 문자열에서 code의 배수 번째 글자만 진짜 암호입니다.
문자열 cipher와 정수 code가 매개변수로 주어질 때 해독된 암호 문자열을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ cipher의 길이 ≤ 1,000
  • 1 ≤ code ≤ cipher의 길이
  • cipher는 소문자와 공백으로만 구성되어 있습니다.
  • 공백도 하나의 문자로 취급합니다.

🌱 입출력 예

|cipher| code| result|
|"dfjardstddetckdaccccdegk"| 4| "attack"|
|"pfqallllabwaoclk"| 2| "fallback"|

🌱 내 코드

const solution = (cipher, code) => {
  let answer = [];
  const cipherArr = Array.from(cipher)
    for(let i = code; i <= cipherArr.length; i++){
      if( i % code === 0){
      answer.push(cipherArr[i-1])
      }
    }
  
  return answer.join('');
}

🌱 다른 사람 풀이

function solution(cipher, code) {
  var answer = "";
  // i 를 code 배수 만큼 더해서 처리
  for (let i = code - 1; i < cipher.length; i += code) {
    answer += cipher[i];
  }
  return answer;
}

function solution(cipher, code) {
  // index를 code 배수로 체크해서 처리
    return cipher.split('').filter((_, index) => (index + 1) % code === 0).join('');
}

🌿 가장 큰 수 찾기

🌱 문제 설명

정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

🌱 제한 사항

  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array 원소 ≤ 1,000
  • array에 중복된 숫자는 없습니다.

🌱 입출력 예

arrayresult
[1, 8, 3][8, 1]
[9, 10, 11, 8][11, 2]

🌱 내 코드

const solution = (array) => {
  let answer = [];
  answer[0] = Math.max(...array)
  array.forEach((el, i) => {
    el === answer[0]? answer[1] = i : ''
  } )
  
  return answer;
}

🌱 다른 사람 풀이

function solution(array) {
    let max = Math.max(...array);
    return [max, array.indexOf(max)];
}

function solution(array) {
    return [Math.max(...array), array.findIndex(el => el === Math.max(...array))];
}

📌 index 활용하기

  • indexOf(): 주어진 요소의 첫 번째 index 번호 반환, 없을 경우 -1 반환
    • indexOf(searchElement, fromIndex)
    • fromIndex: optional, 검색을 시작할 index 번호, 음수일 경우 배열 끝부터 시작( -1 = -1+ array.length)
    • 특정 '값'만 검색 가능
  • findIndex(): 주어진 요소의 첫 번째 index 번호 반환, 없을 경우 -1 반환
    • 대상이 객체이거나 특정 '값'이 아닌 조건으로 찾을 경우 indexOf() 사용 불가
    • 위의 경우에 findIndex() 활용!
  • cf. find(): 찾은 값 자체를 반환

🌿 문자열 정렬하기(1)

🌱 문제 설명

문자열 my_string이 매개변수로 주어질 때, my_string 안에 있는 숫자만 골라 오름차순 정렬한 리스트를 return 하도록 solution 함수를 작성해보세요.

🌱 제한 사항

  • 1 ≤ my_string의 길이 ≤ 100
  • my_string에는 숫자가 한 개 이상 포함되어 있습니다.
  • my_string은 영어 소문자 또는 0부터 9까지의 숫자로 이루어져 있습니다.

🌱 입출력 예

my_stringresult
"hi12392"[1, 2, 2, 3, 9]
"p2o4i8gj2"[2, 2, 4, 8]
"abcde0"[0]

🌱 내 코드

const solution = (my_string) => {
  let answer = [];
  const numArr = Array.from(my_string).map(el => Number(el))
  numArr.forEach(el => isNaN(el) ? '': answer.push(el))
  
  return answer.sort((a, b) => a - b)
}

🌱 다른 사람 풀이

function solution(my_string) {
  // 정규 표현식
    return my_string.match(/\d/g).sort((a, b) => a - b).map(n => Number(n));
}

function solution(my_string) {
  // isNaN()을 통해 숫자가 아닌 값을 걸러내고 v*1을 통해 숫자로 변환
    return my_string.split("").filter((v) => !isNaN(v)).map((v) => v*1).sort((a,b) => a-b)
}

🌿 주사위의 개수

🌱 문제 설명

머쓱이는 직육면체 모양의 상자를 하나 가지고 있는데 이 상자에 정육면체 모양의 주사위를 최대한 많이 채우고 싶습니다. 상자의 가로, 세로, 높이가 저장되어있는 배열 box와 주사위 모서리의 길이 정수 n이 매개변수로 주어졌을 때, 상자에 들어갈 수 있는 주사위의 최대 개수를 return 하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • box의 길이는 3입니다.
  • box[0] = 상자의 가로 길이
  • box[1] = 상자의 세로 길이
  • box[2] = 상자의 높이 길이
  • 1 ≤ box의 원소 ≤ 100
  • 1 ≤ n ≤ 50
  • n ≤ box의 원소
  • 주사위는 상자와 평행하게 넣습니다.

🌱 입출력 예

boxnresult
[1, 1, 1]11
[10, 8, 6]312

🌱 내 코드

const solution = (box, n) => {
  let a = Math.floor(box[0] / n)
  let b = Math.floor(box[1] / n)
  let c = Math.floor(box[2] / n)
  
  return a* b* c
}

🌱 다른 사람 풀이

function solution(box, n) {
  // 구조 분해 할당으로 좀 더 명시적으로 표현
    let [width, length, height] = box;
  
    return Math.floor(width / n) * Math.floor(length / n) * Math.floor(height / n);
}

function solution(box, n) {
  // reduce로 간결하게 표현
    return box.reduce((acc,v) => acc * Math.floor(v / n), 1);
}

🌿 인덱스 바꾸기

🌱 문제 설명

문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

🌱 제한 사항

  • 1 < my_string의 길이 < 100
  • 0 ≤ num1, num2 < my_string의 길이
  • my_string은 소문자로 이루어져 있습니다.
  • num1 ≠ num2

🌱 입출력 예

my_stringnum1num2result
"hello"12"hlelo"
"I love you"36"I l veoyou"

🌱 내 코드

const solution = (my_string, num1, num2) => {
  const str = my_string.split('')
  
  const first = str[num1]
  const second = str[num2]
  
  str[num1] = second;
  str[num2] = first;
  
  return str.join('')
}

🌱 다른 사람 풀이

function solution(my_string, num1, num2) {
    my_string = my_string.split('');
  // 구조 분해 할당으로 한번에 요소 교체
    [my_string[num1], my_string[num2]] = [my_string[num2], my_string[num1]];
    return my_string.join('');
}

🌿 약수 구하기

🌱 문제 설명

정수 n이 매개변수로 주어질 때, n의 약수를 오름차순으로 담은 배열을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ n ≤ 10,000

🌱 입출력 예

nresult
24[1, 2, 3, 4, 6, 8, 12, 24]
29[1, 29]

🌱 내 코드

const solution = (n) => {
  let answer = [];
  for(let i = 1; i <= n; i ++){
    if( n % i === 0){
     answer.push(i) 
    }
  }
  return answer;
}

🌱 다른 사람 풀이

function solution(n) {
    return Array(n).fill(0).map((v, index) => v+index+1).filter((v) => n%v===0);
}

🌿 배열 회전시키기

🌱 문제 설명

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 3 ≤ numbers의 길이 ≤ 20
  • direction은 "left" 와 "right" 둘 중 하나입니다.

🌱 입출력 예

numbersdirectionresult
[1, 2, 3]"right"[3, 1, 2]
[4, 455, 6, 4, -1, 45, 6]"left"[455, 6, 4, -1, 45, 6, 4]

🌱 내 코드

const solution =(numbers, direction) => {
  if ( direction === 'right') {
    numbers.unshift(numbers[numbers.length - 1])
    numbers.pop()
  }
  
  if ( direction === 'left') {
    numbers.push(numbers[0])
    numbers.shift(numbers[0])
  }
  
  return numbers
}

🌱 다른 사람 풀이

function solution(numbers, direction) {
  // numbers.unshift(numbers.pop()): pop으로 요소를 제거하고, 이 요소를 unshift 한다.
  // numbers.push(numbers.shift()): shift로 요소를 제거하고, 이 요소를 push 한다.
    direction === 'right' ? numbers.unshift(numbers.pop()) : numbers.push(numbers.shift());
    return numbers;
}

🌿 외계 행성의 나이

🌱 문제 설명

우주여행을 하던 머쓱이는 엔진 고장으로 PROGRAMMERS-962 행성에 불시착하게 됐습니다. 입국심사에서 나이를 말해야 하는데, PROGRAMMERS-962 행성에서는 나이를 알파벳으로 말하고 있습니다. a는 0, b는 1, c는 2, ..., j는 9입니다. 예를 들어 23살은 cd, 51살은 fb로 표현합니다. 나이 age가 매개변수로 주어질 때 PROGRAMMER-962식 나이를 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • age는 자연수입니다.
  • age ≤ 1,000
  • PROGRAMMERS-962 행성은 알파벳 소문자만 사용합니다.

🌱 입출력 예

ageresult
23"cd"
51"fb"
100"baa"

🌱 내 코드

const solution = (age) => {
  const arr = ['a', 'b', 'c', 'd', 'e', "f", "g", 'h', 'i', 'j'];
  const numArr =  Array.from(age.toString())

  let result = [];
  numArr.map((el) => result.push(arr[Number(el)]))
  
  return result.join('');
}

🌱 다른 사람 풀이

function solution(age) {
  return age
    .toString()
    .split("")
    .map((v) => "abcdefghij"[v])
    .join("");
}

map 안에서 직접 문자열을 사용하기 때문에, 임시 배열을 사용하지 않고 결과적으로 메모리를 덜 사용하고 간결한 코드


🌿 피자 나눠 먹기(2)

🌱 문제 설명

머쓱이네 피자가게는 피자를 여섯 조각으로 잘라 줍니다. 피자를 나눠먹을 사람의 수 n이 매개변수로 주어질 때, n명이 주문한 피자를 남기지 않고 모두 같은 수의 피자 조각을 먹어야 한다면 최소 몇 판을 시켜야 하는지를 return 하도록 solution 함수를 완성해보세요.

🌱 제한 사항

  • 1 ≤ n ≤ 100

🌱 입출력 예

nresult
61
105
42

🌱 내 코드

const solution = (n) => {
  const pieces = 6;
  for( let i = 1; i<= 100; i ++){
    if( pieces * i % n === 0){
      return i;
    }
  }
}

🌱 다른 사람 풀이

const solution = (n) => {
  const pieces = 6;
  // for문 3가지 중 필요없는 없는 조건 ( 길이)는 ; ; 로 생략 가능
  for( let i = 1; ;i ++){
    if( pieces * i % n === 0){
      return i;
    }
  }
}

📌 for문 3가지 중 필요없는 없는 조건 ( 길이)는 ; ; 로 생략 가능


🌿 369 게임

🌱 문제 설명

머쓱이는 친구들과 369게임을 하고 있습니다. 369게임은 1부터 숫자를 하나씩 대며 3, 6, 9가 들어가는 숫자는 숫자 대신 3, 6, 9의 개수만큼 박수를 치는 게임입니다. 머쓱이가 말해야하는 숫자 order가 매개변수로 주어질 때, 머쓱이가 쳐야할 박수 횟수를 return 하도록 solution 함수를 완성해보세요.

🌱 제한 사항

  • 1 ≤ order ≤ 1,000,000

🌱 입출력 예

orderresult
31
294232

🌱 내 코드

const solution = (order) => {
  const orderArr = Array.from(order.toString());
  orderArr.map(el => Number(el));
  
  let clap = [];
  // 10, 100 등 '0' 의 경우 생각해야함
  orderArr.forEach(el => {
    if(el !== '0' && el % 3 === 0){
      clap.push(el)
    }
  });
  
  return clap.length;
}

🌱 다른 사람 풀이

function solution(order) {
    const mySet = new Set([3,6,9]);
    return String(order).split('')
                        .filter(num => mySet.has(Number(num)))
                        .length;
}

📌 new set(): 중복을 허용하지 않는 Collection, 동일한 값은 1개만 저장, 대소문자 구분

  • Set.add(value): 요소 추가
const nums = new Set([1, 2, 3]);
nums.add(4); // set(4) {1, 2, 3, 4}
  • Set.delete(value): 요소 삭제
nums.delete(1); // set(3) {2, 3, 4}
  • Set.has(value): 요소 존재 여부 확인
nums.has(3) // true
nums.has(1) // false
  • Set.size: 요소 갯수 확인
console.log(nums.size); // 3
  • Set.clear(value): 요소 전체 삭제
nums.clear() // set(0) {}

🌿 합성수 찾기

🌱 문제 설명

약수의 개수가 세 개 이상인 수를 합성수라고 합니다. 자연수 n이 매개변수로 주어질 때 n이하의 합성수의 개수를 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ n ≤ 100

🌱 입출력 예

nresult
105
158

🌱 내 코드

const solution = (n) => {
  const result = [];
  const divider =[2,3,5,7];
  
  for(let i = 1; i <= n; i ++){
    for(let j = 0; j < divider.length; j ++){
      if(i !== divider[j] && i% divider[j] === 0){
      result.push(i)
      }
    }
  }
  
  const answer = new Set(result)
  return answer.size;
}

🌱 다른 사람 풀이

function solution(n) {
  return Array(n)
    .fill()
    // .map((_, i) => i + 1)은 데이터 값은 확인하지 않고, 데이터가 몇번째 데이터인지만 확인한다는 뜻
    .map((_, i) => i + 1)
    .filter((i) => {
      let cnt = 0;
      for (let j = 1; j <= i; j++) {
        if (i % j === 0) cnt++;
      }
      return cnt >= 3;
    }).length;
}

📌 map((_, i) => i + 1)

  • _: 데이터의 값은 확인하지 않고, 데이터가 몇 번째 데이터인지만 확인한다.

0개의 댓글