2023년 10월 10일
문제 설명
주어진 숫자와 연산자들로 이루어진 문자열 s
가 주어질 때, 괄호를 적절히 배치하여 만들 수 있는 최솟값을 찾는 문제입니다. s
는 숫자와 ‘+’ 및 ‘-‘ 연산자로만 이루어져 있습니다.
예를 들어, 입력으로 "5-3+2"
가 주어진다면, 이를 괄호를 적절히 사용하여 최솟값으로 만들 수 있습니다.
따라서 괄호를 어떻게 배치하느냐에 따라 결과값이 달라질 수 있습니다. 아래의 예시를 통해 문제를 보다 명확히 이해해 보겠습니다.
예시 입력: "5-3+2" 가능한 결과: 1) (5-3)+2 = 4 2) 5-(3+2) = 0 최솟값: 0
입력 형식 및 제약 조건
입력: 문자열 s
(1 ≤ s.length
≤ 50) 은 숫자와 ‘+’ 혹은 ‘-‘로 구성되어 있습니다.
출력: 최솟값을 정수로 반환합니다.
문제 풀이 과정
1. 문제 이해 및 분석
문제를 해결하기 위해 가장 먼저 해야 할 일은 괄호가 어떤 형태로 배치될 수 있는지를 명확히 이해하는 것입니다. 위의 예시처럼 각 연산자를 괄호로 감싸서 연산을 그룹화할 수 있습니다. 이러한 그룹화 방식은 최종적으로 산출되는 값에 큰 영향을 미칩니다.
2. Greedy Approach
여기서 최솟값을 찾기 위해 사용할 수 있는 방법 중 하나는 그리디 알고리즘을 사용하는 것입니다. ‘그리디 알고리즘’은 현재 순간에서 가장 최적이라고 판단되는 선택을 하여 문제를 해결해 나가는 방법입니다. 그러나 이 문제에서는 그리디 방식이 항상 최적이라고 할 수는 없으므로 주의가 필요합니다.
3. 입력 문자열 파싱
먼저 입력 문자열을 ‘+’와 ‘-‘ 기호를 기준으로 파싱하여 숫자와 연산자의 배열을 만들어야 합니다. 예를 들어, s = "5-3+2"
일 경우, 이를 다음과 같이 분리할 수 있습니다.
numbers = [5, 3, 2] operators = ['-', '+']
4. 최솟값 계산
이제 각 연산자에 대해 접근해야 합니다. ‘-‘가 존재할 경우, 해당 위치에서의 모든 뒷 숫자들은 빼줘야 합니다. 이때 현재 숫자 이외의 숫자들은 모두 더해주어야 합니다. 이 과정을 통해 최솟값을 계산할 수 있습니다.
5. 자바스크립트 구현 코드
function minValue(s) {
let numbers = s.split(/[-+]/g).map(Number);
let operators = s.match(/[-+]/g) || [];
let minValue = numbers[0];
for (let i = 0; i < operators.length; i++) {
if (operators[i] === '-') {
minValue -= numbers[i + 1];
for (let j = i + 1; j < numbers.length; j++) {
minValue -= numbers[j];
}
break;
} else {
minValue += numbers[i + 1];
}
}
return minValue;
}
console.log(minValue("5-3+2")); // 출력: 0
6. 시간 복잡도 분석
위의 알고리즘은 입력 문자열을 한 번 파싱하고, 이후 연산자 및 숫자를 순회하기 때문에 시간 복잡도는 O(n)으로 고려할 수 있습니다. 여기서 n은 입력 문자열의 길이입니다. 이는 충분히 효율적인 접근 방식입니다.
7. 최종 정리
이 문제를 통해 괄호의 적절한 배치가 결과값에 얼마나 큰 영향을 미치는지를 알 수 있었습니다. 또한, 그리디 알고리즘과 배열을 활용하여 문제를 효율적으로 해결하는 방법을 배울 수 있었습니다. 성공적인 코딩테스트를 기원합니다!