#1541

zzwwoonn·2022년 5월 19일
0

Algorithm

목록 보기
28/71

그렇다. 또 못풀었다. 하지만 그냥 못푼건 아니다. 절반.. 아니 30퍼..는 내가 풀었다!!!!

처음에는 이 문제가 그리디로 풀리는 문제인지도 몰랐다. 문제 분류를 보고 나서 그리디로 풀 수 있는 문제임을 알았다.

제일 처음 접근 했던 방식은 뭔가 특별한 규칙이 있지 않을까? 라는 생각을 했다. 마이너스('-')에 뭔가가 있지 않을까? 라는 생각을 했고 (조금만 더 붙잡고 있어보지 그랬냐고...) 그걸 중심으로 슬라이싱(slicing)을 해주면 되지 않을까? 라는 생각을 했다.

inputStr = input()
inputList = []

X = inputStr.replace('+', ' + ')
X = X.replace('-', ' - ')

inputList = X.split()

print(inputList)

lenVal = len(inputList)
# 7

makeList = [ "" for i in range(2*lenVal)]
# print(makeList)

for i in range(0, len(makeList)):
    # 0부터 14까지

    minVal = 0
    answerStr = ""

    if i % 4 == 0:
        answerStr += "("
    else:
        answerStr += makeList[i]

    ...

살짝 어이가 없는게 이 때까지만 해도 괄호는 무조건 2개, 즉 한번씩만 괄호를 씌울 수 있는 줄 알았다.(열 때 한번 닫을 때 한번)

그래서 결국 문제의 핵심은 !?
"(" 이거랑 ")" 이거의 위치만 잡아주면 되는 문제니까 그냥 for문 2번 돌면서 최소값 되는 경우를 찾아주면 되지 않나? 생각을 했다.

근데 어찌저찌 생각의 흐름을 따라가다보니 그게 아니고 괄호는 무제한으로 쓸 수 있고 그냥 어떻게든 최소값만 만들어주면 된다는 걸 알게됐다. 문제 분류를 보고나서 그리디로 풀 수 있는 문제임을 알게 됐는데도 잘 모르겠더라.. 한참을 생각만 했다.

그렇게 결국 또 구글로,,,,

그래도 뭔가 풀 수 있을거 같은데? ("이건 진짜 죽어도 못푼다"와 같은 느낌은 없었기에) 라는 느낌이 있었고 좀 아쉽기도 했다. 그래서 어어어엄청 지이이이인짜 아아아아아주 조금 살짝 힌트만 얻자 라는 생각으로 딱 한 문장만 봐야겠다 라는 생각으로 (온갖 주접을 다 떨면서) 아주 쪼끔 살짝쿵 봤다.

제일 처음 보였던 문구? 문장? 이 바로!!!!

"-"를 기준으로 split 해주면 항상 그게 최소값이 된다.

라는 문장이다. 문제를 잘 이해해서인지, 접근 방식이 비슷해서인지 진짜 왜 그랬는지 모르겠는데 저 문장을 보자마자 순간 온몸에 소름이 돋았다.

아니 이걸!?!?!? 와 ㅡㅡ... 미쳤다...조금만 더 생각해볼껄..

더 시간을 쓰지 못했던 걸 아주 잠깐 후회하고(사실 시간을 더 썼어도 생각 못했을 수도 있다. 아마 그랬을 것이다.)

곧바로 패드에 끄적이기 시작했고, 코드는 5분만에 완성했다.

도중에 슬라이스 해주는 과정에서 에러가 잠시 있었지만 전~혀 지장없었고?

inputList = input().split('-')

# print(inputList)

totalNumList = []

for word in inputList:
    sumVal = 0
    numList = word.split('+')
    
    for i in range(len(numList)):
        sumVal += int(numList[i])
    
    totalNumList.append(sumVal)
    # print(sumVal)

answer = 0
for i in range(len(totalNumList)):
    if i == 0:
        answer = totalNumList[i]
    else:
        answer -= totalNumList[i]
print(answer)

0개의 댓글