1 λΆ„ μ†Œμš”

πŸ“ [SW_2117] ν™ˆ λ°©λ²” μ‹œμŠ€ν…œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class Solution {
	static int N, M;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();

		int tc = Integer.parseInt(br.readLine());

		for (int TC = 1; TC <= tc; TC++) {
			sb.append("#").append(TC).append(" ");

			st = new StringTokenizer(br.readLine(), " ");

			// map의 크기
			N = Integer.parseInt(st.nextToken());

			// μ§‘μ˜ μ§€λΆˆλΉ„μš©
			M = Integer.parseInt(st.nextToken());

			ArrayList<Integer> HX = new ArrayList<>();
			ArrayList<Integer> HY = new ArrayList<>();

			// 집 μž…λ ₯
			for (int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				for (int j = 0; j < N; j++) {
					int temp = Integer.parseInt(st.nextToken());
					// 집인 경우 μ’Œν‘œ μ €μž₯
					if (temp == 1) {
						HX.add(i);
						HY.add(j);
					}
				}
			}

			// mapμ•ˆμ— μžˆλŠ” 집 개수
			int H = HX.size();
			// μ΅œλŒ€ μ§‘μˆ˜
			int max = 0;
			// μ€„μ—¬κ°€λ©΄μ„œ κ΅¬ν•˜κΈ°
			for (int k = (int) Math.sqrt(N * N) + 1; k > 0; k--) {
				int cost = k*k + (k-1)*(k-1);
				for(int X=0; X<N; X++) {
					for(int Y=0; Y<N; Y++) {
						// ν¬ν•¨λ˜λŠ” μ§‘μˆ˜
						int cnt = 0;
						// κ±°λ¦¬μ•ˆμ— μ†ν•˜λ©΄ 집 개수 ++
						for(int i=0; i<H; i++) {
							if(Math.abs(HX.get(i)-X) + Math.abs(HY.get(i) - Y)<k) {
								cnt++;
							}
						}
						// 쑰건 μΆ©μ‘± ν•œλ‹€λ©΄ μ΅œλŒ€μ§‘ 개수 κ°±μ‹ 
						if(cnt*M >= cost) {
							max = Math.max(max, cnt);
						}
					}
				}
			}
			sb.append(max).append("\n");
		}
		System.out.println(sb);
	}
}

πŸ€” λ‚˜μ˜ 생각


문제 ν’€κΈ°μ „ κ³„νšμ„ μ„Έμ›Œλ³΄μ•˜λ‹€.. μ’€ 정리가 μ•ˆλ˜μ–΄μžˆμ§€λ§Œ μ‚΄μ•„μžˆλŠ” ν•„κΈ°λ₯Ό κΈ°λ‘ν•˜κΈ° μœ„ν•΄ λ”°λ‘œ μ •λ¦¬λŠ” ν•˜μ§€ μ•Šμ•˜λ‹€..
문제λ₯Ό λ‹€ ν’€κ³  보면 κ³„νšμ„Έμš΄ 것이 κ·Έλ ‡κ²Œ 틀리진 μ•Šμ•˜λŠ” 것 κ°™λ‹€.
근데 μ•„μ‰¬μš΄κ²Œ 처음 κ³„νšμ΄ 완탐을 ν•˜λ©΄μ„œ kλ₯Ό 잘 μ°ΎλŠ” 것인데.. 자꾸 49μ—μ„œ fail이 λ– μ„œ κ²°κ΅­μ—” μ‹€νŒ¨ν–ˆλ‹€..
이둠적인 ꡬ쑰적인 방법은 μ•„λ¬΄λž˜λ„ λ§žλŠ” 것 같은데 μ–΄λ””μ„œ 잘λͺ»λœ 것 κ°™λ‹€.. λ­”κ°€ kλ₯Ό νƒμƒ‰ν•˜λŠ”λ° λ„ˆλ¬΄ λ§Žμ€ μ‹œκ°„μ„ μ†Œμš”ν•˜λŠ” 것이 문제인 것 κ°™λ‹€..
κ·Έλž˜μ„œ λ‹€λ₯Έ μ‚¬λžŒλ“€μ˜ 풀이λ₯Ό 보닀가 거리둜 κ΅¬ν•˜λŠ” 것을 보고 머리λ₯Ό ν•œλŒ€ λ§žμ€ λ“― ν–ˆλ‹€..
μ™„νƒν•˜λŠ” 것은 κ°™μ§€λ§Œ ꡳ이 λ‹€ λŒλ©΄μ„œ 확인할 ν•„μš”μ—†μ΄ 거리λ₯Ό κ΅¬ν•΄μ„œ 거리가 k보닀 μž‘μœΌλ©΄ μ§‘μ˜ 개수λ₯Ό κ΅¬ν•΄μ£ΌλŠ” 것이닀.
μ½”λ“œλ„ 훨씬 κ°„λž΅ν•˜κ³  가독성도 μ’‹μ•˜λ‹€.
μ™œ 거리λ₯Ό μƒκ°ν•˜μ§€ λͺ»ν–ˆμ„κΉŒ..γ…  이 문제λ₯Ό 톡해 λ‹€μŒμ— λ‹€λ₯Έ 문제λ₯Ό λ§Œλ‚œλ‹€λ©΄ 거리 생각을 μΆ©λΆ„νžˆ ν•  수 μžˆμ„ 것 κ°™λ‹€ !