[BaekJoon]74900(java)の作成


🔗 質問リンク


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

👨🏻‍💻 私が書いたコード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Main {

	static StringBuilder sb = new StringBuilder();
	
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(br.readLine());
		int number;
		
		for (int i=0; i<n; i++) {
			number = Integer.parseInt(br.readLine());
			dfs(number, 1, 1, 1, 0, "1");
			sb.append("\n");
		}
		System.out.println(sb.toString());
	}
	
	// DFS로 내려갈 때마다 각각의 String을 가져야해서 StringBuilder가 아닌 String사용
	static void dfs(int max, int now, int num, int sign, int sum, String str) {
		if(max == now) {
			sum = sum + (num * sign);
			if (sum == 0) {
				sb.append(str +"\n");
			}
			return;
		}
		dfs(max, now+1, num*10+(now+1), sign, sum, str+ " " +String.valueOf(now+1)); 
		// 빈칸인 경우 뒤의 수와 이어야 하기에 sign은 그대로 가져간다.
		dfs(max, now+1, now+1, 1, sum + (num*sign), str+ "+" +String.valueOf(now+1));
		dfs(max, now+1, now+1, -1, sum + (num*sign), str+ "-" +String.valueOf(now+1));
		
		
	}
	


}

📝 整理する


私の問題解きの経験が足りないので、まず問題を読んでから再帰的に問題を解くべきだと思いますが、DFSの問題だと気づくのに時間がかかりました.また、String接続やスペース(+、-)ではない場合の演算も仕方がなく、長い時間がかかった可能性があります.😥😥
Stringは当初、String+String演算が新しいメモリ領域を作成することによって結果値を格納すると考えられていたが、メモリ効率にはよくなかったので、StringBuilderを使ってみた.ただし、StringBuilderを使用する場合、共有メモリアドレスの1箇所を変更すると、他の計算で使用されるStringBuilderの値も変化し、使用に不適切であることを意識して、長時間の思考を経て、最終的にStringを使用します.
実際、DFSを使用して枝を増やすたびに、新しい文字列を生成する必要があるので、Stringを使用するのは問題ではありません.メモリ効率の向上に盲目的なため、誤った考えが発生します.
とにかく...もっと問題を解いて,絶えず実力を高めなければならない.🔥