[백준] 14888번: 연산자 끼워넣기(실버 1, 파이썬)

2023. 12. 29. 18:11· Coding Test/Python
목차
  1. 아이디어
  2. 전체 코드

https://www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱

www.acmicpc.net

 

 

아이디어

해당 문제는 dfs를 사용하여 풀었다. 

 

문제를 풀면서 나눗셈을 처리하기 위해 처음에는 //연산자를 사용했지만, 자꾸 답이 다르게 나오는 오류가 있었다.

print(int ( -1 / 3))    # 0
print(-1 // 3)          # -1

오류를 바로잡기 위해서는 위 두 연산의 차이를 알아야했다. 

파이썬의 -1 // 3 연산이 -1을 반환하는 이유는 floor division을 사용하기 때문이었다.

내부적으로 q=floor(a/n)로 동작하기 때문에 -0.XX의 경우 -1을 반환한다.

 

이해를 돕기 위해 참고하기 좋은 글을 가져왔다. 

https://stackoverflow.com/questions/19517868/integer-division-by-negative-number

 

Integer division by negative number

What should integer division -1 / 5 return? I am totally confused by this behaviour. I think mathematically it should be 0, but python and ruby are returning -1. Why are different languages behaving

stackoverflow.com

 

각 연산에 대한 처리를 구현하고 나서, 두 번째 문제를 마주쳤다.

바로 최댓값, 최솟값의 초기화였다.

처음에는 단순히 0으로 선언했지만, 이렇게되면 min(min_value, X) 일 때 X가 양수라면 무조건 0이 반환되기 때문에 문제가 생겼다.

그래서 본문을 다시 살펴보니 아래와 같은 부분이 있었다.

 연산자를 어떻게 끼워넣어도 항상 -10억보다 크거나 같고, 10억보다 작거나 같은 결과가 나오는 입력만 주어진다. 

그래서 max를 -10억, min을 10억으로 초기화해주었다. (1e9는 실수이기 때문에 정수로 바꿔주었다.)

max_value = -int(1e9)
min_value = int(1e9)

 

 

전체 코드

N = int(input())
nums = [ int(x) for x in input().split() ]
add, sub, mul, div = map(int, input().split()) # 덧셈(+)의 개수, 뺄셈(-)의 개수, 곱셈(×)의 개수, 나눗셈(÷)의 개수

max_value = -int(1e9)
min_value = int(1e9)

def dfs(curr, data):
    global add, sub, mul, div, max_value, min_value

    if curr == N:
        max_value = max(max_value, data)
        min_value = min(min_value, data)
        return
    
    if add > 0:
        add -= 1
        dfs(curr + 1, data + nums[curr])
        add += 1
    
    if sub > 0:
        sub -= 1
        dfs(curr + 1, data - nums[curr])
        sub += 1

    if mul > 0:
        mul -= 1
        dfs(curr + 1, data * nums[curr])
        mul += 1

    if div > 0:
        div -= 1
        dfs(curr + 1, int(data / nums[curr]))
        div += 1
    
dfs(1, nums[0])
print(max_value)
print(min_value)

'Coding Test > Python' 카테고리의 다른 글

[LeetCode 75] 1071. Greatest Common Divisor of Strings (easy, python)  (1) 2023.12.30
[LeetCode 75] 1768. Merge Strings Alternately (easy, python)  (0) 2023.12.30
[백준] 14503번: 로봇 청소기 (골드 5, 파이썬)  (1) 2023.12.29
[백준] 3190번: 뱀 (골드 4, 파이썬)  (1) 2023.12.22
[백준] 14502번: 연구소 (골드4, 파이썬)  (0) 2023.12.22
  1. 아이디어
  2. 전체 코드
'Coding Test/Python' 카테고리의 다른 글
  • [LeetCode 75] 1071. Greatest Common Divisor of Strings (easy, python)
  • [LeetCode 75] 1768. Merge Strings Alternately (easy, python)
  • [백준] 14503번: 로봇 청소기 (골드 5, 파이썬)
  • [백준] 3190번: 뱀 (골드 4, 파이썬)
lim.dev
lim.dev
* 깃허브: https://github.com/Ellie010707
코딩림* 깃허브: https://github.com/Ellie010707
lim.dev
코딩림
lim.dev
전체
오늘
어제
  • 분류 전체보기 (205)
    • Network (6)
    • Backend (31)
      • Django (8)
      • Spring Boot (22)
    • Frontend (3)
    • Coding Test (107)
      • Python (93)
      • Java (1)
      • C_C#_C++ (4)
      • SQL (8)
    • Security (40)
      • 해커스쿨_FTZ (19)
      • VM (6)
      • CodeEngn (11)
      • Linux (4)
    • Project (2)
    • etc (12)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • ftz 풀이
  • linux
  • 해커스쿨
  • abex
  • 리버서
  • ftz writeup
  • crackme
  • ftz write up
  • 리눅스
  • 코드엔진
  • ftz풀이
  • 해킹
  • reversing
  • 리눅스마스터
  • hacking
  • ftz
  • stolenbyte
  • 리버싱
  • 해커스쿨ftz
  • CodeEngn

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
lim.dev
[백준] 14888번: 연산자 끼워넣기(실버 1, 파이썬)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.