jeeyeonLIM / coding_test

Let's practice the coding test!
1 stars 0 forks source link

[2020 카카오 인턴십] 수식 최대화 #59

Open jeeyeonLIM opened 3 years ago

jeeyeonLIM commented 3 years ago

문제 설명

IT 벤처 회사를 운영하고 있는 라이언은 매년 사내 해커톤 대회를 개최하여 우승자에게 상금을 지급하고 있습니다.
- 이번 대회에서는 우승자에게 지급되는 상금을 이전 대회와는 다르게 다음과 같은 방식으로 결정하려고 합니다.
해커톤 대회에 참가하는 모든 참가자들에게는 숫자들과 3가지의 연산문자(+, -, *) 만으로 이루어진 연산 수식이 전달되며, 참가자의 미션은 전달받은 수식에 포함된 연산자의 우선순위를 자유롭게 재정의하여 만들 수 있는 가장 큰 숫자를 제출하는 것입니다.
단, 연산자의 우선순위를 새로 정의할 때, 같은 순위의 연산자는 없어야 합니다. 즉, + > - > * 또는 - > * > + 등과 같이 연산자 우선순위를 정의할 수 있으나 +,* > - 또는 * > +,-처럼 2개 이상의 연산자가 동일한 순위를 가지도록 연산자 우선순위를 정의할 수는 없습니다. 수식에 포함된 연산자가 2개라면 정의할 수 있는 연산자 우선순위 조합은 2! = 2가지이며, 연산자가 3개라면 3! = 6가지 조합이 가능합니다.
만약 계산된 결과가 음수라면 해당 숫자의 절댓값으로 변환하여 제출하며 제출한 숫자가 가장 큰 참가자를 우승자로 선정하며, 우승자가 제출한 숫자를 우승상금으로 지급하게 됩니다.

"100-200*300-500+20"

참가자에게 주어진 연산 수식이 담긴 문자열 expression이 매개변수로 주어질 때, 우승 시 받을 수 있는 가장 큰 상금 금액을 return 하도록 solution 함수를 완성해주세요.

[제한사항]

입출력 예

expression result
"100-200*300-500+20" 60420
"506-32" 300

입출력 예 #1

입출력 예 #2

jeeyeonLIM commented 3 years ago

나의 코드

나의 논리구조

Ver1.

def calc(express, num1, num2): if express == "+":return num1+num2 elif express == "-":return num1-num2 elif express == "":return num1num2

def solution(expression): answer = [] num_list = list(map(int, re.split("[+-]+", expression))) express_list = [i for i in expression if i in '-+'] sunseo=list(set(express_list)) permu_list= list(itertools.permutations(sunseo))

for permu in permu_list:
    print("start--",permu)
    for per in permu:
        for i in express_list:    
            if i== per: # 같은 문자라면 아래 계산 해줌.
                num= express_list.index(per)
                num_list[num] = calc(express_list[num], num_list[num], num_list[num+1])
                num_list.remove(num_list[num+1])
                express_list.remove(per)
                print(per,express_list, num_list)
                if len(express_list)==0:
                    answer.append(abs(num_list[0]))
                elif len(express_list)==1:
                    answer.append(abs(calc(express_list[0],num_list[0],num_list[1])))
            else: 
                continue

    num_list = list(map(int, re.split("[+*-]+", expression)))
    express_list = [i for i in expression if i in '*-+']

return max(answer)

![image](https://user-images.githubusercontent.com/45617225/104893480-d48f1980-59b6-11eb-99b5-d27164363a9d.png)
- 뭐 대충 이런식으로 출력.. 
![image](https://user-images.githubusercontent.com/45617225/104893188-719d8280-59b6-11eb-8197-cc9a458cbdc6.png)

- 결과는 참혹했다............ 
- 이건 다른 사람들 코드 안보고 나중에 한번 다시 도전해봐야겠다. 
- 일단 어떻게든 결과만 나오게 하자는 생각으로 했는데, remove해주는 식으로 원소 제거해가고, 마지막에 다시 리스트를 생성했기 때문에 당연히 연산이 모든 경우의 수 만큼 반복된다. **(즉, 정말 비효율적인 코드라는 것..)**