Bomb Kirby Running

코딩 테스트 챌린지

코딩 테스트 25

^. ̫ .^ 2023. 6. 9. 21:55

728x90

문제1 문자열 밀기

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

 

제한사항

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

입출력 예

A B
result
"hello" "ohell" 1
"apple" "elppa" -1
"atat" "tata" 1
"abc" "abc" 0

 

function solution(A, B) {
    if (A.length !== B.length) {
        return -1;
    }

    var count = 0;
    while (A !== B) {
        A = A[A.length - 1] + A.substring(0, A.length - 1);
        count++;

        if (count > A.length) {
            return -1;
        }
    }

    return count;
}

 

문자열 A와 B의 길이가 다르면 문자열 A를 밀어서 문자열 B를 만들 수 없으므로 -1을 반환합니다.
문자열 A의 길이와 B의 길이가 같으면 문자열 A를 오른쪽으로 한 칸씩 밀면서 B와 일치하는지 확인합니다.
A를 오른쪽으로 한 칸씩 밀 때마다 이동 횟수를 증가시킵니다. 이동 횟수를 저장하는 변수를 answer라고 합니다.
A를 한 칸씩 오른쪽으로 밀 때는 A의 마지막 문자를 임시 변수에 저장하고, 나머지 문자열을 한 칸씩 왼쪽으로 이동시킵니다. 마지막으로 저장한 문자를 A의 첫 번째 문자로 위치시킵니다.
A와 B가 일치하는 경우 최소 이동 횟수인 answer를 반환합니다.
만약 A를 조작하여 B를 만들 수 없는 경우 answer가 A의 길이보다 큰 경우입니다. 이 경우에는 -1을 반환합니다.

 

문제2 종이 자르기

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.

 

 

제한사항

  • 0 < M, N < 100
  • 종이를 겹쳐서 자를 수 없습니다.

입출력 예

M N result
2 2 3
2 5 9
1 1 0
function solution(M, N) {
    var answer = 0;

    let cutM = M - 1;
    let cutN = N - 1;

    answer = cutM * N + cutN;

    return answer;
}

 

 

문제3 연속된 수의 합

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.

 

제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

입출력 예

num total
result
3 12 [3, 4, 5]
5 15 [1, 2, 3, 4, 5]
4 14 [2, 3, 4, 5]
5 5 [-1, 0, 1, 2, 3]
function solution(num, total) {
    var min = Math.ceil(total/num - Math.floor(num/2));
    var max = Math.floor(total/num + Math.floor(num/2));

    return new Array(max-min+1).fill(0).map((el,i)=>{return i+min;});
}

 

주어진 정수 배열의 첫 번째 값(`min`)과 마지막 값(`max`)을 계산합니다.
`min`은 `total/num - num/2`를 올림한 값입니다.

`max`은 `total/num + num/2`를 내림한 값입니다.

 

`min`부터 `max`까지의 정수 배열을 생성합니다.
`new Array(max-min+1)`로 배열을 생성하고, `fill(0)`으로 초기화합니다.
`map()` 함수를 사용하여 배열의 각 요소에 접근하여 값을 할당합니다.
`i+min`을 통해 `min`부터 시작하여 순차적으로 값을 할당합니다.

최종적으로 구성된 정수 배열을 반환합니다.

 

문제4 다음에 올 숫자

등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.

 

제한사항

  • 2 < common의 길이 < 1,000
  • -1,000 < common의 원소 < 2,000
    • common의 원소는 모두 정수입니다.
  • 등차수열 혹은 등비수열이 아닌 경우는 없습니다.
  • 등비수열인 경우 공비는 0이 아닌 정수입니다.

입출력 예

common result
[1, 2, 3, 4] 5
[2, 4, 8] 16
function solution(common) {
  const first = common[0];
  const second = common[1]; 
  let answer = 0;

  if (common.length === 2) {
    answer = second + (second - first);
  } else {
    const third = common[2];

    if (second - first === third - second) {
      const diff = second - first; 
      answer = common[common.length - 1] + diff;
    } else {
      const ratio = second / first; 
      answer = common[common.length - 1] * ratio;
    }
  }

  return answer;
}


`common` 배열의 길이가 2인 경우:
등차수열인 경우: 다음에 올 숫자는 `common`의 두 번째 원소에 등차의 차이값을 더한 값입니다.
 등비수열인 경우: 다음에 올 숫자는 `common`의 두 번째 원소에 `common`의 두 번째 원소와 첫 번째 원소의 차이값을 더한 값입니다.
`common` 배열의 길이가 3 이상인 경우:

 등차수열인 경우: `common` 배열의 첫 번째 원소와 두 번째 원소의 차이값이 `common` 배열의 두 번째 원소와 세 번째 원소의 차이값과 같은지 확인합니다. 같다면 등차의 차이값을 구하고, 다음에 올 숫자는 `common` 배열의 마지막 원소에 등차의 차이값을 더한 값입니다.
등비수열인 경우: `common` 배열의 첫 번째 원소와 두 번째 원소의 비율이 `common` 배열의 두 번째 원소와 세 번째 원소의 비율과 같은지 확인합니다. 같다면 등비의 비율을 구하고, 다음에 올 숫자는 `common` 배열의 마지막 원소에 등비의 비율을 곱한 값입니다.