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