swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V61LqAf8DFAWu
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.
라고 쓰여 있으므로 문제는 첨부하지 안흔다...
[ 풀이 코드 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class 홈방범서비스 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
for(int tc = 1; tc<=T; tc++) {
StringTokenizer st= new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken()); // 하나의 집이 지불할 수 있는 비용
//int [][] arr =new int[N][N];
ArrayList<Integer> HX = new ArrayList<Integer>();
ArrayList<Integer> HY = new ArrayList<Integer>();
for(int i =0; i<N; i++) {
st = new StringTokenizer(br.readLine());
for( int j =0; j< N ;j++) {
if(st.nextElement().equals("1")){
HX.add(i);
HY.add(j);
}
}
}// 입력 완료
int H = HX.size();
int ans=0 ; // 최대 집수
for(int K = (int)Math.sqrt(N*N)+1; K>0; K--){// K점점 줄여가면서 구하자..
int cost = K*K +(K-1)*(K-1);
for(int X =0; X<N; X++) {
for(int Y =0; Y<N ; Y++) {// X,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) {
ans = cnt>ans?cnt:ans;
}
}
}
}
sb.append('#').append(tc).append(' ').append(ans).append('\n');
}
System.out.println(sb);
}
}
이것도 간단하게 시뮬레이션으로 풀 수 있는 문제이다. 삼성 역테는 이런 식인가..
[ 코드 설명 ]
먼저 입력부를 설명한다. BufferedReader로 줄마다 읽어오면서
T에 TestCase의 개수를 저장하고 반복문을 돌린다.
StringBuilder를 선언해서 한번에 출력할 수 있도록 담아준다.
그리고 이후 주어진 집 배열을 입력받는다. 처음에는 arr로 받을까 하다가 HX, HY로 집이 있는 곳의 위치를 저장해 두는 것이 더 나을 거라고 생각했다.
그리고 입력이 완료 되었으면 총 집들이 몇 개 있는지 미리 저장해 둔다.
이후 ans로 최대 집의 수를 저장해 두고,
K로 영역의 크기를 정해두고, 손해를 보지 않으면서 가장 많은 집을 보호 할 수 있는 ans를 구하는 것이므로 ,
cost도 미리 정해 둔다.
그리고 방범 사무소가 설립될 위치를 반복문을 통해 돌면서 포함되는 집의 개수를 세자.
집이 방범 구역에 포함되는지 확인 하는 방법은 현재 방범 사무소와 얼마나 떨어져 있는지 구하면 된다.
Math.abs로 집의 위치와 현재 방범사무소까지의 거리가 K보다 작으면 포함된 집이다.
따라서 포함되면 cnt를 늘려준다.
그리고 마지막으로 cost보다 M*cnt의 값이 크거나 같으면 손해를 보지 않는다는 의미이므로
cnt의 값이 ans보다 크면 ans를 바꿔주게 된다.
결국 가장 집이 많은 수가 ans에 저장되고, 이 값을 sb에 담아서 출력해 주면 된다.