Skip to content

Conversation

@LiiNi-coder
Copy link
Contributor

🧷 문제 링크

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

🧭 풀이 시간

30 분

👀 체감 난이도

✏️ 문제 설명

  • 이진 트리 주어지고, 부모-자식2개 관계가 트리 노드개수만큼 주어질 때, 중위순회하면서 노드를 갈아탄 횟수 출력

🔍 풀이 방법

  • 노드기반 트리 사용 및 DFS하며 중위순회끝 노드를 알아내고, 한번다시 DFS돌려서 중위순회끝이면 프로그램 꺼지게(RECUR 탈출)

⏳ 회고

  • private static Map<Integer, Node> Nodes; 는 낭비이다. 키의 값이 1~N까지로 정해져있으니 그냥 Node[] 를 썼으면 되었다.
  • dfs 도중 탈출을 이렇게 System.exit()로 하는 방법 말고도 try~catch문으로 하면 좋다. 단순하게 RuntimeException 으로 해도된다.(단, throw new RuntimeException()을 하게된다면 사실 내부적으로 모든 콜스택을 순회하여 사전정의된 로직을 수행(fillInStackTrace()) 해서 한번은 콜스택 전체 탐색이 이뤄지게된다. 따라서 만약 문제에 따라서 예외를 제어흐름의 일부로 반복해서 수행해야할 경우면 이렇게 커스텀예외로 해야함
static class FoundException extends RuntimeException {
		@Override
		public synchronized Throwable fillInStackTrace() {
			return this;
		}
	}

)

public static void main(String[] args) {
    try {
        dfs(startNode);
    } catch (RuntimeException e) {
        System.out.println("답을 찾아서 탈출 성공");
    }
}

static void dfs(int cur) {
    if (조건 만족) {
        throw new RuntimeException("dfs탈출"); // 예외를 던져서 즉시 main의 catch로 점프
    }
    // ... 탐색 계속
}

  • 실제로 해당문제에서 throw new RuntimeException(...) 방식과 fillInStackTrace() 오버라이딩하여 커스텀예외 만들기, 둘다 백준에서 실행시켜보았는데 각각 524ms, 512ms 로 별 차이가 안났음.

@LiiNi-coder LiiNi-coder added the success 👍 해설을 보지 않고 풀었을 때 label Jan 23, 2026
@ShinHeeEul ShinHeeEul merged commit fc3c56c into main Jan 23, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

success 👍 해설을 보지 않고 풀었을 때

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants