본문 바로가기
codingtest

[programmers] 가장 큰 수 찾기, 다음에 올 숫자, 문자열 밀기, 연속된 수의 합, 종이 자르기 문제 풀이

by 안자두 2023. 3. 2.

📝 [Lv0] 가장 큰 수 찾기

👀 문제 설명

정수 배열 array가 매개변수로 주어질 때, 가장 큰 수와 그 수의 인덱스를 담은 배열을 return 하도록 solution 함수를 완성해보세요.

🚨 제한 사항

  • 1 ≤ array의 길이 ≤ 100
  • 0 ≤ array 원소 ≤ 1,000
  • array에 중복된 숫자는 없습니다.

 

💻 입출력 예


[1, 8, 3] [8, 1]
[9, 10, 11, 8] [11, 2]

 

✨ 풀이 설명

가장 작은 수가 0이기 때문에 answer의 기본 값을 [0, 0] 으로 초기화해 주었다.

그다음, array의 값을 확인하며 해당 값이 answer의 값보다 크다면 해당 값과 인덱스 값으로 변경해 반환해 주었고, 아니라면 기존 answer을 그대로 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(array) {
  return array.reduce((answer, num, idx) => answer[0] < num ? [num, idx] : answer, [0, 0]);
}
 

 


📝 [Lv0] 다음에 올 숫자

👀 문제 설명

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

 

🚨 제한 사항

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

 

💻 입출력 예

[1, 2, 3, 4] 5
[2, 4, 8] 16

 

✨ 풀이 설명

앞부분 보단 뒷부분의 차이가 더 확실할 것 같다는 생각이 들어 뒷부분부터 계산을 했는데, 생각해 보면 등차나 등비 모두 뒤로 갈수록 수가 작아질 수도 있기 때문에 앞부분부터 계산했어도 상관없었겠다는 생각이 들었다.

풀이는 직관적으로 세 숫자 사이의 관계가 등차일 경우, 아닐 경우를 계산해 다음 수를 반환해 주었다.

 

🕵️‍♂️ 코드

function solution(common) {
  const len = common.length;
  if (common[len - 1] - common[len - 2] === common[len - 2] - common[len - 3]) return common[len - 1] * 2 - common[len - 2];
  return common[len - 1] ** 2 / common[len - 2];
}

 


📝 [Lv0] 문자열 밀기

👀 문제 설명

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

 

🚨 제한 사항

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

 

💻 입출력 예

"hello" "ohell" 1
"apple" "elppa" -1
"atat" "tata" 1
"abc" "abc" 0

 

✨ 풀이 설명

문자열을 밀다가 한 바퀴를 돌면 해당 문자가 없다는 뜻이 된다.

그래서 B 문자열을 두 번 반복하여 마지막 위치에 있을 때에도 해당 문자를 찾을 수 있도록 해준 다음,
이렇게 생긴 문자열에서 원문인 A의 위치를 찾아주었다.

문자열의 시작 위치를 찾는 indexOf를 통해 해당 위치를 반환해 주었다. (없을 경우는 -1을 반환함)

 

🕵️‍♂️ 코드

function solution(A, B) {
  return B.repeat(2).indexOf(A);
}

 


📝 [Lv0] 연속된 수의 합

👀 문제 설명

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

 

🚨 제한 사항

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

 

💻 입출력 예

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인 수열이라고 생각한 후, 가운데 숫자를 구해주었다. 홀수일 경우에는 중심 숫자를 먼저 추가해 주었다.

반복문을 통해 앞뒤로 1 낮은 수, 1 높은 수를 추가해 주었는데,
홀수일 경우에는 가운데 숫자를 이미 넣어주었기 때문에 반복문을 1부터 시작해 주었고,
짝수의 경우에는 중심 숫자가 정수가 아니기 때문에 0부터 시작해 주었다.

 

🕵️‍♂️ 코드

function solution(num, total) {
  const val = total / num;
  let answer = num % 2 ? [val] : [];
  for (let i = num % 2; i < num / 2; i++) {
    answer = [Math.floor(val - i), ...answer, Math.ceil(val + i)];
  }
  return answer;
}

 


📝 [Lv0] 종이 자르기

👀 문제 설명

머쓱이는 큰 종이를 1 x 1 크기로 자르려고 합니다. 예를 들어 2 x 2 크기의 종이를 1 x 1 크기로 자르려면 최소 가위질 세 번이 필요합니다.

정수 M, N이 매개변수로 주어질 때, M x N 크기의 종이를 최소로 가위질 해야하는 횟수를 return 하도록 solution 함수를 완성해보세요.

 

🚨 제한 사항

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

💻 입출력 예

2 2 3
2 5 9
1 1 0

 

✨ 풀이 설명

가로든 세로든 처음 자를 때에는 길이 - 1 만큼만 잘라주면 된다.

그 후, 잘린 종이를 기준으로 다른 방향으로 잘라줄 때는, 이미 잘린 종이마다 다른 방향으로 잘라주어야하기 때문에
(가로를 기준으로 생각한다면) 가로 자르는 횟수(M - 1) + 각각 잘린 종이마다 세로로 자르는 횟수(M개 * (N - 1))

즉, 
(M - 1) + M * (N - 1) 라는 식이 나온다.

식을 풀어보면 M - 1 + M * N - M 이기 때문에 간단한 식으로 정리하면 아래와 같아진다.

 

🕵️‍♂️ 코드

function solution(M, N) {
  return M * N - 1;
}
728x90