Skip to content

Commit c24cd6e

Browse files
committed
[level 2] Title: [카카오 인턴] 수식 최대화, Time: 11.22 ms, Memory: 92.5 MB -BaekjoonHub
1 parent 4d62d62 commit c24cd6e

File tree

2 files changed

+167
-0
lines changed

2 files changed

+167
-0
lines changed
Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
# [level 2] [카카오 인턴] 수식 최대화 - 67257
2+
3+
[문제 링크](https://school.programmers.co.kr/learn/courses/30/lessons/67257)
4+
5+
### 성능 요약
6+
7+
메모리: 92.5 MB, 시간: 11.22 ms
8+
9+
### 구분
10+
11+
코딩테스트 연습 > 2020 카카오 인턴십
12+
13+
### 채점결과
14+
15+
정확성: 100.0<br/>합계: 100.0 / 100.0
16+
17+
### 제출 일자
18+
19+
2025년 08월 27일 13:01:06
20+
21+
### 문제 설명
22+
23+
<p>IT 벤처 회사를 운영하고 있는 <code>라이언</code>은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다.<br>
24+
이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다.<br>
25+
해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(<code>+, -, *</code>) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다.<br>
26+
단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, <code>+</code> &gt; <code>-</code> &gt; <code>*</code> 또는 <code>-</code> &gt; <code>*</code> &gt; <code>+</code> 등과 같이 연산자 우선순위를 정의할 수 있으나 <code>+,*</code> &gt; <code>-</code> 또는 <code>*</code> &gt; <code>+,-</code>처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다. 수식에 포함된 연산자가 2개라면 정의할 수 있는 연산자 우선순위 조합은 2! = 2가지이며, 연산자가 3개라면 3! = 6가지 조합이 가능합니다.<br>
27+
만약 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급하게 됩니다.</p>
28+
29+
<p>예를 들어, 참가자 중 <code>네오</code>가 아래와 같은 수식을 전달받았다고 가정합니다.</p>
30+
31+
<p><code>"100-200*300-500+20"</code></p>
32+
33+
<p>일반적으로 수학 및 전산학에서 약속된 연산자 우선순위에 따르면 더하기와 빼기는 서로 동등하며 곱하기는 더하기, 빼기에 비해 우선순위가 높아 <code>*</code> &gt; <code>+,-</code> 로 우선순위가 정의되어 있습니다.<br>
34+
대회 규칙에 따라 <code>+</code> &gt; <code>-</code> &gt; <code>*</code> 또는 <code>-</code> &gt; <code>*</code> &gt; <code>+</code> 등과 같이 연산자 우선순위를 정의할 수 있으나 <code>+,*</code> &gt; <code>-</code> 또는 <code>*</code> &gt; <code>+,-</code> 처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다.<br>
35+
수식에 연산자가 3개 주어졌으므로 가능한 연산자 우선순위 조합은 3! = 6가지이며, 그 중 <code>+</code> &gt; <code>-</code> &gt; <code>*</code> 로 연산자 우선순위를 정한다면 결괏값은 22,000원이 됩니다.<br>
36+
반면에 <code>*</code> &gt; <code>+</code> &gt; <code>-</code> 로 연산자 우선순위를 정한다면 수식의 결괏값은 -60,420 이지만, 규칙에 따라 우승 시 상금은 절댓값인 60,420원이 됩니다.</p>
37+
38+
<p>참가자에게 주어진 연산 수식이 담긴 문자열 expression이 매개변수로 주어질 때, 우승 시 받을 수 있는 가장 큰 상금 금액을 return 하도록 solution 함수를 완성해주세요.</p>
39+
40+
<h5><strong>[제한사항]</strong></h5>
41+
42+
<ul>
43+
<li>expression은 길이가 3 이상 100 이하인 문자열입니다.</li>
44+
<li>expression은 공백문자, 괄호문자 없이 오로지 숫자와 3가지의 연산자(<code>+, -, *</code>) 만으로 이루어진 올바른 중위표기법(연산의 두 대상 사이에 연산기호를 사용하는 방식)으로 표현된 연산식입니다. 잘못된 연산식은 입력으로 주어지지 않습니다.
45+
46+
<ul>
47+
<li>즉, <code>"402+-561*"</code>처럼 잘못된 수식은 올바른 중위표기법이 아니므로 주어지지 않습니다.<br></li>
48+
</ul></li>
49+
<li>expression의 피연산자(operand)는 0 이상 999 이하의 숫자입니다.
50+
51+
<ul>
52+
<li>즉, <code>"100-2145*458+12"</code>처럼 999를 초과하는 피연산자가 포함된 수식은 입력으로 주어지지 않습니다.</li>
53+
<li><code>"-56+100"</code>처럼 피연산자가 음수인 수식도 입력으로 주어지지 않습니다. </li>
54+
</ul></li>
55+
<li>expression은 적어도 1개 이상의 연산자를 포함하고 있습니다.</li>
56+
<li>연산자 우선순위를 어떻게 적용하더라도, expression의 중간 계산값과 최종 결괏값은 절댓값이 2<sup>63</sup> - 1 이하가 되도록 입력이 주어집니다.</li>
57+
<li>같은 연산자끼리는 앞에 있는 것의 우선순위가 더 높습니다.</li>
58+
</ul>
59+
60+
<hr>
61+
62+
<h5><strong>입출력 예</strong></h5>
63+
<table class="table">
64+
<thead><tr>
65+
<th>expression</th>
66+
<th>result</th>
67+
</tr>
68+
</thead>
69+
<tbody><tr>
70+
<td><code>"100-200*300-500+20"</code></td>
71+
<td>60420</td>
72+
</tr>
73+
<tr>
74+
<td><code>"50*6-3*2"</code></td>
75+
<td>300</td>
76+
</tr>
77+
</tbody>
78+
</table>
79+
<h5><strong>입출력 예에 대한 설명</strong></h5>
80+
81+
<p><strong>입출력 예 #1</strong><br>
82+
<code>*</code> &gt; <code>+</code> &gt; <code>-</code> 로 연산자 우선순위를 정했을 때, 가장 큰 절댓값을 얻을 수 있습니다.<br>
83+
연산 순서는 아래와 같습니다.<br>
84+
<code>100-200*300-500+20</code><br>
85+
= <code>100-(200*300)-500+20</code><br>
86+
= <code>100-60000-(500+20)</code><br>
87+
= <code>(100-60000)-520</code><br>
88+
= <code>(-59900-520)</code><br>
89+
= <code>-60420</code><br>
90+
따라서, 우승 시 받을 수 있는 상금은 |-60420| = 60420 입니다.</p>
91+
92+
<p><strong>입출력 예 #2</strong><br>
93+
<code>-</code> &gt; <code>*</code> 로 연산자 우선순위를 정했을 때, 가장 큰 절댓값을 얻을 수 있습니다.<br>
94+
연산 순서는 아래와 같습니다.(expression에서 <code>+</code> 연산자는 나타나지 않았으므로, 고려할 필요가 없습니다.)<br>
95+
<code>50*6-3*2</code><br>
96+
= <code>50*(6-3)*2</code><br>
97+
= <code>(50*3)*2</code><br>
98+
= <code>150*2</code><br>
99+
= <code>300</code><br>
100+
따라서, 우승 시 받을 수 있는 상금은 300 입니다.</p>
101+
102+
103+
> 출처: 프로그래머스 코딩 테스트 연습, https://school.programmers.co.kr/learn/challenges
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import java.util.*;
2+
class Solution {
3+
private final String[][] priorities = {
4+
{"+","*","-"},{"+","-","*"},
5+
{"-","*","+"},{"-","+","*"},
6+
{"*","+","-"},{"*","-","+"}
7+
};
8+
9+
public long solution(String expression) {
10+
// 숫자와 부호 저장 리스트
11+
ArrayList<String> originalList = new ArrayList<>();
12+
StringBuilder sb = new StringBuilder();
13+
14+
for(char ch : expression.toCharArray()){
15+
if(ch == '*' || ch == '+' || ch =='-'){
16+
originalList.add(sb.toString()); // 숫자
17+
sb.setLength(0); // 초기화
18+
19+
sb.append(ch);
20+
originalList.add(sb.toString()); // 부호
21+
sb.setLength(0); // 초기화
22+
}
23+
else{
24+
sb.append(ch);
25+
}
26+
}
27+
originalList.add(sb.toString());
28+
long answer = 0;
29+
for(String[] priority : priorities){
30+
// 복사본
31+
ArrayList<String> list = new ArrayList<>(originalList);
32+
for(int i = 0; i< priority.length;i++){
33+
String sign = priority[i];
34+
while(list.contains(sign)){
35+
// 부호의 인덱스 찾음
36+
int idx = list.indexOf(sign);
37+
long num1 = Long.parseLong(list.get(idx-1));
38+
long num2 = Long.parseLong(list.get(idx+1));
39+
40+
// 연산
41+
long result = calculate(num1,num2,sign);
42+
43+
list.set(idx-1,result+""); // result 주입
44+
list.remove(idx); // 부호 삭제
45+
list.remove(idx); // num2 삭제
46+
}
47+
}
48+
long absResult = Math.abs(Long.parseLong(list.get(0)));
49+
if(absResult > answer) answer = absResult;
50+
// System.out.println("연산 후:" + list);
51+
// System.out.println("최댓값: " + answer);
52+
}
53+
return answer;
54+
}
55+
56+
long calculate(long num1,long num2,String sign){
57+
switch(sign){
58+
case("*"): return num1 * num2;
59+
case("+"): return num1 + num2;
60+
case("-"): return num1 - num2;
61+
}
62+
return 0;
63+
}
64+
}

0 commit comments

Comments
 (0)