programmers) coding test 4

Yeonn·2024년 4월 12일
0

coding test

목록 보기
4/13
post-thumbnail

✔️ 코딩테스트 입문

✅ check

  • findIndex
  • for문의 활용
  • Number.isInteger()
  • sort() 활용
  • indexOf()

🌿 중복된 문자 제거

🌱 문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string에서 중복된 문자를 제거하고 하나의 문자만 남긴 문자열을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ my_string ≤ 110
  • my_string은 대문자, 소문자, 공백으로 구성되어 있습니다.
  • 대문자와 소문자를 구분합니다.
  • 공백(" ")도 하나의 문자로 구분합니다.
  • 중복된 문자 중 가장 앞에 있는 문자를 남깁니다.

🌱 입출력 예

my_stringresult
"people""peol"
"We are the world""We arthwold"

🌱 내 코드

const solution = (my_string) => {
  let only = new Set(my_string)
  
  return Array.from(only).join('')
}

🌱 다른 사람 풀이

function solution(my_string) {
  // 임시 배열에 담을 필요 없이 전개 연산자로 바로 join 가능
    return [...new Set(my_string)].join('');
}

🌿 모스 부호(1)

🌱 문제 설명

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}

🌱 제한 사항

  • 1 ≤ letter의 길이 ≤ 1,000
  • return값은 소문자입니다.
  • letter의 모스부호는 공백으로 나누어져 있습니다.
  • letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다.

🌱 입출력 예

letterresult
".... . .-.. .-.. ---""hello"
".--. -.-- - .... --- -.""python"

🌱 내 코드

const solution = (letter) => {
  let realLetter = '';
  for( let a of letter.split(' ') ) {
    for( let key of Object.keys(morse) ){
      if( key === a ){
        realLetter += morse[a]
      }
    }
  }
  
  return realLetter;
}

letter를 공백을 기준으로 나누어 a로 지정, morse 객체의 key를 다시 뽑아서 비교해서 출력했다.

🌱 다른 사람 풀이

morse 객체의 key를 따로 뽑지 않고 프로퍼티에 직접 접근(objectName[key])하여 map을 활용하여 코드 길이도 줄이고 좀 더 직관적으로 풀이할 수 있다.

function solution(letter) {
    return letter.split(' ').map(v=>morse[v]).join('');
}

🌿 진료 순서 정하기

🌱 문제 설명

외과의사 머쓱이는 응급실에 온 환자의 응급도를 기준으로 진료 순서를 정하려고 합니다. 정수 배열 emergency가 매개변수로 주어질 때 응급도가 높은 순서대로 진료 순서를 정한 배열을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 중복된 원소는 없습니다.
  • 1 ≤ emergency의 길이 ≤ 10
  • 1 ≤ emergency의 원소 ≤ 100

🌱 입출력 예

emergencyresult
[3, 76, 24][3, 1, 2]
[1, 2, 3, 4, 5, 6, 7][7, 6, 5, 4, 3, 2, 1]
[30, 10, 23, 6, 100][2, 4, 3, 5, 1]

🌱 내 코드

const solution = (emergency) => {  
  const priority = [...emergency].sort((a,b) => b-a );
  
  return emergency.map((el) => {
    for( let i = 0; i <= priority.length; i ++){
      if( el === priority[i]){
        return i+1;
      }    
    }
  })
}

🌱 다른 사람 풀이

function solution(emergency) {
    let sort = [...emergency].sort((a, b) => b - a);
    return emergency.map(k => {
        const queue = sort.findIndex(v => v === k);

        return queue + 1
    });
}

📍 findIndex()

  • 배열 요소를 순회하면서 인수로 전달된 콜백 함수를 호출하여 반환값이 true인 첫 번째 요소의 인덱스 반환
  • 콜백 함수의 반환값이 true인 요소가 존재하지 않으면 -1 반환

🌿 팩토리얼

🌱 문제 설명

i팩토리얼 (i!)은 1부터 i까지 정수의 곱을 의미합니다. 예를들어 5! = 5 4 3 2 1 = 120 입니다. 정수 n이 주어질 때 다음 조건을 만족하는 가장 큰 정수 i를 return 하도록 solution 함수를 완성해주세요.

  • i! ≤ n

🌱 제한 사항

  • 0 < n ≤ 3,628,800

🌱 입출력 예

nresult
362880010
73

🌱 내 코드

const solution = (n) => {
  let result = n;
  let i = 1;
  if (n === 1) return 1;

  for( ; i <= result; i ++){
  result /= i;

  if( result === 1 ) return i ;
  }
  
  // result === 1 이 아닐 경우 for 문을 돌고 나온 i에 -1 함
  return i -1;
}

🌱 다른 사람 풀이

function solution(n) {
    for(let i = 1, v = 1; true; v *= ++i) if(v > n) return --i;
}

📍 for문

  • for(let i = 1, v = 1; true; v *= ++i)
  • 초기화: let i = 1, v = 1;
    • i는 1부터 시작하고 v는 현재까지 계산된 팩토리얼 값을 저장
  • 조건 부분: true
    • true는 항상 참이므로 무한 루프를 의미
    • if문 내에서 명시적으로 루프를 종료할 때까지 반복
  • 증감 부분: v*= ++i
    • ++1: 먼저 1 증가시킨 후 증가된 값 사용
    • v*= 현재 v++i를 곱한 값을 다시 v에 저장,
  • 루프 내용: if(v > n) return --i;
    • vn보다 커지면 루프를 종료
    • return --i;: i를 1 감소시키고 반환( 마지막 v가 범위를 벗어나서 for문이 종료되었기 때문 )

🌿 숨어있는 숫자의 덧셈 (2)

🌱 문제 설명

문자열 my_string이 매개변수로 주어집니다. my_string은 소문자, 대문자, 자연수로만 구성되어있습니다. my_string안의 자연수들의 합을 return하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • 1 ≤ my_string 안의 자연수 ≤ 1000
  • 연속된 수는 하나의 숫자로 간주합니다.
  • 000123과 같이 0이 선행하는 경우는 없습니다.
  • 문자열에 자연수가 없는 경우 0을 return 해주세요.

🌱 입출력 예

my_stringresult
"aAb1B2cC34oOp"37
"1a2b3c4d123Z"133

🌱 내 코드

const solution = (my_string) => {
  let currentNum = 0;
  let sum = 0;
  
  for(let i = 0; i <= my_string.length; i ++){
    let thisNum = my_string[i];
    
    if( Number.isInteger(Number(thisNum)) ) {
      currentNum = currentNum * 10 + Number(thisNum);
    }else{
      sum += currentNum;
      currentNum = 0;
    }
  }
  
  return sum;
}

📍 Number.isInteger()

  • 인수로 전달된 숫자값이 정수( integer )인지 검사하여 그 결과를 불리언 값으로 반환

🌿 가까운 수

🌱 문제 설명

정수 배열 array와 정수 n이 매개변수로 주어질 때, array에 들어있는 정수 중 n과 가장 가까운 수를 return 하도록 solution 함수를 완성해주세요.

🌱 제한 사항

  • 1 ≤ array의 길이 ≤ 100
  • 1 ≤ array의 원소 ≤ 100
  • 1 ≤ n ≤ 100
  • 가장 가까운 수가 여러 개일 경우 더 작은 수를 return 합니다.

🌱 입출력 예

arraynresult
[3, 10, 28]2028
[10, 11, 12]1312

🌱 내 코드

const solution = (array, n) => {
  let arr = [...array];
  arr.push(n);
  arr.sort((a,b) => a-b);

  const num = arr.indexOf(n)

  if( !arr[num+1]) return arr[num-1]
  if( arr[num] - arr[num-1] < arr[num+1] - arr[num]){
    return arr[num-1];
  }
  if( arr[num] - arr[num-1] === arr[num+1] - arr[num]){
    return arr[num-1];
  }
  else return arr[num+1];
}

🌱 다른 사람 풀이

// Math.abs
function solution(array, n) {
    array.sort((a,b) => Math.abs(n - a) - Math.abs(n - b) || a - b);

    return array[0];
}

📍 array.sort((a, b) => Math.abs(n - a) - Math.abs(n - b) || a - b);

  • 기본 비교 조건: Math.abs(n - a) - Math.abs(n - b)
    • 각 원소 a와 b가 주어진 n과 얼마나 가까운 지를 기준으로 정렬
    • Math.abs(n - a): a와 n의 절대값 차이
    • Math.abs(n - b): b와 n의 절대값 차이
    • 절대값 차이의 차이가 양수이면 b가 n에 더 가깝고, 음수이면 a가 n에 더 가까움
  • 보조 비교 조건: || a - b
    • 기본 비교 조건의 값이 동일할 경우 실행
    • 기본 조건이 같을 때는 값 자체로 정렬

🌿 문자열 밀기

🌱 문제 설명

문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.

🌱 제한 사항

  • 0 < A의 길이 = B의 길이 < 100
  • A, B는 알파벳 소문자로 이루어져 있습니다.

🌱 입출력 예

ABresult
"hello""ohell"1
"apple""elppa"-1
"atat""tata"1
"abc""abc"0

🌱 내 코드

const solution = (A, B) => {
  const arrA = [...A]
  const arrB = [...B];
  let num = 0;
  
  if( A === B ) return 0;

  for (let i = 1; i <= arrA.length; i++){
    arrA.unshift(arrA.pop())
    
    if( arrA.join('') === arrB.join('')) {
      num = i;
      break;
    }
  } 
  
 return num === 0 ? -1 : num
}

🌱 다른 사람 풀이

let solution=(a,b)=>(b+b).indexOf(a)
  • (b+b): 문자열 두 배로 이어붙여서 모든 회전 가능성을 가진 문자열을 만듬
  • .indexOf(a): 해당하는 문자열의 인덱스를 반환하는 방법으로 회전 수를 찾음

📍 indexOf()

  • 배열에 특정 요소가 존재하는지 확인할 때 유용한 메서드
    • 원본 배열에 인수로 전달한 요소와 중복되는 요소가 여러 개 있다면 첫 번째로 검색된 요소의 인덱스 반환
    • 원본 배열에 인수로 전달한 요소가 존재하지 않으면 -1 반환

0개의 댓글