일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
31 |
- STL
- 레벨3
- 삼성SW테스트
- Sort
- BFS
- 모의SW역량테스트
- find
- Set
- 코딩스킬
- 백준
- dp
- priority_queue
- 문자열
- substr
- 백트래킹
- 완전탐색
- 삼성SW역량테스트
- C++
- 2018
- 삼성
- dfs
- 시뮬레이션
- KAKAO
- 프로그래머스
- 레벨2
- swea
- 이런게4문제
- 브루트포스
- Map
- 코딩테스트
- Today
- Total
-
[삼성SW테스트] 백준 15686번 - 치킨 배달 본문
https://www.acmicpc.net/problem/15686
15686번: 치킨 배달
크기가 N×N인 도시가 있다. 도시는 1×1크기의 칸으로 나누어져 있다. 도시의 각 칸은 빈 칸, 치킨집, 집 중 하나이다. 도시의 칸은 (r, c)와 같은 형태로 나타내고, r행 c열 또는 위에서부터 r번째 칸, 왼쪽에서부터 c번째 칸을 의미한다. r과 c는 1부터 시작한다. 이 도시에 사는 사람들은 치킨을 매우 좋아한다. 따라서, 사람들은 "치킨 거리"라는 말을 주로 사용한다. 치킨 거리는 집과 가장 가까운 치킨집 사이의 거리이다. 즉, 치킨 거리는
www.acmicpc.net
삼성 SW 역량테스트 기출 문제 '치킨 배달' 문제다.
단순 브루트포스 시뮬레이션으로 풀 수 있었던 문제다.
유의해야했던 점은 '최대 M개' 치킨집을 남기고 나머지는 폐점하는 것이어서 1개부터 M개까지 치킨집을 골라야 했다는 것이었다. 즉, 1개만 남겼을 때부터 해서 M개 모두 남기는 것 각각 next_permutation으로 풀어줘야 했다. 이를 위해 flag 벡터를 사용했는데, 다음 케이스(몇 개 남기는가에 대한)로 넘어갈 때 벡터를 다시 0으로 초기화 하고 해당 케이스의 치킨 집 개수만큼 다시 1을 넣어준뒤 소팅해서 next_permutation으로 해당 케이스의 최소 '도시의 치킨 거리'를 구하고, 이를 다시 global 최소 '도시의 치킨 거리'와 비교해 답을 갱신해주는 것이 필요했다.
아래는 내가 푼 c++ 소스코드이다. 실행시간은 16ms (제한시간 1s).
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
#include <iostream>
#include <vector>
#include <algorithm>
#define INF 987654321
#define maxlen 51
using namespace std;
int N, M;
int Map[maxlen][maxlen];
vector<pair<int, int> > house, chicken_house;
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int answer = INF;
cin >> N >> M;
for (int i = 1; i <= N; i++){
for (int j = 1; j <= N; j++){
cin >> Map[i][j];
if (Map[i][j] == 1)
house.push_back(make_pair(i, j));
else if (Map[i][j] == 2)
chicken_house.push_back(make_pair(i, j));
}
}
vector<int> flag(chicken_house.size(), 0);
for (int i = 1; i <= M; i++){
for (int k = 0; k < i; k++)
flag[k] = 1;
// M개 만큼 1로 표시.
sort(flag.begin(), flag.end());
do{
int Sum = 0;
for (int z = 0; z < house.size(); z++){
int cur_house_row = house[z].first;
int cur_house_col = house[z].second;
int cur_house_dist = INF;
for (int j = 0; j < chicken_house.size(); j++){
if (flag[j]){
int chick_row = chicken_house[j].first, chick_col = chicken_house[j].second;
int cur_house_cur_chicken_dist = abs(cur_house_row - chick_row) + abs(cur_house_col - chick_col);
cur_house_dist = min(cur_house_dist, cur_house_cur_chicken_dist);
}
}
Sum += cur_house_dist;
}
// 도시의 치킨 거리 sum 구함.
answer = min(answer, Sum);
} while (next_permutation(flag.begin(), flag.end()));
for (int s = 0; s < chicken_house.size(); s++)
flag[s] = 0;
}
cout << answer << '\n';
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs |
'1-1. 삼성 SW 테스트' 카테고리의 다른 글
[삼성SW테스트] 백준 15684번 - 사다리 조작 (0) | 2020.01.06 |
---|---|
[삼성SW테스트] 백준 15685번 - 드래곤 커브 (0) | 2020.01.06 |
[삼성SW테스트] 백준 5373번 - 큐빙 (0) | 2020.01.03 |
[삼성SW테스트] 백준 16234번 - 인구 이동 (0) | 2020.01.02 |
[삼성SW테스트] 백준 16235번 - 나무 재테크 (시뮬레이션) (0) | 2020.01.02 |