Problem Solving/SWEA
SWEA 2117번: [모의 SW 역량테스트] 홈 방범 서비스
이진2
2020. 5. 25. 01:20
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5V61LqAf8DFAWu
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
꽤나 쉬운 문제
이제 삼성 코테가 2주도 안 남은 상황이당
마지막으로 봤던 역량테스트가 꽤나 어려운 난이도였기 때문에 문제풀이 연습에 좀 더 신경을 쓰게된당
(로봇이 작물 심고 열리고 수확하고 이런 문제였는데 내 주변에서 풀었던 사람이 나밖에 없었음)
서비스 영역의 크기가 K와 같을때 방범 서비스의 영역이다
영역의 크기는 2K^2 - 2K + 1과 같다
한 집 당 M의 방범 비용을 지불 가능할 때, 손해를 보지 않으면서 가장 많은 집을 케어할 수 있는 경우를 찾는 문제
보이겠지만, 수도코드가 굉장히 짧다
k의 범위는 최대 수금(?) 가능한 비용보다 운영 비용이 커질 때 종료한다
for문 내에서 거리가 K이하인 집들을 count해서 최대값을 계속 갱신해주면 끝
#include <cstdio>
#include <math.h>
int tc, n, m, map[21][21];
int cost(int k) { return 2 * k * k - 2 * k + 1; }
bool safe(int x, int y) { return x >= 0 && x < n && y >= 0 && y < n; }
int main() {
scanf("%d", &tc);
for (int T = 1; T <= tc; T++) {
int ans = 1, h = 0, k = 2;
scanf("%d%d", &n, &m);
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
scanf("%d", &map[i][j]);
if (map[i][j])h++;
}
while (h * m >= cost(k)) {
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
int sum = 0;
for (int a = i - k; a <= i + k; a++)
for (int b = j - k; b <= j + k; b++) {
if (!safe(b, a))continue;
if (abs(a - i) + abs(b - j) < k
&& map[a][b])
sum++;
}
if (sum * m >= cost(k)
&& sum > ans)
ans = sum;
}
k++;
}
printf("#%d %d\n", T, ans);
}
return 0;
}
answer의 최소값은 1이라는걸 체크 안 해줘서 첫트에는 틀렸다 ㅠ
테스트 케이스는 항상 경계값 체크해주는거 잊지 말기 😉