Baek_14888

원성혁·2022년 10월 3일
0

algorithm

목록 보기
1/21
post-thumbnail

오늘부터 지금까지 하던 PS 문제풀이를 Velog에서 하기로 결정했다ㅎㅎ
친구랑 같이 1일 1문제를 목표로 달릴 예정이다.

오늘의 문제는 백준 14888
문제집을 찾아서 해볼까 하다가 적당한 블로그에서 순서를 알려줬길래 참고해서 풀어보기로했다.
레벨은 실버1로 우리 수준에 적당한 문제이다.
내 목표는 일단 골드 문제를 풀수 있는 실력향상이기 때문에 첫날 준비운동으로 딱이다!

물론 옆에 '재귀 탐색의 기본' 이라고 써있어서 스포를 당해서 더 쉽게 풀었을 수는 있지만ㅎㅎ

import sys
input = sys.stdin.readline
import copy

cnt = int(input())
list_num = list(map(int,input().split()))
list_sign = list(map(int,input().split()))
res = set()

def cal(sign,temp = []):
    if sum(sign) == 0:
        num = list_num[0]
        for i,val in enumerate(temp):
            if val == 0:
                num += list_num[i+1]
            elif val == 1:
                num -= list_num[i+1]
            elif val == 2:
                num *= list_num[i+1]
            else:
                num /= list_num[i+1]
                num = int(num)
        res.add(num)
    else:
        for i in range(4):
            tmp = copy.deepcopy(temp)
            sgn = copy.deepcopy(sign)
            if sgn[i] > 0:
                sgn[i] -= 1
                tmp.append(i)
                cal(sgn,tmp)
cal(list_sign)
print(max(res))
print(min(res))

결과적으로는 브루트포스 알고리즘이다. 모든 연산의 경우를 다 해보고 재귀로 구현하였다...
중간에 재귀를 위한 리스트를 파라미터로 넘겨줄때 deepcopy를 사용했는데 이게 일반 copy도 제출 후에 해보니 되는거 같더라...

나는 재귀를 돌다가 최종 연산을 할때는 sum 이 0이 되도록 설계했는데 더 좋은 방법이 있을지 궁금하긴 하다.
0의 갯수를 세거나 뭐 다른 방법이 있겠지??

솔직히 max min은 python 기능으로 해결했지만 global함수로 max값고 min값을 갖고 가면서 업데이트 해주는 것이 더 좋을 수도 있겠다는 생각이 든다. 아마 시간차이는 미묘하겠지만

암튼 맘먹고 하는 스터디와 블로그 꾸준히 잘 해보겠다.

profile
AI개발자를 향해 전진중

0개의 댓글