Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 레벨3
- BFS
- 삼성SW테스트
- 완전탐색
- dfs
- dp
- Set
- 문자열
- 백트래킹
- swea
- find
- Map
- substr
- priority_queue
- 프로그래머스
- 2018
- 코딩스킬
- 이런게4문제
- 삼성SW역량테스트
- C++
- 삼성
- 브루트포스
- 레벨2
- 코딩테스트
- 모의SW역량테스트
- STL
- 시뮬레이션
- Sort
- 백준
- KAKAO
Archives
- Today
- Total
-
[SWEA_모의SW역량테스트] 5644번 - 무선충전 본문
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRDL1aeugDFAUo
SWEA 시뮬레이션 문제다.
두 유저가 돌아다니는 경로가 주어졌을 때 시뮬레이션 결과 얻을 수 있는 최대 충전량을 구하는 문제다.
단순 시뮬레이션으로 브루트포스로 구현해도 Pass가 된다.
아래는 C언어 기반 정답코드.
다음주 목요일 (2020.1.30) 현대모비스 SW테스트에서 3문제중 1문제는 꼭 C로 풀어야한다고 해서 C 연습할겸 C로 짜봤다. 확실히 C++ STL이 편한걸 느꼈다.
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
#include <stdio.h>
//#pragma warning(disable:4996)
#define _CRT_SECURE_NO_WARNINGS
typedef struct BC{
int origin_r, origin_c, P;
}BC;
typedef struct dir{
int dr, dc;
}dir;
dir direction[5] = { { 0, 0 }, { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } };
BC p_map[10][10][8];
int cnt[10][10]; // 루프돌때 0부터 이 값 미만의 개수확인.
int A_r, A_c, B_r, B_c;
int A_mov[100];
int B_mov[100];
// 정지, 북,동,남,서
// 입력받을 때
int abs_diff(int a, int b){
int c = a - b;
if (c > 0) return a - b;
else return b - a;
}
int max(int a, int b){
if (a > b)
return a;
else
return b;
}
void reset_p(){
for (int i = 0; i < 10; i++){
for (int j = 0; j < 10; j++){
cnt[i][j] = 0;
for (int k = 0; k < 8; k++){
p_map[i][j][k].origin_r = -1;
p_map[i][j][k].origin_c = -1;
p_map[i][j][k].P = -1;
}
}
}
for (int i = 0; i < 100; i++){
A_mov[i] = -1;
B_mov[i] = -1;
}
A_r = 0, A_c = 0, B_r = 9, B_c = 9;
}
int main(){
int T;
scanf("%d", &T);
for (int tc = 1; tc <= T; tc++){
reset_p();
int M, A;
scanf("%d %d", &M, &A);
// 행적 입력
for (int m = 0; m < M; m++){
scanf("%d", &A_mov[m]);
}
for (int m = 0; m < M; m++){
scanf("%d", &B_mov[m]);
}
// BC 정보 입력.
for (int a = 0; a < A; a++){
int row, col, C, P;
scanf("%d %d %d %d", &col, &row, &C, &P);
int idx = cnt[row - 1][col - 1];
p_map[row - 1][col - 1][idx].P = P;
p_map[row - 1][col - 1][idx].origin_r = row - 1;
p_map[row - 1][col - 1][idx].origin_c = col - 1;
cnt[row - 1][col - 1]++;
int base_r = row - 1, base_c = col - 1;
for (int new_r = base_r - C; new_r <= base_r + C; new_r++){
for (int new_c = base_c - C; new_c <= base_c + C; new_c++){
if (new_r == base_r && new_c == base_c) continue;
if (new_r >= 0 && new_r < 10 && new_c >= 0 && new_c < 10){ // 범위 내에 있고,
if (abs_diff(new_r, base_r) + abs_diff(new_c, base_c) <= C){ // 조건 만족하는 범위내라면 추가.
int idx2 = cnt[new_r][new_c];
p_map[new_r][new_c][idx2].P = P;
p_map[new_r][new_c][idx2].origin_r = base_r;
p_map[new_r][new_c][idx2].origin_c = base_c;
cnt[new_r][new_c]++;
}
}
}
}
}
// 모든 BC정보 입력 완료.
int sum_A = 0, sum_B = 0;
for (int m = 0; m < M; m++){
if (m == 0){
// 처음이라면 첫 위치 검사.
if (cnt[A_r][A_c] > 0){
int max_val = p_map[A_r][A_c][0].P;
for (int j = 0; j < cnt[A_r][A_c]; j++){
if (max_val < p_map[A_r][A_c][j].P){
max_val = p_map[A_r][A_c][j].P;
}
}
sum_A += max_val;
}
if (cnt[B_r][B_c] > 0){
int max_val = p_map[B_r][B_c][0].P;
for (int j = 0; j < cnt[B_r][B_c]; j++){
if (max_val < p_map[B_r][B_c][j].P){
max_val = p_map[B_r][B_c][j].P;
}
}
sum_B += max_val;
}
}
// 이동
A_r += direction[A_mov[m]].dr;
A_c += direction[A_mov[m]].dc;
B_r += direction[B_mov[m]].dr;
B_c += direction[B_mov[m]].dc;
int maxsum = -1;
int add2A = 0, add2B = 0;
if (cnt[A_r][A_c] > 0 && cnt[B_r][B_c] == 0){
// A만 충전
int max_ele = -1;
for (int i = 0; i < cnt[A_r][A_c]; i++){
if (max_ele < p_map[A_r][A_c][i].P){
max_ele = p_map[A_r][A_c][i].P;
}
}
add2A = max_ele;
sum_A += add2A;
}
else if (cnt[A_r][A_c] == 0 && cnt[B_r][B_c] > 0){
// B만 충전
int max_ele = -1;
for (int i = 0; i < cnt[B_r][B_c]; i++){
if (max_ele < p_map[B_r][B_c][i].P){
max_ele = p_map[B_r][B_c][i].P;
}
}
add2B = max_ele;
sum_B += add2B;
}
else if (cnt[A_r][A_c] > 0 && cnt[B_r][B_c] > 0){
for (int i = 0; i < cnt[A_r][A_c]; i++){
for (int j = 0; j < cnt[B_r][B_c]; j++){
BC A_side = p_map[A_r][A_c][i];
BC B_side = p_map[B_r][B_c][j];
if (A_side.origin_r == B_side.origin_r && A_side.origin_c == B_side.origin_c){
// 동일한 BC 골랐다면
if (maxsum < A_side.P){
maxsum = A_side.P;
add2A = A_side.P / 2;
add2B = A_side.P / 2;
}
}
else{
// 다른 BC 골랐다면
if (maxsum < A_side.P + B_side.P){
maxsum = A_side.P + B_side.P;
add2A = A_side.P;
add2B = B_side.P;
}
}
}
}
sum_A += add2A;
sum_B += add2B;
}
}
printf("#%d %d\n", tc, sum_A+sum_B);
}
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-2. SWEA' 카테고리의 다른 글
[SWEA_모의SW역량테스트] 4013번 - 특이한 자석 (0) | 2020.01.28 |
---|---|
[SWEA_모의SW역량테스트] 4014번 - 활주로 건설 (0) | 2020.01.27 |
[SWEA_모의SW역량테스트] 5648번 - 원자 소멸 시뮬레이션 (0) | 2020.01.25 |
[SWEA_모의SW테스트] 5650번 - 핀볼 게임 (0) | 2020.01.23 |
[SWEA_모의SW역량테스트] 5653번 - 줄기세포 배양 (0) | 2020.01.22 |
Comments