오늘 풀어본 문제는 ⭐도영이가 만든 맛있는 음식 이라는 문제다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int [][] TASTE;
static long ANSWER;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
N = Integer.parseInt(br.readLine());
TASTE = new int[N][2];
for(int i=0; i<N; i++){
TASTE[i] = Arrays.stream(br.readLine().split(" "))
.mapToInt(s -> Integer.parseInt(s))
.toArray();
}
ANSWER = Long.MAX_VALUE;
johap(0, 0, 1, 0);
System.out.println(ANSWER);
}
static void johap (int start, int visit, long sour, long bitter) {
if(start == N)
return;
for(int i = start; i<N; i++){
if ((visit & (1 << i)) != 0) continue;
visit |= (1<<i);
long ns = sour * TASTE[i][0];
long nb = bitter + TASTE[i][1];
long newTaste = Math.abs(ns - nb);
ANSWER = Math.min(ANSWER, newTaste);
johap(i + 1, visit, sour * TASTE[i][0], bitter + TASTE[i][1]);
visit &= ~(1<<i);
}
}
}
사실 비트마스킹을 연습해보고자 푼 문제다.
비트마스킹으로 현재 방문했는지 확인하는 조건문
if ((visit & (1 << i)) != 0) { continue; }
비트마스킹으로 i번째 방문체크
visit |= (1<<i);visit의 초기값은 0에서 시작한다.
비트마스킹으로 i번째 방문해제
visit &= ~(1<<i);