[백준/Boj] 5557 1학년 Python 풀이

2022. 11. 20. 19:29·Algorithm (PS)
728x90

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

 

5557번: 1학년

상근이가 1학년 때, 덧셈, 뺄셈을 매우 좋아했다. 상근이는 숫자가 줄 지어있는 것을 보기만 하면, 마지막 두 숫자 사이에 '='을 넣고, 나머지 숫자 사이에는 '+' 또는 '-'를 넣어 등식을 만들며 놀

www.acmicpc.net

 

1) 시간초과 풀이

n = int(input())
array = list(map(int, input().split()))
answer = 0

def dfs(total, index, target):
    global answer
    if total < 0 or total > 20:
        return
    if index == n-1:
        if total == target:
            answer += 1
        return
    if 0 <= total <= 20:
        dfs(total+array[index], index+1, target)
        dfs(total-array[index], index+1, target)

dfs(array[0], 1, array[n-1])


print(answer)

2) dp 풀이 (통과)

2차원 배열로 dp값을 저장할 공간을 만든다. 

단 연산에서는 무조건 0 ~ 20까지의 숫자만 중간에 등장할 수 있으므로, dp 배열의 길이 또한 (인덱스 길이)*21 로 지정해 준다. 
연산을 할 때 첫번째 원소는 default값이 되어야 하며, 첫번째 원소는 항상 0 ~20 사이의 숫자일 것이므로 dp[0][array[0]] = 1 로 저장해준다. 

이말인 즉슨, 0번째 인덱스의 경우 array[0] 값을 만들 수 있는 경우는 1개 라는 정보이다. 

또한 dp[i-1][j] 를 확인해야 하는 이유는, 이전 계산 값이 0 ~ 20 범위를 초과하여 0 인경우, 고려하지 않아야 하기 때문이다. 

n = int(input())
array = list(map(int, input().split()))

dp = [[0]*21 for _ in range(n)] # index n 번째에 합이 k 가 될때 저장 dp[i][k], k 는 0 ~ 20
dp[0][array[0]] = 1 # 맨 처음 array 원소

for i in range(1, n-1): # 0, ... n-1
    for j in range(21):
        if dp[i-1][j]:
            if 0 <= j + array[i] <= 20:
                dp[i][j+array[i]] += dp[i-1][j]
            if 0 <= j - array[i] <= 20:
                dp[i][j-array[i]] += dp[i-1][j]

print(dp[n-2][array[n-1]])

어렵지만 재밌는 dpdp

728x90

'Algorithm (PS)' 카테고리의 다른 글

백준 9465 스티커 Python  (0) 2022.11.25
[백준] 1309 동물원 Python  (0) 2022.11.23
프로그래머스 - 네트워크 Python (DFS풀이)  (0) 2022.11.18
[백준] 15724 주지수 python 풀이  (0) 2022.11.18
22856 트리 순회 python 풀이  (0) 2022.11.16
'Algorithm (PS)' 카테고리의 다른 글
  • 백준 9465 스티커 Python
  • [백준] 1309 동물원 Python
  • 프로그래머스 - 네트워크 Python (DFS풀이)
  • [백준] 15724 주지수 python 풀이
minjiwoo
minjiwoo
Data Engineering과 Cloud Native 기술에 대해 Dive Deep 하는 플랫폼 엔지니어가 되는 것을 목표로 하고 있습니다. 경험과 공부한 내용을 기록하며 지속가능한 엔지니어가 되는 것이 꿈입니다.
minjiwoo
minji's engineering note
minjiwoo
전체
오늘
어제
  • 분류 전체보기 (613)
    • Data Engineering (42)
      • Apache Spark (11)
      • Databricks & Delta Lake (9)
      • Airflow (3)
      • SQL (6)
      • Trouble Shooting (2)
      • Hadoop (2)
      • MLOps (1)
    • Cloud Engineering (104)
      • AWS (23)
      • Linux 🐧 (29)
      • Docker 🐳 (21)
      • Kubernetes ⚙️ (20)
      • Ansible (10)
    • Computer Science (87)
      • 네트워크 (9)
      • 운영체제 (25)
      • 정보처리기사 (48)
      • CS 기술 면접 스터디 (3)
    • Programming Languages (27)
      • Python (17)
      • C와 C++ (10)
    • Backend (5)
      • Django (2)
    • 프로젝트 (2)
      • 테크포임팩트 (2)
    • iOS (11)
      • 레이블러리 (2)
    • Algorithm (PS) (275)
      • LeetCode (6)
    • 개발일기 (30)
      • 내돈내산 후기🎮 (3)
      • 개발자 취준생 (5)
      • Today I Learned (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

  • Hi there

인기 글

태그

  • 운영체제
  • Databricks
  • 데이터엔지니어링
  • Leetcode
  • 스파크
  • python
  • 빅데이터
  • 프로그래머스
  • Swift
  • 백준
  • 백트래킹
  • dfs
  • 데이터엔지니어
  • BFS
  • Kubernetes
  • 클라우드
  • 알고리즘
  • 쿠버네티스
  • 카카오코딩테스트
  • AWS
  • dp
  • 리눅스
  • ansible
  • 코딩테스트
  • 데이터브릭스
  • linux
  • 파이썬
  • docker
  • SPARK
  • EC2

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
minjiwoo
[백준/Boj] 5557 1학년 Python 풀이
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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