[C++ / 백준 1248번] Guess(맞춰봐)

2025. 2. 5. 15:56·프로그래밍 공부/백준 (C++)

 

백트래킹을 이용해 푸는 문제.

늘상 하던 백트래킹 말고 좋아보이는 방법을 하나 발견할 수 있었는데, 처음에는 N^2 시간복잡도로 풀이하려 했었다.
그 대신 Sum 배열을 선언한 후 합을 미리 구해 놓는 방식이다. 이를 통해 시간복잡도를 획기적으로 줄일 수 있다.
원하는 범위(-10 ~ 10) 까지에서 원하는 Depth 까지 순열을 구한다.
(1, 1), (2,2) (3,3)  ----  이렇게 i == j 일 때는 무조건 자기 자신을 검사하면 되므로

 

if ((sign[depth][depth] == '+' && i <= 0) ||
    (sign[depth][depth] == '-' && i >= 0) ||
    (sign[depth][depth] == '0' && i != 0)) {
    continue;
}

 

이렇게 복잡도를 줄일 수 있다.

그리고 recur() 함수로 재귀 호출을 하기 전에 check() 로 유효성을 검사했다. (훨씬 효율적인 방법이다.)

삼항 연산자 이용

두 번의 삼항 연산자 이용이 있었는데,

 

     sum[depth] = (depth > 0 ? sum[depth - 1] : 0) + i;

 

int tmp = sum[depth] - (i > 0 ? sum[i - 1] : 0);

 

이렇게 두 번이다.

시간 복잡도를 1까지 줄일 수 있는 좋은 방법으로 애용해야겠다.

 

 

#include <iostream>
#include <vector>
using namespace std;

char sign[10][10];

vector<int> seq;
int N;

int sum[10] = { 0 };

bool check(int depth)
{
 
    for (int i = 0; i < depth; i++)
    {

        int tmp = sum[depth] - (i > 0 ? sum[i - 1] : 0);


        if ((tmp >= 0 && sign[i][depth] != '+') ||
            (tmp <= 0 && sign[i][depth] != '-') ||
            (tmp == 0 && sign[i][depth] != '0'))
        {
            return false;
        }

    }
    return true;

}


void recur(int depth)
{
    if (depth == N)
    {
            for (auto i : seq)
            {
                cout << i << " ";
            }
            exit(0);
     
        return;
    }


    for (int i = -10; i <= 10; i++)
    {
        if ((sign[depth][depth] == '+' && i <= 0) ||
            (sign[depth][depth] == '-' && i >= 0) ||
            (sign[depth][depth] == '0' && i != 0)) {
            continue;
        }

            seq.push_back(i);
            sum[depth] = (depth > 0 ? sum[depth - 1] : 0) + i;

            if(check(depth))
                recur(depth + 1);

            seq.pop_back();
            
    }
}


int main()
{
    cin >> N;

    for (int i = 0; i < N; i++)
    {
        for (int j = i; j < N; j++)
        {
            cin >> sign[i][j];
        }
    }

    recur(0);   


    return 0;
}

 

 

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

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

    • 링크

    • 공지사항

    • 인기 글

    • 태그

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

    • 최근 글

    • hELLO· Designed By정상우.v4.10.3
    Rocketbabydolls
    [C++ / 백준 1248번] Guess(맞춰봐)
    상단으로

    티스토리툴바