[Python/Softeer]- [한양대 HCPC 2023] Yeah, but How?

김재만·2024년 11월 13일
0

알고리즘

목록 보기
11/11
post-thumbnail

해당 문제는 Softeer에서 풀어볼 수 있기에 문제 설명은 생략하겠습니다.

문제 해결 방법

이런 괄호 수식 문제들을 많이 풀어봤을때 수식이 올바른지를 물어보는 문제들이 대부분이었는데 수식을 완성하라고해서 조금 당황했습니다.

해당 문제의 경우 어떠한 수식이 오더라도 정답으로 인정해주므로 올바른 수식이면서 가장 간단한 수식만을 구현하면 됐습니다.

  1. 열림['('] 수식 뒤에 닫힘[')'] 수식이 올 때
    • 생각해보면 열리고 바로 닫혔다면 안에는 완성된 수식이 존재해야합니다. 문제에서 예시로 [ (1) ] 도 하나의 완성된 수식으로 보고 있으므로 1을 넣어줍니다.
  2. 닫힘[')'] 수식 뒤에 열림['('] 수식이 올 때
    • 닫히고 열렸다면 두 완성된 수식을 이어주는 최소 한번 이상의 연산이 필요합니다. 가장 간단한 수식 연산으로 [ )+( ] 가 있으므로 '+' 를 넣어줍니다.

정답 코드

이론 자체는 어렵지 않으므로 빠르게 정답 코드로 넘어가겠습니다.

import sys

print(sys.stdin.readline().strip().replace("()", "(1)").replace(")(", ")+("))

그런데 이 때 한가지 궁금증이 생겼습니다.

바로 저 '가능한 수식이 여러가지인 경우, 그중 아무거나 하나를 출력한다.'

저 '아무거나' 문구 하나로 저는 이 문제에 대한 테스트케이스를 작성할 때 그럼 정답코드를 여러개 두고 비교처리한다는건데 정말 아무거나 일지 테스트 해보고 싶었습니다.

그렇게 아래 코드를 만들었습니다.

동작은 똑같으며 사실 replace 로 처리해도 되지만 다양한 처리를 해보려고 만들었습니다.

import sys

s = sys.stdin.readline().rstrip()

pre_w = '('

lst = [pre_w]

for i in range(1, len(s)):
    w = s[i]
    if w != pre_w:
        if pre_w == '(':
            lst.append('1')
        else:
            lst.append('+')
    elif w == ')' and pre_w == ')':
        lst.append('+1')

    lst.append(w)
    pre_w = w

print("".join(lst))

반대쪽도 안해볼 수 없죠?

import sys

s = sys.stdin.readline().rstrip()

pre_w = '('

lst = [pre_w]

for i in range(1, len(s)):
    w = s[i]
    if w != pre_w:
        if pre_w == '(':
            lst.append('1')
        else:
            lst.append('+')
    elif w == '(' and pre_w == '(':
        lst.append('1+')

    lst.append(w)
    pre_w = w

print("".join(lst))

길이를 늘려 [1+] -> [1+1+] 로 진행한 결과 최대 길이인 500,000 글자수를 넘어서서 오답처리가 되는 것 같았습니다.

중간에 값도 넣어보았지만 정말 500,000 글자 수를 넘지 않는다면 어떻게 수식을 배치해도 통과하였습니다.

500,000 글자수를 넘기 전까지 정답 테케를 작성해 비교하는 것 같은데 '굳이? 그냥 가장 짧은 정답 코드 하나로 처리하게 했으면..?' 라는 생각도 들지만 재미있었습니다.

profile
기록으로 남기고 공유를 위한 벨로그입니다.

0개의 댓글