티스토리 뷰
반응형
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import itertools
def solution(expression):
answer = 0
start=0
num,cal=[],[]
for idx,c in enumerate(expression):
if c in ['+','-','*']:
cal.append(c)
num.append(int(expression[start:idx]))
start=idx+1
num.append(int(expression[start:]))
for orders in itertools.permutations(['+','-','*'],3):
copyNum=num[:]
copyCal=cal[:]
while len(copyNum)>1:
for ods in orders:
while True:
try:
idxx=copyCal.index(ods)
if ods=='+':
copyNum[idxx]=copyNum[idxx]+copyNum[idxx+1]
elif ods=='-':
copyNum[idxx]=copyNum[idxx]-copyNum[idxx+1]
elif ods=='*':
copyNum[idxx]=copyNum[idxx]*copyNum[idxx+1]
del copyNum[idxx+1]
copyCal.remove(ods)
except:
break
answer=max(answer,abs(copyNum[0]))
return answer
|
cs |
문제:programmers.co.kr/learn/courses/30/lessons/67257
우선 숫자와 기호를 두 파트를 나눠야 한다. 그런 다음 +, -, * 의 모든 우선순위를 구해 절댓값이 최대가 되는 식을 구하면 된다.
우선 숫자를 저장하는 리스트는 항상 기호를 저장하는 리스트보다 1이 더 크다.
이 원리를 이용하면 계산 할때에는 copyNum[idxx]=copyNum[idxx] [+,-,*] copyNum[idxx+1] 이런식의 꼴이 형성된다. 그리고 계산 결과를 마쳤으면 계산에 이용된 숫자와 기호는 없애햐 하므로 삭제한다.( 그래서 while문 사용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import re
from itertools import permutations
def solution(expression):
#1
op = [x for x in ['*','+','-'] if x in expression]
op = [list(y) for y in permutations(op)]
ex = re.split(r'(\D)',expression)
#2
a = []
for x in op:
_ex = ex[:]
for y in x:
while y in _ex:
tmp = _ex.index(y)
_ex[tmp-1] = str(eval(_ex[tmp-1]+_ex[tmp]+_ex[tmp+1]))
_ex = _ex[:tmp]+_ex[tmp+2:]
a.append(_ex[-1])
#3
return max(abs(int(x)) for x in a)
|
cs |
여기에서는 위의 코드와 차이점은 데이터를 파싱하는 방법과 eval으로 수식을 계산한다는 점이다.
1
|
print(eval("3+5")) #8
|
cs |
1
2
3
4
5
6
7
8
9
10
11
12
|
def solution3(expression):
operations = [('+', '-', '*'),('+', '*', '-'),('-', '+', '*'),('-', '*', '+'),('*', '+', '-'),('*', '-', '+')]
answer = []
for op in operations:
a = op[0]
b = op[1]
temp_list = []
for e in expression.split(a):
temp = [f"({i})" for i in e.split(b)]
temp_list.append(f'({b.join(temp)})')
answer.append(abs(eval(a.join(temp_list))))
return max(answer)
|
cs |
이 방법은 참신했던 것 같다.
위와 같이 하면 우선순위에 따라 괄호가 형성된다. 단 인덱스의 크기가 커질수록 우선순위가 높다.
예를 들어 ('+', '-', '*') 의 경우에는 ((100)-(200*300)-(500))+((20)) 와 같이 된다.
+가 우선순위가 가장 낮고 그 다음에는 - 마지막으로는 *가 우선순위가 가장 높다.
반응형
'알고리즘 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] [자바] [카카오] 문자열 압축 (0) | 2021.12.06 |
---|---|
[Programmers] [레벨3] 야근지수 (0) | 2021.10.29 |
2017 카카오코드 본선 단체사진 찍기 (0) | 2021.02.05 |
2019 카카오 개발자 겨울 인턴십 튜플 (0) | 2021.02.05 |
2020 KAKAO BLIND RECRUITMENT괄호 변환 (0) | 2021.02.03 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- thread
- 2021 KAKAO BLIND RECRUITMENT
- Pattern
- 자바
- Java
- docker
- Spring
- 프로그래머스
- Command Line
- headers
- 알고리즘
- Collections
- 면접
- dockerignore
- 백준
- docker-compose
- 카카오
- django
- Celery
- env
- setattr
- BFS
- DRF
- Linux
- 파이썬
- PostgreSQL
- ubuntu
- 그래프
- postgres
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함