카테고리 없음

2117. [모의 SW 역량테스트] 홈 방범 서비스

배발자 2022. 10. 12.
반응형

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Solution {

	static int testCase; 
	static int N; 
	static int [][] map; 
	static int M; 
	static int result; 
	public static void main(String[] args) throws IOException {
	
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 
		StringTokenizer st = null; 
		StringBuilder sb = new StringBuilder(); 
		
		testCase = Integer.parseInt(br.readLine()); 
			
		for(int t = 1; t<=testCase; t++) {
			
			result = 0; // 집의 개수를 담을거야 ㅎㅎ
			st = new StringTokenizer(br.readLine()); 
			N = Integer.parseInt(st.nextToken()); //지도 크기야 이건!
			M = Integer.parseInt(st.nextToken()); //집이 지불하는 비용이야~
			
			map = new int [N][N]; //맵을 먼저 만들어야지!
			
			for(int i=0; i<N; i++) {
				st = new StringTokenizer(br.readLine()); 
				for(int j=0; j<N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken()); //입력해 
				}
			}
			
			
			for(int i=0; i<N; i++) {
				for(int j=0; j<N; j++) {
					// 자! 지금부터 맵의 원소 하나하나씩 살펴볼거야~
					// 얘네가 해밀턴의 시작점인거지 			
					
					int k = 1; 
					// 자 일단 운영 영역은 1부터 시작이라는 것을 알고 있지 ㅎㅎ
					
					int [][] temp = new int[N][N]; 
					// 여기는 어떤값을 넣을거냐면 해밀턴이 적용된 면적이 갱신될거야 
					
					int cnt = 0; 
				
					while(true) {
						//일단 계속 돌려버려!!!!
						
						int x = k-1; 
						// 현재 지점으로부터 왼쪽과 오른쪽의 길이 범위야 
						int y = k-1; 
						// 현재 지점으로부터 위쪽과 아래쪽의 길이 범위야 
						boolean flag = false; 
						//더이상 갱신할 곳이 없으면 이 플래그는 갱신되지 않아ㅎㅎ 
						
						
						for(int yy = i-y; yy<=i+y; yy++) {
							//쇼숑쇼숑 돌리는 중! 이건 뭐냐면 해밀턴 범위에 해당하는 애들인거야 
							for(int xx = j - x; xx <= j+x; xx++) {
								// 돌려 돌려 
								// 이것도 해밀턴 범위에 해당하는 애들이겠쥐? 
								
								if(yy<0||yy>=N||xx<0||xx>=N)continue; 
								// 맵 초과했어 그러면 무시해버려 크하하 
								
								if(Math.abs(yy-i)+Math.abs(xx-j)<k) {
									// 지금 해밀턴 범위인 애들이네??? 
									
									if(temp[yy][xx]==1)continue; 
									//만약 이미 갱신되어 있네? 무시해 
									//마름모 모양으로 퍼지기 때문에 이전에 거쳤던 애들은 이미 세팅 되어있어 
									
									if(temp[yy][xx]==0) {
										
										flag = true; 
										// 이때 갱신했다고 true로 설정
										temp[yy][xx]=1; 
										// 마름모 모양으로 퍼져야겟지?
										if(map[yy][xx]==1) {
											cnt++; 
											//만약 퍼진 곳이 집이라면 집의 개수 갱신
											//
										}
									}
								}								
								
							}
						}			
						if(flag == false) break; // 갱신된 곳이 없어 그러면 멈춰라 크하하. 현 지점 반복문 끝났어 
						int price = k*k+(k-1)*(k-1); // 비용 공식 적용해서 넣어 
						if(price <= cnt*M) {// 이익이 될 때에만 최대 집의 개수 체크하는거자나 바보야 
							if(result<cnt)result = cnt; // 갱신해줘 
						}
						k++; 					
						// 해밀턴 거리 늘려줘 
					}
				}
			}
			sb.append("#").append(t).append(" ").append(result).append("\n");
		}
		System.out.println(sb.toString());
	}
}
 

SW Expert Academy

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

swexpertacademy.com

 

반응형

댓글