[C++ / 백준 1182번] 부분 수열의 합

2025. 2. 19. 11:29·프로그래밍 공부/백준 (C++)

문제

 

 

 

시행 착오

 

비트마스크 사용법을 몰라 인터넷에 검색해 이해했다. 비트 연산을 통해 백트래킹 사용을 하거나 큰 크기의 배열을 선언할 필요 없이 간편하게 해결할 수 있었다.

 

비트마스크는 아래 글을 읽고 이해했다.

 

https://velog.io/@alkwen0996/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B9%84%ED%8A%B8%EB%A7%88%EC%8A%A4%ED%81%AC

 

[알고리즘] | 비트마스크

비트마스크란? > 컴퓨터는 내부적으로 모든 자료를 이진수(비트)로 처리한다. 이런 컴퓨터의 연산방식을 이용한, 정수의 이진수 표현을 활용하여 문제를 해결하는 기법을 말한다. 비트(Bit)란? 비

velog.io

 

비트마스크 풀이의 좋은 점은 O(1) 시간에 계산이 가능하다는 점이다. 실행 시간이 빨라지고 메모리도 적게 사용하며, 집합을 이용해 0부터 1<<N -1 까지의 경우의 수를 비트연산을 이용해 전부 체크해볼 수 있다. 어떤 문제에서는 백트래킹보다 효율적인듯 하다.

 

 

 

해결 방법

 

비트마스크 사용 X (백트래킹만 사용) 

 

#include <iostream>
using namespace std;

int N, S, cnt = 0;
int s[21];

void recur(int ind, int cursum)
{
    if (ind == N)  // 종료 조건: 모든 원소를 탐색했을 때
    {
        if (cursum == S) cnt++;
        return;
    }

    // 현재 원소를 선택하는 경우
    recur(ind + 1, cursum + s[ind]);

    // 현재 원소를 선택하지 않는 경우
    recur(ind + 1, cursum);
}

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> N >> S;

    for (int i = 0; i < N; i++)
        cin >> s[i];

    recur(0, 0);

    // 공집합 제거 (S == 0일 때, 아무것도 선택하지 않은 경우 포함됨)
    if (S == 0) cnt--;

    cout << cnt;
    return 0;
}

 

 

비트마스크 사용

 

#include <iostream>
using namespace std;

int N, S, cnt = 0;
int s[20];

int main() {
    cin.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> N >> S;

    for (int i = 0; i < N; i++)
        cin >> s[i];

    for (int i = 1; i < (1 << N); i++)
    {
        int sum = 0;
        for (int j = 0; j < N; j++)
        {
            if (i & (1 << j))
            {
                sum += s[j];
            }

           
        }

        if (sum == S)
        {
            cnt++;
        }
    }


    cout << cnt;



    return 0;
}

 

 

'프로그래밍 공부 > 백준 (C++)' 카테고리의 다른 글

[C++ / 백준 13023번] ABCDE  (0) 2025.02.20
[C++ / 백준 14391번] 종이 조각  (0) 2025.02.20
[C++ / 백준 11723번] 집합  (0) 2025.02.18
[C++ / 백준 1248번] Guess(맞춰봐)  (0) 2025.02.05
[C++ / 백준 2529번] 부등호  (0) 2025.01.13
'프로그래밍 공부/백준 (C++)' 카테고리의 다른 글
  • [C++ / 백준 13023번] ABCDE
  • [C++ / 백준 14391번] 종이 조각
  • [C++ / 백준 11723번] 집합
  • [C++ / 백준 1248번] Guess(맞춰봐)
Rocketbabydolls
Rocketbabydolls
Rocketbabydolls
  • Rocketbabydolls
    With The Lights Out
    Rocketbabydolls
  • 전체
    오늘
    어제
    • 전체글 (183)
      • 프로그래밍 공부 (117)
        • C (16)
        • Jumping into C++ (9)
        • MFC (C++) (1)
        • 자료구조 (1)
        • 알고리즘 (1)
        • 백준 (C++) (74)
        • 핸즈온 머신러닝 2판 (6)
        • Unseen 3기 준비 (4)
        • 원티드 포텐업 게임 개발자 양성과정 2기 (4)
      • 언리얼엔진5 (62)
        • [Part1] 이득우의 언리얼 프로그래밍 (12)
        • [Part2] 이득우의 언리얼 프로그래밍 (2)
        • [Part2 복습] 이득우의 언리얼 프로그래밍 (3)
        • [Part3] 이득우의 언리얼 프로그래밍 (14)
        • [Part4] 이득우의 언리얼 프로그래밍 (0)
        • FPS 게임 1인 프로젝트 (6)
        • 각종 지식 (10)
        • 블루프린트 Paper2D 로 게임 만들기 (14)
        • 팀 프로젝트 (1)
      • 일상 (1)
      • ETC (1)
        • 맥북 (1)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      실전C프로그래밍
      언리얼엔진 디자인 패턴
      언리얼엔진5
      실전 C프로그래밍 실습문제
      실전 C 프로그래밍
      언리얼엔진5 fps 프로젝트
      언리얼엔진
      핸즈온 머신러닝
      언리얼엔진 옵저버 패턴
      실전 C프로그래밍
      실전 C프로그래밍 나중채
      C언어 실습문제
      c언어
      오블완
      핸즈온 머신러닝 2판
      언리얼엔진 중재자 패턴
      티스토리챌린지
      실전C프로그래밍 실습문제
      c++ 17298
      실전C프로그래밍 나중채
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++ / 백준 1182번] 부분 수열의 합
    상단으로

    티스토리툴바