개요
문제 이름: 최댓값과 최솟값 (12939)
문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/12939
플랫폼: 프로그래머스
알고리즘 분류: 일반
소요 시간: 2분
문제 전문
설명
제한사항
입출력
문제 풀이
해설
이 문제는 주어진 문자열에서 최솟값과 최댓값을 찾아 특정 형식으로 반환하는 것이 목표입니다.
문제를 해결하기 위해 다음과 같은 접근 방식을 사용할 수 있습니다.
- 문자열을 숫자 배열로 변환
- 배열에서 최솟값과 최댓값 찾기
- 결과를 지정된 형식으로 반환
이 문제는 문자열 처리, 배열 조작, 그리고 최솟값과 최댓값을 찾는 알고리즘을 결합하여 해결할 수 있습니다. 주어진 제한 조건에 따라 문자열에는 둘 이상의 정수가 공백으로 구분되어 있으므로, 이를 고려하여 문제를 접근해야 합니다.
시도
1차 시도 (성공)
function solution(s) {
// 문자열을 공백을 기준으로 나누어 배열로 만듭니다.
let numbers = s.split(" ");
// 문자열 배열을 숫자 배열로 변환합니다.
numbers = numbers.map((num) => Number(num));
// 최솟값과 최댓값을 저장할 변수를 초기화합니다.
let min = numbers[0];
let max = numbers[0];
// 배열을 순회하며 최솟값과 최댓값을 찾습니다.
for (let i = 1; i < numbers.length; i++) {
if (numbers[i] < min) {
min = numbers[i];
}
if (numbers[i] > max) {
max = numbers[i];
}
}
// 최솟값과 최댓값을 문자열로 만들어 반환합니다.
return min + " " + max;
}
이 코드는 다음과 같은 단계로 문제를 해결합니다.
- split(" ") 메서드를 사용하여 입력 문자열을 공백을 기준으로 나누어 배열로 만듭니다.
- map() 함수와 Number() 함수를 사용하여 문자열 배열을 숫자 배열로 변환합니다.
- 최솟값과 최댓값을 저장할 변수를 배열의 첫 번째 요소로 초기화합니다.
- 배열을 순회하면서 각 요소와 현재의 최솟값, 최댓값을 비교하여 필요한 경우 업데이트합니다.
- 최종적으로 찾은 최솟값과 최댓값을 문자열로 연결하여 반환합니다.
시간복잡도: O(n), 여기서 n은 입력 문자열의 숫자 개수입니다.
공간복잡도: O(n), 입력 문자열을 배열로 변환하여 저장하기 때문입니다.
2차 시도 (성공)
function solution(s) {
// 문자열을 공백을 기준으로 나누고 바로 숫자로 변환합니다.
const numbers = s.split(" ").map(Number);
// Math.min과 Math.max 함수를 사용하여 최솟값과 최댓값을 찾습니다.
const min = Math.min(...numbers);
const max = Math.max(...numbers);
// 템플릿 리터럴을 사용하여 결과 문자열을 만들어 반환합니다.
return `${min} ${max}`;
}
이 코드는 첫 번째 시도를 개선한 버전으로, 다음과 같은 방식으로 작동합니다.
- split(" ") 메서드로 문자열을 나누고, map(Number)를 사용하여 바로 숫자 배열로 변환합니다.
- Math.min()과 Math.max() 함수를 사용하여 배열의 최솟값과 최댓값을 한 번에 찾습니다. 여기서 스프레드 연산자(...)를 사용하여 배열의 요소들을 개별 인수로 전달합니다.
- 템플릿 리터럴을 사용하여 결과 문자열을 생성합니다.
이 방법은 코드가 더 간결하고 가독성이 좋습니다. 이제 Math.min()과 Math.max() 함수를 사용함으로써 직접 반복문을 작성할 필요가 없어졌습니다.
시간복잡도: O(n), 여기서 n은 입력 문자열의 숫자 개수입니다.
공간복잡도: O(n), 입력 문자열을 배열로 변환하여 저장하기 때문입니다.
3차 시도 (성공)
function solution(s) {
return Math.min(...s.split(" ")) + " " + Math.max(...s.split(" "));
}
이 코드는 이전 솔루션들을 더욱 간결하게 만든 버전이라고 할 수 있습니다.
- s.split(" ")를 사용하여 문자열을 배열로 변환합니다.
- 스프레드 연산자(...)를 사용하여 이 배열의 요소들을 Math.min()과 Math.max() 함수의 인수로 전달합니다.
- 두 결과를 문자열로 연결하여 반환합니다.
이 방법은 코드가 매우 간결하지만, 문자열을 두 번 분할하므로 효율성 면에서는 약간의 손해가 있을 수 있습니다. 하지만 대부분의 경우 이 정도의 차이는 무시할 만합니다.
시간복잡도: O(n), 여기서 n은 입력 문자열의 숫자 개수입니다.
공간복잡도: O(n), 입력 문자열을 배열로 변환하여 사용하기 때문입니다.
사용된 메서드 설명
- split(separator): 문자열을 지정된 구분자를 기준으로 나누어 배열로 만듭니다.
- 사용법: "1 2 3 4".split(" ") 결과: ["1", "2", "3", "4"]
- map(callback): 배열의 모든 요소에 대해 주어진 함수를 호출한 결과로 새로운 배열을 만듭니다.
- 사용법: ["1", "2", "3"].map(Number) 결과: [1, 2, 3]
- Math.min(): 주어진 숫자들 중 가장 작은 수를 반환합니다.
- 사용법: Math.min(1, 2, 3) 결과: 1
- Math.max(): 주어진 숫자들 중 가장 큰 수를 반환합니다.
- 사용법: Math.max(1, 2, 3) 결과: 3
- 스프레드 연산자 (...): 배열이나 객체를 개별 요소로 확장합니다.
- 사용법: Math.min(...[1, 2, 3]) 는 Math.min(1, 2, 3)과 동일합니다.
'💻 종합 개발 주제 > ⌨️ 코딩 테스트' 카테고리의 다른 글
[프로그래머스] JavaScript Lv2 - 이진 변환 반복하기(70129) (0) | 2024.07.18 |
---|---|
[프로그래머스] JavaScript Lv1 - 약수의 합(12928) (1) | 2024.07.11 |
[프로그래머스] JavaScript Lv3 - 이중우선순위큐(42628) (0) | 2024.07.04 |
[프로그래머스] JavaScript Lv2 - 게임 맵 최단거리(1844) (0) | 2024.06.26 |
[프로그래머스] JavaScript Lv2 - 타겟 넘버(43165) (0) | 2024.06.26 |