[백준] 7490번 : 0 만들기 (JAVA/자바)

2026. 2. 3. 17:09·PS/백준

[문제 링크]

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

문제 설명

1 ~ N까지 오름차순으로 된 수열의 숫자들 사이에 '+', '-', ' '(공백) 를 적절하게 삽입한다.

이렇게 해서 만들어진 수식을 계산한 결과가 0이 되는 모든 수식을 찾는다.

 

 

 

문제 풀이

알고리즘 분류

  • 문자열
  • 완전탐색
  • 깊이 우선 탐색(DFS)

수식의 결과가 0이 되는 모든 수식을 찾아야 하기 때문에 완전탐색으로 모든 경우의 수를 탐색한다.

1. 재귀함수를 사용해서 숫자들 사이에 +, - " "(공백) 중 하나를 선택해서 만들 수 있는 수식을 문자열 형태로 생성한다. 

dfs(num + 1, str + " " + (num+1));
dfs(num + 1, str + "+" + (num+1));
dfs(num + 1, str + "-" + (num+1));

 

 

하나의 수식이 완성되면 calculate() 함수로 수식의 결과값이 0 이 되는 경우를 찾는다.

문자열로 된 수식을 숫자와 연산자(+, -)로 나눈 후 수식을 계산한다. 

1. 숫자와 숫자 사이가 " "(공백)인 경우, 공백을 제거한다.

    "1 2-3"인 경우, 공백을 제거하면 "12-3"

String express = str.replace(" ", "");

 

2. +, - 의 앞뒤로 공백 한 칸씩을 추가한다.(여기서 추가한 " "(공백)을 기준으로 숫자와 연산자를 나누기 위해)

   "1+2-3" → "1 + 2 - 3"→  {"1", "+", "2", "-", "3"}

String express1 = express.replace("+",  " + ").replace("-", " - ");

 

3. 위의 express1 배열을 공백을 기준으로 나눠서 새로운 배열 strings를 생성한다.

String[] strings = express1.split(" ");

 

4. strings 배열을 처음부터 탐색하면서 +, -를 찾아서 계산한다.

for(int i = 1; i < strings.length; i += 2) {
    if(strings[i].equals("+")) {
        sum += Integer.parseInt(strings[i + 1]);
    } else if (strings[i].equals("-")) {
        sum -= Integer.parseInt(strings[i + 1]);
    }
}

 

 

전체코드

import java.io.*;

public class Main {

    static int n;
    static StringBuilder sb = new StringBuilder();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        while(t > 0) {
            n = Integer.parseInt(br.readLine());
            dfs(1, "1");
            sb.append("\n");
            t--;
        }
        System.out.println(sb);
    }

    public static void dfs(int num, String str) {
        if(num == n) {
            if(calculate(str) == 0) {   //수식을 계산에서 값이 0이면 sb에 추가
                sb.append(str + " \n");
            }
            return;
        }

        dfs(num + 1, str + " " + (num+1));
        dfs(num + 1, str + "+" + (num+1));
        dfs(num + 1, str + "-" + (num+1));
    }

    public static int calculate(String str) {
        String express = str.replace(" ", "");  //숫자와 숫자 사이 공백 제거

        /* +. - 앞뒤로 공백 한 칸씩을 추가한 후, " "(공백)을 기준으로 문자열을 쪼갠다.
          1+2-3 -> 1 + 2 - 3 -> {"1", "+", "2", "-", "3"}
        */
        String express1 = express.replace("+",  " + ").replace("-", " - ");
        String[] strings = express1.split(" ");

        int sum = Integer.parseInt(strings[0]);
        for(int i = 1; i < strings.length; i += 2) {
            if(strings[i].equals("+")) {
                sum += Integer.parseInt(strings[i + 1]);
            } else if (strings[i].equals("-")) {
                sum -= Integer.parseInt(strings[i + 1]);
            }
        }
        return sum;
    }
}
저작자표시 비영리 변경금지 (새창열림)

'PS > 백준' 카테고리의 다른 글

[백준] 1713번 : 후보 추천하기 (JAVA/자바)  (1) 2026.01.28
[백준] 2467번 : 용액 (JAVA/자바)  (0) 2026.01.14
[백준] 1092번 : 배 (JAVA/자바)  (0) 2026.01.11
[백준] 14503번 : 로봇청소기 (JAVA/자바)  (0) 2025.11.08
[백준] 17298번 : 오큰수 (JAVA/자바)  (0) 2025.10.23
'PS/백준' 카테고리의 다른 글
  • [백준] 1713번 : 후보 추천하기 (JAVA/자바)
  • [백준] 2467번 : 용액 (JAVA/자바)
  • [백준] 1092번 : 배 (JAVA/자바)
  • [백준] 14503번 : 로봇청소기 (JAVA/자바)
nyrimmm
nyrimmm
  • nyrimmm
    NA의 개발냥발
    nyrimmm
  • 전체
    오늘
    어제
  • 블로그 메뉴

    • 홈
    • 태그
    • 분류 전체보기 (96)
      • Java (5)
      • Spring & SpringBoot (3)
      • Network (1)
      • DataBase (0)
      • SQL (1)
      • IntelliJ (3)
      • Git (0)
      • 자료구조 & 알고리즘 (2)
      • 트러블 슈팅 (1)
        • Spring (1)
      • PS (79)
        • 백준 (31)
        • 프로그래머스 (5)
        • SQL (10)
        • 이코테 (33)
      • 후기 & 회고 (1)
  • 인기 글

  • 태그

    우선순위큐
    이진탐색
    PriorityQueue
    백준
    프로그래머스
    구현
    HashMap
    투포인터
  • hELLO· Designed By정상우.v4.10.6
nyrimmm
[백준] 7490번 : 0 만들기 (JAVA/자바)
상단으로

티스토리툴바