[BOJ] 1학년 5557번 C++

2024. 3. 9. 14:55· Algorithm

 

 

문제

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

상근이는 올바른 등식을 만들려고 한다. 상근이는 아직 학교에서 음수를 배우지 않았고, 20을 넘는 수는 모른다. 따라서, 왼쪽부터 계산할 때, 중간에 나오는 수가 모두 0 이상 20 이하이어야 한다. 예를 들어, "8+3+2-4-8-7+2+4+0+8=8"은 올바른 등식이지만, 8+3+2-4-8-7이 음수이기 때문에, 상근이가 만들 수 없는 등식이다.

숫자가 주어졌을 때, 상근이가 만들 수 있는 올바른 등식의 수를 구하는 프로그램을 작성하시오.

입력

첫째 줄에 숫자의 개수 N이 주어진다. (3 ≤ N ≤ 100) 둘째 줄에는 0 이상 9 이하의 정수 N개가 공백으로 구분해 주어진다.

출력

첫째 줄에 상근이가 만들 수 있는 올바른 등식의 개수를 출력한다. 이 값은 263-1 이하이다

 

접근 방식

 

이걸 어떻게 점화식을 만들어야 할지 처음에 감이 안왔다

각자리 숫자를 더하거나 뺄 때 0~20 사이의 값이 나오면 해당 점화식을 처리해주고 마지막 값을 제외하고 해당 등식의 값이 가장 마지막 값이 되면 출력임은 인지를 했지만

이걸 어떻게 DP로 풀어야할지 막막했다

 

그런데 풀이는 생각보다 쉬웠다는..!

DP 배열은 2차원 배열로 잡고, DP[i][j]는  i번째까지 고려했을 때 j값을 만들수있으면 이전 값에서 더해주면 된다

만약 j 에다가 현재 num[i]를 더했을 때 20보다 작으면 dp[i][j+num[i]] += dp[i-1][j]해주면 되고

만약 뺄 때 0보다 크면 dp[i][j-num[i]] += dp[i-1][j] 해주면 된다!

 

점화식은 진짜 간단한데 생각하기까지가 어려웠던 문제... ㅜ

 

코드

 

#include<bits/stdc++.h>
using namespace std;

long long dp[103][21]; // i번째 까지 고려해서 만들수있는 수 j

int main() {
    int N; cin>>N;
    int num[103];
    for(int i=0; i<N; i++) cin>>num[i];

    dp[0][num[0]] = 1;
    
    for(int i=1; i<N-1; i++) {
        for(int j=0; j<=20; j++) {
            if(dp[i-1][j]) {
                if(j + num[i] <= 20) dp[i][j+num[i]] += dp[i-1][j];
                if(j - num[i] >= 0) dp[i][j-num[i]] += dp[i-1][j];
            }
        }

    }
    cout<<dp[N-2][num[N-1]];

}

 

'Algorithm' 카테고리의 다른 글

[BOJ] 경로 찾기 11403번 C++  (3) 2024.03.12
[BOJ] 특정 거리의 도시 찾기 18352번 C++  (0) 2024.03.11
[BOJ] 퇴사 2 15486번 C++  (0) 2024.03.07
[BOJ] 징검다리 건너기 21317 C++  (0) 2024.03.06
[BOJ] 설탕 배달 2839번 C++  (0) 2024.02.28
'Algorithm' 카테고리의 다른 글
  • [BOJ] 경로 찾기 11403번 C++
  • [BOJ] 특정 거리의 도시 찾기 18352번 C++
  • [BOJ] 퇴사 2 15486번 C++
  • [BOJ] 징검다리 건너기 21317 C++
따봉치치
따봉치치
김치치의개발블로그따봉치치 님의 블로그입니다.
따봉치치
김치치의개발블로그
따봉치치
전체
오늘
어제
  • 분류 전체보기 (359)
    • 면접질문 (4)
    • CS (50)
    • FE (116)
      • Javascipt (16)
      • Typescipt (6)
      • React (16)
      • CSS (5)
      • Nextjs (1)
      • 리뷰 (70)
    • Algorithm (181)
    • ETC (3)
      • Bootcamp (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • BOJ
  • 리액트
  • TOPCIT
  • typescript
  • 모던 자바스크립트 딥다이브
  • CS
  • 그리디
  • 그래프 탐색
  • 문자열
  • Fe
  • BFS
  • Stack
  • 완전탐색
  • react
  • 알고리즘
  • 백트래킹
  • 탐욕 알고리즘
  • 모던 리액트 딥다이브
  • dp
  • 누적합
  • Greedy
  • javascript
  • 투 포인터
  • 우선순위 큐
  • 자료구조
  • 자바스크립트
  • 스택
  • 데이터베이스
  • C++

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
따봉치치
[BOJ] 1학년 5557번 C++
상단으로

티스토리툴바

단축키

내 블로그

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

블로그 게시글

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

모든 영역

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

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