코딩테스트 25일차
문자열 밀기
문자열 "hello"에서 각 문자를 오른쪽으로 한 칸씩 밀고 마지막 문자는 맨 앞으로 이동시키면 "ohell"이 됩니다. 이것을 문자열을 민다고 정의한다면 문자열 A와 B가 매개변수로 주어질 때, A를 밀어서 B가 될 수 있다면 밀어야 하는 최소 횟수를 return하고 밀어서 B가 될 수 없으면 -1을 return 하도록 solution 함수를 완성해보세요.
function solution(A, B) {
var answer = 0;
if (A.length !== B.length) {
return -1;
}
while (A !== B) {
A = A.charAt(A.length - 1) + A.slice(0, A.length - 1);
answer++;
if (answer > A.length) {
return -1;
}
}
return answer;
}
✏️풀이
var answer = 0;: 최소 회전 횟수를 저장하기 위한 변수 answer를 초기화합니다.
if (A.length !== B.length) { return -1; }: 문자열 A와 B의 길이가 다를 경우, 즉, 동일한 길이로 만들 수 없는 경우 -1을 반환합니다.
while (A !== B) {...}: 문자열 A가 B와 동일해질 때까지 반복합니다. 이때, A를 회전시키는 연산을 수행하고 회전 횟수 answer를 증가시킵니다.
A = A.charAt(A.length - 1) + A.slice(0, A.length - 1);: 문자열 A를 회전시키기 위해, A의 마지막 문자를 첫 번째로 이동시킵니다. 이를 위해 charAt() 함수와 slice() 함수를 사용합니다.
answer++;: 회전 횟수 answer를 1 증가시킵니다.
if (answer > A.length) { return -1; }: 회전 횟수 answer가 A의 길이보다 크다면, 즉, 동일한 문자열을 만들 수 없는 경우 -1을 반환합니다. 이는 A의 길이만큼 회전해도 B와 동일한 문자열을 만들 수 없다는 것을 의미합니다.
return answer;: 최소 회전 횟수 answer를 반환합니다.
종이 자르기
머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.
function solution(M, N) {
var answer = 0;
if (M === 1 && N === 1) {
return 0; // 이미 1x1 크기인 경우 가위질이 필요하지 않으므로 0을 반환
}
// 최소 가위질 횟수는 가로 길이와 세로 길이의 곱에서 1을 뺀 값과 같음
answer = M * N - 1;
return answer;
}
✏️풀이
먼저 answer 변수를 0으로 초기화합니다.
조건문을 사용하여 가로 길이와 세로 길이가 모두 1인 경우를 확인합니다. 이 경우 이미 종이의 크기가 1x1이므로 가위질이 필요하지 않으므로 0을 반환합니다.
위의 조건을 만족하지 않는 경우, 최소 가위질 횟수를 계산합니다. 가로 길이와 세로 길이를 곱한 값에서 1을 뺀 결과를 answer 변수에 저장합니다. 이 값은 가로와 세로 방향으로 1x1 크기로 종이를 자르는 데 필요한 최소한의 가위질 횟수입니다.
최종적으로 answer 변수를 반환하여 결과를 돌려줍니다.
연속된 수의 합
연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.
function solution(num, total) {
var answer = [];
// 연속된 수의 시작값 계산
var start = Math.floor(total / num) - Math.floor((num - 1) / 2);
// 시작값부터 num개의 연속된 수를 배열에 추가
for (var i = 0; i < num; i++) {
answer.push(start + i);
}
return answer;
}
✏️풀이
function solution(num, total) {: solution이라는 함수를 정의하고, 매개변수로 num과 total을 받습니다.
var answer = [];: 빈 배열 answer를 선언하여 결과를 저장할 준비를 합니다.
var start = Math.floor(total / num) - Math.floor((num - 1) / 2);: 연속된 수의 시작값을 계산합니다. total을 num으로 나눈 몫에 (num - 1) / 2를 뺀 값입니다. 이를 통해 연속된 수의 중간값을 구하고, 이를 시작값으로 사용합니다.
for (var i = 0; i < num; i++) {: 반복문을 통해 num개의 연속된 수를 계산합니다.
answer.push(start + i);: 시작값과 i를 더한 값을 answer 배열에 추가합니다. 이를 통해 연속된 수를 생성합니다.
return answer;: 계산된 연속된 수들이 담긴 배열 answer를 반환합니다.
}: 함수 정의를 마무리합니다.
다음에 올 숫자
등차수열 혹은 등비수열 common이 매개변수로 주어질 때, 마지막 원소 다음으로 올 숫자를 return 하도록 solution 함수를 완성해보세요.
function solution(common) {
var answer = 0;
var lastElement = common[common.length - 1];
if (common[1] - common[0] === common[2] - common[1]) {
var difference = common[1] - common[0];
answer = lastElement + difference;
}
else {
var ratio = common[1] / common[0];
answer = lastElement * ratio;
}
return answer;
}
✏️풀이
solution 함수는 common을 인자로 받습니다.
answer 변수를 0으로 초기화합니다. 이 변수는 최종 결과를 저장할 변수입니다.
lastElement 변수에 common 배열의 마지막 요소를 할당합니다.
common.length - 1은 common 배열의 마지막 인덱스를 나타냅니다.
따라서 common[common.length - 1]은 마지막 요소를 의미합니다.
common[1] - common[0]이 common[2] - common[1]와 같다면 (즉, 연속된 숫자의 차이가 일정하다면):
difference 변수에 common[1] - common[0] 값을 할당합니다. 이는 숫자들 사이의 차이를 나타냅니다.
lastElement와 difference를 더한 값을 answer에 할당합니다.
이는 연속된 숫자들의 차이를 유지하며 마지막 요소를 계산한 것입니다.
그렇지 않으면 (즉, 연속된 숫자의 차이가 일정하지 않다면):
ratio 변수에 common[1] / common[0] 값을 할당합니다. 이는 숫자들 사이의 비율을 나타냅니다.
lastElement와 ratio를 곱한 값을 answer에 할당합니다.
이는 연속된 숫자들의 비율을 유지하며 마지막 요소를 계산한 것입니다.
최종적으로 answer를 반환합니다.