공부방

러시아 국기 같은 깃발 / 완전 탐색 / 문제 사고력 본문

문법/알고리즘

러시아 국기 같은 깃발 / 완전 탐색 / 문제 사고력

코딩 화이팅 2023. 3. 3. 14:02

https://swexpertacademy.com/main/talk/solvingClub/problemView.do?contestProbId=AWQl9TIK8qoDFAXj&solveclubId=AYWesuzK3nUDFAQK&problemBoxTitle=3%EC%A3%BC%EC%B0%A8&problemBoxCnt=7&probBoxId=AYaW02iKojQDFARM

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

package SWEA;

import java.util.Scanner;

public class 나홀로러시아 {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int T=sc.nextInt();
		for (int Tc = 1; Tc <= T; Tc++) {
			int n=sc.nextInt();
			int m=sc.nextInt();
			char[][] map=new char[n][m];
			for (int y = 0; y < n; y++) {
				String str=sc.next();
				char[] arr=str.toCharArray();
				for (int x = 0; x < m; x++) {
					map[y][x]=arr[x];
				}
			}//입력의 2차원 배열 입력받기
			
			int min=Integer.MAX_VALUE;//최소값을 찾기 위한 최대값 생성
			
			//W=흰
			//B=파
			//R=빨
			
			for (int b = 1; b <n-1; b++) {
				for (int r = b+1; r < n; r++) {
					int count=0;
					for (int y = 0; y < b; y++) {
						for (int x = 0; x < m; x++) {
							if (map[y][x]!='W') {
								count++;
							}
						}
					}//하얀색 범위에서 하얀색이 아닌 것들을 찾아주는 반복문
					for (int y = b; y < r; y++) {
						for (int x = 0; x < m; x++) {
							if (map[y][x]!='B') {
								count++;
							}
						}
					}//파란색 범위에서 파란색이 아닌 것들을 찾아주는 반복문
					for (int y = r; y < n; y++) {
						for (int x = 0; x < m; x++) {
							if (map[y][x]!='R') {
								count++;
							}
						}
					}
					if (min>count) {
						min=count;
					}
				}
			}//파란색과 빨간색의 범위를 지정해주면 하얀색은 알아서 배정이 되고 흰 1 파1 빨2, 흰1 파2 빨1,...,흰2파1빨1까지
			//모든 경우의 수를 구할 수 있는 완전 탐색 반복문
			System.out.println("#"+Tc+" "+min);
		}//테케 반복
	}
}

느낀점 : 2차 배열로 문자 간격없이 받는 법 정확히 알고, 색을 바꿀 최소값은 각 행의 색이 아닌 것들의 최소값이기 때문에 그거를 빠르게 잡고 선 이차배열로 파란색과 빨간색의 범위를 잡아 하얀색의 범위를 정해 완전탐색을 시켜주면서 그 이차배열 안에 하얀색 범위와 파란색 범위와 빨간색 범위를 하나씩 색이 아닌 것들을 카운트 해줘 그 값이 가장 적은 값을 출력하게 할 수 있음.