728x90

[문제 링크]

 

1014번: 컨닝

최백준은 서강대학교에서 “컨닝의 기술”이라는 과목을 가르치고 있다. 이 과목은 상당히 까다롭기로 정평이 나있기 때문에, 몇몇 학생들은 시험을 보는 도중에 다른 사람의 답지를 베끼려 한

www.acmicpc.net

 

import java.util.*;

public class Main {
	static int dp[][]; //자리
	static boolean visited[][]; //컨닝 가능한 자리
	static int N,M;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int T = sc.nextInt();

		for(int i = 0; i < T; i++) {
			N = sc.nextInt();
			M = sc.nextInt();
			dp = new int[1<<N][M];

			for(int j = 0; j < (1<<N); j++) {
				Arrays.fill(dp[j], -1); //-1로 배열 초화화
			}

			visited = new boolean[N][M];
			for(int j = 0; j < N; j++) {
				String input = sc.next();
				for(int k = 0; k < M; k++) {
					if(input.substring(k, k+1).equals("x"))
						visited[j][k] = true;
				}
			}
			int result = getDP(0,0);
			System.out.println(result);
		}
	}

	static int getDP(int n, int m) {
		if(m==M) return 0; //모든 줄을 체크한 경우
		if(dp[n][m] != -1) return dp[n][m];
		int num = n;
		
		for(int i = 0; i < N; i++) {
			if ((n & (1<<i)) > 0){
				num |= (1<<(i+1));
				num |= (1<<(i -1));
			}
		}

		int res = getDP(0, m+1); //아무도 앉히지 않고 다음 줄로 넘어가는 경우
		for(int i = 1; i < (1<<N); i++) {
			if((i&num) > 0) continue; //나올 수 없는 경우의 수 제외
			int count = 0;
			boolean isAvail = true;

			for(int j = 0; j < N && isAvail; j++) {
				if((i & (1<<j)) > 0) { //해당 자리에 학생이 앉아있는 경우
					count++;
					if (visited[j][m]) isAvail = false; //장애물이 있을 시 = 나올 수 없는 경우의 수
				}
			}
			if(!isAvail) continue; //
			res = Math.max(res, getDP(i, m+1) + count);
		}
		return dp[n][m] = res;
	}
}

 

이번 문제는 아래의 블로그를 보며 해결하였으며, 공부가 더 필요한 것 같다😓

 

[백준 1014][자바] 컨닝

https://www.acmicpc.net/problem/1014 1014번: 컨닝 문제 최백준은 서강대학교에서 “컨닝의 기술”이라는 과목을 가르치고 있다. 이 과목은 상당히 까다롭기로 정평이 나있기 때문에, 몇몇 학생들은 시험

pigranya1218.tistory.com

참고를 위해 블로그 링크를 삽입했다.

728x90

'💻코딩 > 💡Baekjoon' 카테고리의 다른 글

[백준] 1015 수열 정렬  (0) 2023.05.18
[백준] 1016 제곱 ㄴㄴ 수  (0) 2023.05.02
[백준] 1013 Contact  (0) 2023.01.16
[백준] 1012 유기농 배추  (2) 2023.01.13
[백준] 1010 다리 놓기  (0) 2023.01.11

+ Recent posts