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
- Web
- 백트래킹
- Gold 4
- 2019 KAKAO BLIND
- 프로그래머스
- 구현
- 브루트포스
- pass
- level 1
- Level 4
- 코드리뷰
- DFS
- DP
- 부스트코스
- c++
- 월간 코드 챌린지
- Level 2
- Level 3
- next_permutation
- BFS
- Gold 5
- 스택/큐
- 2020 카카오 인턴십
- 시뮬레이션
- 2020 KAKAO BLIND
- 그리디
- SWEA
- 삼성 SW 역량 테스트
- 코드 리뷰
- 백준
Archives
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 2105 디저트 카페 본문
문제
SWEA 모의 SW 역량테스트 - 2105 디저트 카페
문제 풀이
접근 방식
대각선 방향으로 움직이며 사각형을 그리며 출발한 카페로 돌아오는 루트에서
디저트가 겹치지 않는 경로 중 가장 긴 경로를 찾는 문제이다.
어느 방향으로 움직이던 사각형을 그리기만 하면 되기 때문에 시계 방향으로 탐색을 진행하였다.
그리고 가장 윗 모서리에서부터 시작하여 사각형을 그리도록 구현할 것이기 때문에
사각형을 그릴 수 있는 시작 위치는 양 옆이 한 칸 이상 존재하고 아래로 2칸 이상이 존재해야 한다.
이를 고려하여 시작 위치를 한정하였고, 시작 위치에서 DFS 방식으로 탐색하여 가장 긴 루트를 찾아주었다.
DFS 함수는 위치(x, y)와 이동 방향(d)을 매개변수로 갖는 함수로 구현하였다.
우선, 다음 칸으로 이동할 수 있는지를 먼저 체크해주었다.
(map의 내부인 경우, 같은 디저트가 없는 경우에만 이동할 수 있음)
그 후, 같은 방향으로 계속 갈 경우와 다음 방향(시계 방향)으로 가는 경우로 나눠서 재귀적으로 수행해주었다.
이때, 가장 마지막 방향인 경우에는 다음 방향이 없기 때문에 같은 방향으로만 갈 수 있도록 구현해주었다.
(방향 순서 :↘(0) - ↙(1) - ↖(2) - ↗(3))
풀이 코드 - C++
#include <iostream>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
int N, MAX, startX, startY;
int map[20][20];
int dir[4][2] = { {1,1},{1,-1},{-1,-1},{-1,1} };
vector<int> temp;
void DFS(int x, int y, int d) {
int nx = x + dir[d][0];
int ny = y + dir[d][1];
if (d == 3 && nx == startX && ny == startY) {
int len = temp.size();
if (MAX < len) MAX = len;
return;
}
if (nx < 0 || ny < 0 || nx >= N || ny >= N) return;
if (find(temp.begin(), temp.end(), map[nx][ny]) != temp.end()) return;
temp.push_back(map[nx][ny]);
if (d == 3) {
DFS(nx, ny, d);
}
else {
DFS(nx, ny, d);
DFS(nx, ny, d + 1);
}
temp.pop_back();
return;
}
int main(int argc, char** argv)
{
int test_case;
int T;
cin >> T;
for (test_case = 1; test_case <= T; ++test_case) {
cin >> N;
memset(map, 0, sizeof(map));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cin >> map[i][j];
}
}
MAX = -1;
for (int i = 0; i < N - 2; i++) {
for (int j = 1; j < N - 1; j++) {
temp.clear();
temp.push_back(map[i][j]);
startX = i, startY = j;
DFS(i, j, 0);
}
}
cout << "#" << test_case << " " << MAX << endl;
}
return 0;
}
실행 결과
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA][모의 SW 역량테스트][C++] 5653 줄기세포배양 (0) | 2020.08.24 |
---|---|
[SWEA][모의 SW 역량테스트][C++] 5656 벽돌 깨기 (0) | 2020.08.23 |
[SWEA][모의 SW 역량테스트][C++] 5650 핀볼 게임 (0) | 2020.08.13 |
[SWEA][모의 SW 역량테스트][C++] 2112 보호 필름 (0) | 2020.08.12 |
[SWEA][모의 SW 역량테스트][C++] 5658 보물상자 비밀번호 (0) | 2020.08.08 |
Comments