• Home
  • About
    • Awesome soubii photo

      Awesome soubii

      초보 개발자의 공부정리용 블로그입니다. 잘못 쓰여진게 있다면 친절히 알려주세요 :)

    • Learn More
    • Twitter
    • Facebook
    • Instagram
    • Github
    • Steam
  • Posts
    • All Posts
    • All Tags
  • Projects

[Algorithm]14888 연산자 끼워넣기 By Python3

21 Aug 2020

Reading time ~1 minute

오늘의 문제

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

나는 백트래킹이…너무..너무 어렵다……

포인트 쳌쳌

  1. 연산자별 개수를 입력받아 각각의 변수에 저장한다.
  2. 모든 피연산자(num)를 조회할 수 있도록 인덱스를 하나씩 늘려가며 탐색하는 재귀 함수를 정의한다.
  3. 재귀 함수 내에서는 마지막 피연산자가 되었을 경우 종료하는 조건과 각 연산자를 하나씩 줄여가며 함수를 호출하는 조건을 넣어준다.

탐색 문제는 아직도 내게 낯설고 풀기 힘든 존재이다.
백트래킹은 물론 이 문제도 구글링을 통해 내가 생각한 풀이 방식과 가장 유사한 코드를 토대로 이해했다..

풀이 코드

import sys
n = int(input())
num = list(map(int, sys.stdin.readline().split()))
add, sub, multi, divi = map(int, sys.stdin.readline().split()) #연산자별 개수

answer = [] #결과값 저장 리스트

def search(result, idx, add, sub, multi, divi):
    if idx == n:
        answer.append(result)
        return
    else:
        if add > 0:
        #덧셈 개수가 남아있다면
            search(result + num[idx], idx+1, add-1, sub, multi, divi)
        if sub > 0:
        #뺄셈 개수가 남아있다면
            search(result - num[idx], idx+1, add, sub-1, multi, divi)
        if multi > 0:
        #곱셈 개수가 남아있다면
            search(result * num[idx], idx+1, add, sub, multi-1, divi)
        if divi > 0:
        #나눗셈 개수가 남아있다면
            search(int(result/num[idx]), idx+1, add, sub, multi, divi-1)

search(num[0], 1, add, sub, multi, divi)

#첫번째 채점: 88ms 소요
#print(max(answer))
#print(min(answer))

#두번째 채점: 84ms 소요
#sys.stdout.write(str(max(answer))+'\n')
#sys.stdout.write(str(min(answer)))

#세번째 채점: 84ms 소요
answer.sort()
sys.stdout.write(str(answer[-1])+'\n')
sys.stdout.write(str(answer[0]))

문제 통과 후에 출력 코드에 따라 시간이 어떻게 차이가 나나 궁금해서 세번정도 시도해보았다.
—

채점 결과

image



algorithmbojpython3backtracking Share Tweet +1