30 Aug 2020

[Programmers] 수식 최대화

2020 카카오 인턴십

문제 바로가기 : https://programmers.co.kr/learn/courses/30/lessons/67257
문제 설명은 위 링크에서 확인해주시길 바랍니다.

solution

review

일반적인 연산에서는 곱셈이 +, -보다 연산 우선순위가 높고, +, -는 우선순위가 없다.
이 문제에서는 이런 연산 우선순위를 정해놓고 모든 조합을 체크한 뒤 얻을 수 있는 최댓값을 출력하는 문제다.
나눗셈은 없으니 제외하면 연산 기호는 3가지 밖에 없으므로 총 3!=6가지이다.
next_permutaion을 이용해서 순열을 돌려도 된다. 나는 잘못썼는지 작동이 안돼서 직접 입력했다..

일단 식 자체가 string으로 주어진다. 처음에는 string을 가지고 이렇게 저렇게 장난치면서 구해보려고 했으나
연산한 값이 있으면 to_string()으로 변환하고, 그 뒤에걸 떼서 입력한 후 뗐던걸 다시 뒤에 붙이고.. 너무 복잡했다.
굳이 그렇게 할 필요가 없을 것 같아서 input에서 숫자와 연산 기호를 분리해놓고 시작했다. 그래도 사실 좀 더럽다;

전반적인 과정은 당연히 solve()에서 이뤄진다.
기본적인 컨셉은 처음에 순열로 돌린 연산 기호들의 우선순위를 인자(string op)에 받고 동작한다.
바깥 for loop에서는 ‘현재 우선 순위인 연산 기호’를 의미한다.

핵심이 되는 부분은 안쪽 for loop인데, 현재 우선순위인 기호와 일치하는 상태라면
앞에서 2개의 숫자를 빼와서 연산한 후 다시 앞으로 넣어준다.
앞으로 넣어주는 이유는 만약 바로 다음 연산도 현재 우선순위인 기호와 일치하는 상태일 때
직전에 연산한 값과 그 뒤에 값을 같이 연산해주어야 하기 때문이다.
일치하지 않는다면(부호 차례가 아니라면) number_tmp로 넘겨버린다.
연산 1개가 끝났다면 다시 number을 연산이 끝난 number_tmp로 초기화해준다.
계속 반복하면 최종적으로 1개가 남으므로 절댓값을 씌워서 반환한다.

전반적으로 글로 설명만 하다보니 다소 장황해진 감이 있어서 좀 안타깝다.
특별한 알고리즘이 쓰이는 문제도 아니고 단순 구현 문제라고 봐도 될 것 같은데 생각보다 더럽게 짰다.
나름 가장 깔끔하게 사고를 정돈해서 짜봤는데 최근 카카오 인턴, 개발자 초반 문제들은 대부분 이런 느낌이다. ㅠㅠ
뒷 문제들은 아직까지 풀어본적이 없어서 걱정도 기대도 되지만 앞문제에 너무 오래 걸리지 않도록 노력해야겠다.

Location

Icheon, KR

Email

iteratively@naver.com

Social

-->