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
- 2020 카카오 인턴십
- DP
- 백트래킹
- 구현
- 백준
- 프로그래머스
- 부스트코스
- BFS
- Level 4
- 시뮬레이션
- Gold 4
- level 1
- SWEA
- 삼성 SW 역량 테스트
- 월간 코드 챌린지
- Web
- Level 2
- DFS
- pass
- Level 3
- 2020 KAKAO BLIND
- c++
- 그리디
- 2019 KAKAO BLIND
- 스택/큐
- 코드리뷰
- next_permutation
- 브루트포스
- 코드 리뷰
- Gold 5
Archives
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 2105 디저트 카페 본문
문제
SWEA 모의 SW 역량테스트 - 2105 디저트 카페
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
문제 풀이
접근 방식
대각선 방향으로 움직이며 사각형을 그리며 출발한 카페로 돌아오는 루트에서
디저트가 겹치지 않는 경로 중 가장 긴 경로를 찾는 문제이다.
어느 방향으로 움직이던 사각형을 그리기만 하면 되기 때문에 시계 방향으로 탐색을 진행하였다.
그리고 가장 윗 모서리에서부터 시작하여 사각형을 그리도록 구현할 것이기 때문에
사각형을 그릴 수 있는 시작 위치는 양 옆이 한 칸 이상 존재하고 아래로 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 |