Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 코드리뷰
- Level 2
- BFS
- 부스트코스
- 백트래킹
- 브루트포스
- c++
- 월간 코드 챌린지
- 2019 KAKAO BLIND
- 백준
- Gold 5
- Web
- pass
- Gold 4
- Level 4
- 스택/큐
- 그리디
- DFS
- level 1
- 구현
- SWEA
- 삼성 SW 역량 테스트
- 2020 KAKAO BLIND
- 시뮬레이션
- next_permutation
- Level 3
- 코드 리뷰
- 2020 카카오 인턴십
- 프로그래머스
- DP
Archives
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 2117 홈 방범 서비스 본문
문제
SWEA 모의 SW 역량테스트 - 2117 홈 방범 서비스
문제 풀이
접근 방식
손해를 보지 않으면서 가장 많은 집을 포함하는 방범 서비스 영역에 포함된 집의 개수를 구하는 문제이다.
이를 구하기 위해 5중 for문을 돌며 최댓값을 구해주었다.
첫 번째 for문은 서비스 영역의 크기(k)를 나타낸다.
서비스 영역이 도시를 다 덮을 수 있을 만큼의 크기까지 확인해봐야 하기 때문에,
K = 1에서 K = N + 1의 크기까지 탐색해주었다. (풀이 코드에서 k = K - 1, 즉 k = 0에서 k = N까지 탐색)
두 번째와 세 번째 for문은 서비스 영역의 가운데 지점(i, j)을 의미한다.
네 번째와 다섯 번째 for문은 서비스 영역(a, b)을 의미한다.
아래와 같이 코드를 짜면 문제에서 주어진 모양의 영역을 탐색할 수 있다.
서비스 영역을 탐색하며 그 영역에 포함된 집의 개수를 구하였고,
이 값을 활용하여 손해를 보지 않는지 확인 후, 최댓값을 갱신해주었다.
for (a = i - k; a <= i + k; a++) {
for (b = j - c ; b <= j + c; b++) {
if (a < 0 || a >= N || b < 0 || b >= N) continue;
if (map[a][b]) count++;
}
if (a < i) c++;
else c--;
}
if (count * M - cost >= 0 && MAX < count) MAX = count;
풀이 코드 - C++
#include <iostream>
#include <cstring>
using namespace std;
int main(int argc, char** argv) {
int test_case, i, j, k, a, b, c, cost, count, MAX;
int T, N, M;
bool map[20][20];
cin >> T;
for (test_case = 1; test_case <= T; ++test_case) {
// 입력 받기
cin >> N >> M;
memset(map, 0, sizeof(map));
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
cin >> map[i][j];
}
}
// 최대 개수 구하기
MAX = 0;
for (k = 0; k <= N; k++) {
cost = k * k + (k + 1) * (k + 1); // 운영 비용
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
// 서비스 영역
c = 0;
count = 0;
for (a = i - k; a <= i + k; a++) {
for (b = j - c ; b <= j + c; b++) {
if (a < 0 || a >= N || b < 0 || b >= N) continue;
if (map[a][b]) count++;
}
if (a < i) c++;
else c--;
}
if (count * M - cost >= 0 && MAX < count) MAX = count;
}
}
}
cout << "#" << test_case << " " << MAX << '\n';
}
return 0;
}
실행 결과
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA][모의 SW 역량테스트][C++] 5658 보물상자 비밀번호 (0) | 2020.08.08 |
---|---|
[SWEA][모의 SW 역량테스트][C++] 5644 무선 충전 (0) | 2020.08.07 |
[SWEA][모의 SW 역량테스트][C++] 1949 등산로 조성 (0) | 2020.08.05 |
[SWEA][모의 SW 역량테스트][C++] 2383 점심 식사시간 (0) | 2020.07.31 |
[SWEA][모의 SW 역량테스트][C++] 2382 미생물 격리 (0) | 2020.07.30 |
Comments