알고리즘

정올 JAVA - 벽장문의 이동 (1409) 백트래킹

jun.s.gi 2023. 5. 11. 23:06
728x90

https://beta.jungol.co.kr/problem/1409?cursor=eyJwcm9ibGVtc2V0Ijo4LCJmaWVsZCI6MiwiaWR4Ijo1fQ==

 

1. rec(열어야할 벽장 위치, 비용(현재 벽장 위치 - 열려있는 벽장 위치), 열린 곳01, 열린 곳 02)

2. 비용이 구해놓은 최솟값보다 크면 더이상 탐색하지 않고 돌아간다.

 

 

import java.util.Scanner;
import java.util.ArrayList;
public class Main {
	static int n;
	static int open1, open2;
	static int go;
	static int answer = 0x7fffffff;
	static ArrayList<Integer> arr = new ArrayList<Integer>();
	
	static void rec(int cnt, int cost, int Open1, int Open2) {
		if(answer < cost) return; // 비용이 구해놓은 최솟값보다 크면 리턴
        
		if(cnt == go) {
			answer = cost;
			return;
		}
		
		
		if(arr.get(cnt) == Open1 || arr.get(cnt) == Open2) { // 현재 위치에 벽장문이 열려있으면 바로 다음 벽장으로
			rec(cnt + 1, cost, Open1, Open2);
		}else {
			rec(cnt + 1, cost + Math.abs(arr.get(cnt) - Open1), arr.get(cnt), Open2);
			rec(cnt + 1, cost + Math.abs(Open2 - arr.get(cnt)), Open1 ,arr.get(cnt));			
		}
		
		return;
	}
	
	
	public static void main(String agus[]) {
		Scanner input = new Scanner(System.in);
		
		n = input.nextInt();
		open1 = input.nextInt();
		open2 = input.nextInt();
		go = input.nextInt();

		
		for(int i = 0 ; i < go ; i++) 
			arr.add(input.nextInt());
		
			
		rec(0, 0, open1, open2);
		System.out.println(answer);
	}
}
728x90