Bomb Kirby Running

코딩 테스트 챌린지

코딩 테스트 25

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

Twenty years from now you will be more disappointed by the things that you didn’t do than by the ones you did do, so throw off the bowlines, sail away from safe harbor, catch the trade winds in your sails. Explore, Dream, Discover.

Mark Twain

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` 배열의 마지막 원소에 등비의 비율을 곱한 값입니다.