코딩 공부/코딩테스트

자바스크립트 코딩테스트 입문 (25)

천서리 2023. 6. 9. 14:33
QUOTE THE DAY

“ 당신이 6개월 이상 한 번도 보지 않은 코드는 다른 사람이 다시 만드는 게 훨씬 더 나을 수 있다. ”

- 이글슨 (Eagleson)
반응형

코딩테스트 입문 Day 25 시뮬레이션, 조건문, 수학

출처  https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


문자열 밀기

문제

문자열 "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

 

입출력 예 설명

 

입출력 예 #1

  • "hello"를 오른쪽으로 한 칸 밀면 "ohell"가 됩니다.

입출력 예 #2

  • "apple"은 몇 번을 밀어도 "elppa"가 될 수 없습니다.

 

입출력 예 #3

  • "atat"는 오른쪽으로 한 칸, 세 칸을 밀면 "tata"가 되므로 최소 횟수인 1을 반환합니다.

 

입출력 예 #4

  • "abc"는 밀지 않아도 "abc"이므로 0을 반환합니다.

 

solution.js

function solution(A, B) {
    if (A.length !== B.length) {
        return -1;
    }
    
    for (var i = 0; i < A.length; i++) {
        if (A === B) {
            return i;
        }
        
        A = A[A.length - 1] + A.slice(0, A.length - 1);
    }
    
    return -1;
}
  1. 먼저, A와 B의 길이가 다르다면 두 배열이 회전한 형태로는 일치할 수 없으므로 -1을 반환합니다.
  2. 그렇지 않은 경우, for 루프를 통해 A 배열의 각 원소를 순차적으로 검사합니다. i는 현재 검사 중인 인덱스를 나타냅니다.
  3. A와 B가 일치한다면 현재 인덱스 i를 반환합니다. 이는 A 배열이 B로 회전한 형태라는 의미입니다.
  4. A와 B가 일치하지 않는다면, A 배열을 한 칸 오른쪽으로 회전시킵니다. 이는 A의 마지막 원소를 앞으로 옮기고, 나머지 원소들을 한 칸씩 오른쪽으로 이동시키는 것을 의미합니다.
  5. for 루프가 모두 실행되었는데도 A와 B가 일치하지 않는다면, -1을 반환합니다. 이는 A 배열이 B로 회전한 형태가 아니라는 의미입니다.

종이자르기

문제

머쓱이는 큰 종이를 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

 

입출력 예 설명

 

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 가로 2 세로 5인 종이는 가로로 1번 세로로 8번 총 가위질 9번이 필요합니다.

 

입출력 예 #3

  • 이미 1 * 1 크기이므로 0을 return 합니다.

 

solution.js

function solution(M, N) {
    var answer = (M - 1) + (N - 1) * M;
    return answer;
}
  1. answer 변수를 선언하고, M - 1을 수행한 결과를 저장합니다. 이는 첫 번째 행을 따라 이동하는 데 필요한 이동 횟수입니다.
  2. N - 1을 수행한 결과에 M을 곱한 값을 구합니다. 이는 첫 번째 열을 따라 이동하는 데 필요한 이동 횟수입니다.
  3. 앞서 계산한 두 값을 더하여 최종 결과를 answer 변수에 저장합니다.
  4. answer 값을 반환합니다.

연속된 수의 합

문제

연속된 세 개의 정수를 더해 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]

 

입출력 예 설명

 

입출력 예 #1

  • num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.

입출력 예 #2

  • num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.

입출력 예 #3

  • 4개의 연속된 수를 더해 14가 되는 경우는 2, 3, 4, 5입니다.

입출력 예 #4

  • 설명 생략

 

solution.js

function solution(num, total) {
    var answer = [];

    var start;
    if (num % 2 === 0) {
        start = Math.floor(total / num) - Math.floor(num / 2) + 1;
    } else {
        start = Math.floor(total / num) - Math.floor(num / 2);
    }

    for (var i = 0; i < num; i++) {
        answer.push(start + i);
    }

    return answer;
}
  1. 빈 배열 answer를 선언합니다. 이 배열은 결과를 저장하기 위해 사용됩니다.
  2. start 변수를 선언합니다. 이 변수는 연속된 숫자의 시작값을 나타냅니다.
  3. num이 짝수인지 확인합니다. num이 짝수라면 (total / num) - (num / 2) + 1 값을 start에 할당합니다. 여기서 (total / num)은 평균값이고, (num / 2)은 연속된 숫자의 개수를 반으로 나눈 값입니다. start는 시작값이므로 평균값에서 반을 나눈 값과 1을 빼줍니다.
  4. num이 홀수인 경우에는 (total / num) - (num / 2) 값을 start에 할당합니다. 이 경우에는 3번 과정에서 1을 빼주지 않습니다.
  5. for 루프를 사용하여 num만큼 반복하면서 start부터 시작하여 연속된 숫자를 answer 배열에 추가합니다.
  6. answer 배열을 반환합니다.

예를 들어, num = 5, total = 15를 입력으로 주면, 연속된 5개의 숫자의 평균값은 3입니다. 시작값은 (total / num) - (num / 2) + 1이므로, (15 / 5) - (5 / 2) + 1을 계산하면 2가 됩니다. 따라서 answer 배열은 [2, 3, 4, 5, 6]이 됩니다.


다음에 올 숫자

문제

등차수열 혹은 등비수열 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

 

입출력 예 설명

 

입출력 예 #1

  • [1, 2, 3, 4]는 공차가 1인 등차수열이므로 다음에 올 수는 5이다.

입출력 예 #2

  • [2, 4, 8]은 공비가 2인 등비수열이므로 다음에 올 수는 16이다.

 

solution.js

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;
}
  1. answer 변수를 0으로 초기화합니다. 이 변수는 결과를 저장하기 위해 사용됩니다.
  2. common 배열의 마지막 원소를 lastElement 변수에 저장합니다.
  3. common 배열의 첫 번째 원소와 두 번째 원소, 그리고 두 번째 원소와 세 번째 원소의 차이를 비교합니다. 두 차이가 같다면 등차 수열을 나타내는 것으로 가정합니다.
  4. 등차 수열인 경우, 두 번째 원소와 첫 번째 원소의 차이를 difference 변수에 저장합니다.
  5. 등차 수열이 아닌 경우, 두 번째 원소를 첫 번째 원소로 나눈 비율을 ratio 변수에 저장합니다.
  6. answer 변수에 값을 할당합니다. 등차 수열인 경우 lastElement에 difference를 더해줍니다. 등비 수열인 경우 lastElement에 ratio를 곱해줍니다.
  7. answer 값을 반환합니다.

 

반응형
Adventure Time - BMO