문제
https://www.acmicpc.net/problem/19949
19949번: 영재의 시험
컴퓨터공학과 학생인 영재는 이번 학기에 알고리즘 수업을 수강한다. 평소에 자신의 실력을 맹신한 영재는 시험 전날까지 공부를 하지 않았다. 당연하게도 문제를 하나도 풀지 못하였지만 다행
www.acmicpc.net
풀이
백트래킹을 이용한 문제입니다.
백트래킹 메서드에 매개변수로 찍었는데 맞은 정답의 수, 현재의 인덱스, 찍은 배열을 전달했습니다.
이 때 조건에 따라 정답의 수가 5개가 넘으면 ans++를 통해 답을 구합니다.
그리고 3개 이상 연속된 수를 고를 수는 없다는 조건에 맞게 idx가 2이상일 때는 만약 앞의 idx의 값이 두 번 연속되었다면, 그 수는 다음에서 선택할 수 없도록, ban이라는 변수를 선언해 관리했습니다.
만약 찍은 값이 정답이라면, 백트래킹 메서드에 ansCnt + 1을 해주어 백트래킹을 돌리고, 그렇지 않으면 ansCnt 그대로 백트래킹을 돌립니다.
아래는 전체 코드입니다.
소스 코드
import java.util.Scanner;
public class B19949_영재의시험 {
static int[] ans;
static int cnt;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
ans = new int[10];
for(int i = 0; i<10;i++){
ans[i] = sc.nextInt();
}
cnt = 0;
backTracking(0,0,new int[10]);
System.out.println(cnt);
}
static void backTracking(int ansCnt, int idx, int[] jjik){
if(idx==10){
if(ansCnt>=5){
cnt++;
}
}
else{
int ban = 0;
if(idx>=2){
if(jjik[idx-1]==jjik[idx-2]){
ban = jjik[idx-1];
}
}
for(int i = 1;i<=5;i++){
if(i == ban) continue;
jjik[idx] = i;
if(ans[idx]==i){
backTracking(ansCnt+1,idx+1,jjik);
}
else{
backTracking(ansCnt,idx+1,jjik);
}
jjik[idx] = 0;
}
}
}
}
'Java > BOJ' 카테고리의 다른 글
[BOJ] 백준 21921. 블로그 (0) | 2024.03.27 |
---|---|
[BOJ] 백준 4386. 별자리 만들기 (0) | 2024.03.25 |
[BOJ] 백준 2003. 수들의 합 2 (0) | 2024.03.20 |
[BOJ] 백준 14284. 간선 이어가기2 (2) | 2024.03.19 |
[BOJ] 백준 1806. 부분 합 (0) | 2024.03.19 |