본문 바로가기
프로그래머스/Python

[프로그래머스] 수식 최대화 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2024. 5. 11.
728x90
반응형

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 설명

반응형

2. 풀이과정

해당 문제는 각 +, -, * 연산자의 우선순위에 따라 수식을 계산한 결과 중 절댓값이 가장 큰 값을 출력하는 문제이다.

3 연산자의 우선순위 조합에는 총 6가지 경우가 존재하고 각 경우에 따른 수식을 계산하고 그 절댓값을 구한다.

6가지 경우의 절댓값 중 가장 큰 값을 출력하면 된다.

+, -, * 연산자에 따른 수식 연산을 진행할 함수 3개를 생성하여 각 연산자에 따른 수식을 계산한다.

처음에 수식 문자열을 숫자와 연산자로 구분해 주기 위한 함수를 생성하여 최초의 수식을 분리하여 연산을 수행한다.

 

  1. 수식 문자열을 숫자와 연산자로 구분해 주기 위한 함수를 생성한다. def split_exp(exp)
    1. 빈 리스트를 생성한다. li = list()
    2. 숫자를 저장할 빈 문자열을 생성한다. num = ''
    3. 수식 문자열의 각 문자를 하나씩 가져오며 for i in exp
      1. 만약 해당 문자가 연산자이면 if (i == '+' or i == '-' or i == '*')
        1. 이전까지 저장한 숫자 문자열을 정수형으로 변환하여 리스트에 추가한다. li.append(int(num))
        2. 해당 연산자를 리스트에 추가한다. li.append(i)
        3. 숫자를 저장할 문자열을 초기화해 준다. num = ''
      2. 반면에 해당 문자가 연산자가 아닌 숫자이면 else
        1. 숫자를 저장하는 문자열에 해당 문자를 이어서 추가한다. num += i
    4. 수식 문자열의 모든 문자를 확인한 후 마지막으로 숫자 문자열을 정수형으로 변환하여 리스트에 추가한다. li.append(int(num))
    5. 최종적으로 분리한 리스트를 반환해 준다. return li
  2. 덧셈 연산자의 우선순위일 때 수식을 계산하는 함수를 생성한다. def plus(exp)
    1. 수식 리스트에 '+' 연산자가 있으면 반복한다. while ('+' in exp)
      1. 해당 연산자의 인덱스 값을 찾는다. idx = exp.index('+')
      2. 해당 연산자 위치의 앞뒤 숫자를 덧셈하여 해당 연산자 위치에 저장한다. exp[idx] = exp[idx - 1] + exp[idx + 1]
      3. 연산에 쓰인 뒷 숫자를 제거하고 del exp[idx + 1]
      4. 연산에 쓰인 앞 숫자를 제거한다. del exp[idx - 1]
    2. '+' 연산자가 더 이상 없으면 연산 후의 수식 리스트를 반환한다. return exp
  3. 뺄셈 연산자의 우선순위일 때 수식을 계산하는 함수를 생성한다. def minus(exp)
    1. 수식 리스트에 '-' 연산자가 있으면 반복한다. while ('-' in exp)
      1. 해당 연산자의 인덱스 값을 찾는다. idx = exp.index('-')
      2. 해당 연산자 위치의 앞뒤 숫자를 뺄셈하여 해당 연산자 위치에 저장한다. exp[idx] = exp[idx - 1] - exp[idx + 1]
      3. 연산에 쓰인 뒷 숫자를 제거하고 del exp[idx + 1]
      4. 연산에 쓰인 앞 숫자를 제거한다. del exp[idx - 1]
    2. '-' 연산자가 더 이상 없으면 연산 후의 수식 리스트를 반환한다. return exp
  4. 곱셈 연산자의 우선순위일 때 수식을 계산하는 함수를 생성한다. def mul(exp)
    1. 수식 리스트에 '*' 연산자가 있으면 반복한다. while ('*' in exp)
      1. 해당 연산자의 인덱스 값을 찾는다. idx = exp.index('*')
      2. 해당 연산자 위치의 앞뒤 숫자를 곱셈하여 해당 연산자 위치에 저장한다. exp[idx] = exp[idx - 1] * exp[idx + 1]
      3. 연산에 쓰인 뒷 숫자를 제거하고 del exp[idx + 1]
      4. 연산에 쓰인 앞 숫자를 제거한다. del exp[idx - 1]
    2. '*' 연산자가 더 이상 없으면 연산 후의 수식 리스트를 반환한다. return exp
  5. 각 연산자의 우선순위 조합의 모든 경우를 계산하면 그 결과는 한 숫자가 저장되어 있는 리스트로 나오는데, 해당 리스트의 값을 절댓값으로 바꾼 결과 중 가장 큰 값을 정답에 저장한다. answer = max(abs(plus(minus(mul(split_exp(expression))))[0]), abs(plus(mul(minus(split_exp(expression))))[0]), abs(minus(plus(mul(split_exp(expression))))[0]), abs(minus(mul(plus(split_exp(expression))))[0]), abs(mul(plus(minus(split_exp(expression))))[0]), abs(mul(minus(plus(split_exp(expression))))[0]))

3. 소스코드

def solution(expression):
    answer = 0
    
    def split_exp(exp):
        li = list()
        num = ''
        for i in exp:
            if (i == '+' or i == '-' or i == '*'):
                li.append(int(num))
                li.append(i)
                num = ''
            else:
                num += i
        li.append(int(num))

        return li

    def plus(exp):
        while ('+' in exp):
            idx = exp.index('+')
            exp[idx] = exp[idx - 1] + exp[idx + 1]
            del exp[idx + 1]
            del exp[idx - 1]

        return exp
    
    def minus(exp):
        while ('-' in exp):
            idx = exp.index('-')
            exp[idx] = exp[idx - 1] - exp[idx + 1]
            del exp[idx + 1]
            del exp[idx - 1]

        return exp
    
    def mul(exp):
        while ('*' in exp):
            idx = exp.index('*')
            exp[idx] = exp[idx - 1] * exp[idx + 1]
            del exp[idx + 1]
            del exp[idx - 1]

        return exp

    answer = max(abs(plus(minus(mul(split_exp(expression))))[0]),
                 abs(plus(mul(minus(split_exp(expression))))[0]),
                 abs(minus(plus(mul(split_exp(expression))))[0]),
                 abs(minus(mul(plus(split_exp(expression))))[0]),
                 abs(mul(plus(minus(split_exp(expression))))[0]),
                 abs(mul(minus(plus(split_exp(expression))))[0]))
    
    return answer
728x90
반응형