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 | 31 |
Tags
- 백준
- IBK기업은행 #기업은행 #디지털 #직무 #정리
- 카카오
- 서버개발캠프
- 코테
- 삼성 #코테 #2020상반기 #c++
- 카카오인턴
- 중반부
- BaekJoon
- 소감
- 코딩테스트
- Algorithm
- 유니온파인드
- LIS #Algorithm #요소추적
- c++
- 투포인터
- 알고리즘
- Smilegate
- 스마일게이트
- 1편
- 보석쇼핑
- Union-find
- BFS
- 식단
Archives
- Today
- Total
짱아의 개발 기록장
[Algorithm] 삼성전자 코딩테스트 - 구슬 탈출 2(c++) 본문
반응형
내가 생각한 구현 순서는 다음과 같다.
1) 빨간 공과 파란공을 한 방향으로 빈칸이나 탈출구를 만나면 쭉 밀어준다.
2) 그 후, 상태를 비교해본다.
3) 만약, 파란공이 탈출구로 빠진다면 바로 다른 방향으로 넘어간다.
4) 파란공과 빨간공이 같은 자리에 도착한다면? 빨간공이 움직인 거리와 파란공이 움직인 거리를 비교한 후 더 멀리 움직인 공이 더 안쪽?에 위치한다.
5) 빨간공이 탈출구를 만난다면 game over!
이렇게 순서대로 코드로 잘 구현해낸다면 성공이다^.^
코드 첨부
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
|
// 구슬 탈출2
#include <iostream>
#include <queue>
using namespace std;
int n, m, r_x, r_y, b_x, b_y, out_x, out_y;
string s;
char marble[11][11];
int visited[11][11][11][11]; // 빨간공, 파란공 위치
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int bfs()
{
queue<pair<pair<int, int>, pair<int, int>>> q;
q.push(make_pair(make_pair(r_x, r_y), make_pair(b_x, b_y)));
visited[r_x][r_y][b_x][b_y] = 1;
int num = 0;
while(!q.empty()){
int size = q.size();
for(int i=0; i<size; i++){
int rx = q.front().first.first;
int ry = q.front().first.second;
int bx = q.front().second.first;
int by = q.front().second.second;
q.pop();
visited[rx][ry][bx][by] = 1;
for(int j=0; j<4; j++){
bool red = false; // 탈출구에 왔는지 여부
bool blue = false;
int nrx = rx, nry = ry, nbx = bx, nby = by;
while(marble[nrx+dx[j]][nry+dy[j]]=='.' || marble[nrx+dx[j]][nry+dy[j]]=='O'){
nrx += dx[j];
nry += dy[j];
if(marble[nrx][nry]=='O'){
red = true;
}
}
while(marble[nbx+dx[j]][nby+dy[j]]=='.' || marble[nbx+dx[j]][nby+dy[j]]=='O'){
nbx += dx[j];
nby += dy[j];
if(marble[nbx][nby]=='O'){
blue = true;
}
}
if(blue==true){ // 파랑이 빠지면 노노
continue;
}
if(red==true){ // 빨강만 빠지면 굿
return num+1;
}
if(nrx==nbx && nry==nby){ // 파랑 빨강 자리가 똑같다면
if(abs(rx-nrx)+abs(ry-nry) > abs(bx-nbx)+abs(by-nby)){ // 빨강 이동거리가 더 크면, 더 이전 자리
nrx -= dx[j];
nry -= dy[j];
}else{
nbx -= dx[j];
nby -= dy[j];
}
}
if(!visited[nrx][nry][nbx][nby]){
visited[nrx][nry][nbx][nby] = 1;
q.push(make_pair(make_pair(nrx, nry), make_pair(nbx, nby)));
}
}
}
num++;
if(num==10){
break;
}
}
return -1;
}
int main()
{
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>s;
for(int j=0; j<s.size(); j++){
marble[i][j] = s[j];
if(s[j]=='R'){
marble[i][j] = '.';
r_x = i;
r_y = j;
}else if(s[j]=='B'){
marble[i][j] = '.';
b_x = i;
b_y = j;
}else if(s[j]=='O'){
out_x = i;
out_y = j;
}
}
}
cout<<bfs()<<"\n";
return 0;
}
|
cs |
문제 첨부
github 첨부
github.com/jungahshin/algorithm/blob/master/c:c%2B%2B/13460_review_3.cpp
반응형
'Algorithm > 삼성 sw 역량테스트 기출' 카테고리의 다른 글
[Algorithm] 삼성전자 코딩테스트 - 연산자 끼워넣기(c++) (0) | 2020.09.23 |
---|---|
[Algorithm] 삼성전자 코딩테스트 - 로봇 청소기(c++) (0) | 2020.09.23 |
[Algorithm] 2020 상반기 삼성전자 코딩테스트 오전 - 모노미노도미노(c++) (0) | 2020.09.17 |
[Algorithm] 2018 하반기 삼성전자 코딩테스트 - 나무재테크(c++) (0) | 2020.09.17 |
[Algorithm] 2020 상반기 삼성전자 코딩테스트 오전 - 청소년 상어(c++) (0) | 2020.07.29 |
Comments