코딩 공부

[Python](DFS) 백준 14888번 : 연산자 끼워넣기 본문

삼성 SW 역량 테스트 기출 문제

[Python](DFS) 백준 14888번 : 연산자 끼워넣기

Algomalgo 2024. 1. 16. 17:37
728x90


<접근 방법>

  1. 덧셈, 뺄셈, 곱셈, 나눗셈 연산자의 개수를 받아서 사용할 때마다 하나씩 빼는 형태로 calc 함수를 만들어야겠다.
  2. 주어진 "수열의 숫자 개수"는 "연산자의 개수 + 1"이므로 calc안에서 number_lst[n+1]을 이용한다.
  3. 나눗셈을 할 때에는 문제에 쓰여있는대로 유의해서 로직을 짠다(음수를 양수로 나눌 때).
# 예제 3번
def calc(n, pl, mi, mu, di, result):
    global max_ans, min_ans
    if n == N-1:    # 모든 연산자를 사용했다면
        max_ans = max(max_ans, result)  # 최댓값 갱신
        min_ans = min(min_ans, result)  # 최솟값 갱신
        return
    if pl:  # 사용할 수 있는 덧셈 연산자가 남아있을 경우
        calc(n+1, pl-1, mi, mu, di, result+number_lst[n+1])
    if mi:  # 사용할 수 있는 뺄셈 연산자가 남아있을 경우
        calc(n+1, pl, mi-1, mu, di, result-number_lst[n+1])
    if mu:  # 사용할 수 있는 곱셈 연산자가 남아있을 경우
        calc(n+1, pl, mi, mu-1, di, result*number_lst[n+1])
    if di:  # 사용할 수 있는 나눗셈 연산자가 남아있을 경우
        if result < 0:  # 음수를 양수로 나눌 때
            calc(n+1, pl, mi, mu, di-1, -(abs(result)//number_lst[n+1]))
        else:   # 그 외
            calc(n+1, pl, mi, mu, di-1, result//number_lst[n+1])


N = int(input())
number_lst = list(map(int, input().split()))
plus, minus, mul, div = map(int, input().split())
max_ans, min_ans = -1000000000, 1000000000
calc(0, plus, minus, mul, div, number_lst[0])   # calc(0, 2, 1, 1, 1, 1) 
print(max_ans)
print(min_ans)

<틀렸던 이유>

보통, 여러 언어를 사용하다보면 최댓값과 최솟값을 임의로 1e9, -1e9로 나타내는 경우가 많아서
max_ans, min_ans = -1e9, 1e9로 했었는데 틀렸었다.
1e9, -1e9를 출력해보면 소숫점이 포함된 실수로 표기되기에 계산에 차질이 생겼던 것이다.

그래서 문제에 나와있는 그대로 10억, -10억으로 쓰는 게 맞다.

print(1e9, -1e9)의 결과

이해가 안되는 부분이 있으면 질문 주세요. 감사합니다.

728x90