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 카카오 인턴십
- 백준
- 프로그래머스
- level 1
- 백트래킹
- 월간 코드 챌린지
- Gold 4
- Level 3
- 스택/큐
- Web
- Level 2
- 시뮬레이션
- SWEA
- BFS
- 그리디
- DP
- 코드리뷰
- 부스트코스
- pass
- c++
- DFS
- 2020 KAKAO BLIND
- Gold 5
- 2019 KAKAO BLIND
- 삼성 SW 역량 테스트
- 구현
- next_permutation
- 코드 리뷰
- Level 4
- 브루트포스
Archives
- Today
- Total
Min:D's Devlog
[SWEA][모의 SW 역량테스트][C++] 4013 특이한 자석 본문
문제
SWAE 모의 SW 역량테스트 - 4013 특이한 자석
문제 풀이
접근 방식
이 문제를 풀기 위해 회전시켜야 할 자석을 찾는 find 함수와 자석을 회전시켜줄 move 함수를 만들어주었다.
find 함수는 다음과 같이 재귀 함수로 구현하였다.
void find(int num, int dir)
{
visit[num] = 1;
nums.push_back(num);
dirs.push_back(dir);
if (num - 1 >= 0 && !visit[num - 1] && magnet[num - 1][2] != magnet[num][6])
find(num - 1, -dir);
if (num + 1 < 4 && !visit[num + 1] && magnet[num][2] != magnet[num + 1][6])
find(num + 1, -dir);
}
한번 방문한 자석에는 다시 방문할 필요가 없기 때문에 visit 벡터에 체크를 해주었고,
방문할 자석의 번호와 방향을 각각 nums, dirs에 넣어주었다.
그 후, 왼쪽과 오른쪽의 자석을 확인하여 돌려야 하는 자석이면 find 함수를 재귀적으로 호출해주었다.
move 함수는 다음과 같이 deque를 사용하여 구현해주었다.
void move()
{
int len = nums.size();
for (int i = 0; i < len; i++)
{
if (dirs[i] == 1)
{
magnet[nums[i]].push_front(magnet[nums[i]][7]);
magnet[nums[i]].pop_back();
}
else
{
magnet[nums[i]].push_back(magnet[nums[i]][0]);
magnet[nums[i]].pop_front();
}
}
}
풀이 코드 - C++
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
vector<deque<int>> magnet;
vector<bool> visit;
vector<int> nums;
vector<int> dirs;
void find(int num, int dir)
{
visit[num] = 1;
nums.push_back(num);
dirs.push_back(dir);
if (num - 1 >= 0 && !visit[num - 1] && magnet[num - 1][2] != magnet[num][6])
find(num - 1, -dir);
if (num + 1 < 4 && !visit[num + 1] && magnet[num][2] != magnet[num + 1][6])
find(num + 1, -dir);
}
void move()
{
int len = nums.size();
for (int i = 0; i < len; i++)
{
if (dirs[i] == 1)
{
magnet[nums[i]].push_front(magnet[nums[i]][7]);
magnet[nums[i]].pop_back();
}
else
{
magnet[nums[i]].push_back(magnet[nums[i]][0]);
magnet[nums[i]].pop_front();
}
}
}
int main(int argc, char **argv)
{
int test_case;
int T, K;
// freopen("input.txt", "r", stdin);
cin >> T;
for (test_case = 1; test_case <= T; ++test_case)
{
// 입력 받기
cin >> K;
magnet.assign(4, deque<int>(8));
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 8; j++)
{
cin >> magnet[i][j];
}
}
// 자석 이동
for (int i = 0; i < K; i++)
{
int num, dir;
cin >> num >> dir;
nums.clear();
dirs.clear();
visit.assign(4, 0);
find(num - 1, dir);
move();
}
// 점수 구하기
int answer = 0;
for (int i = 0; i < 4; i++)
{
if (magnet[i][0])
answer += (int)pow(2, i);
}
cout << "#" << test_case << " " << answer << endl;
}
return 0;
}
실행 결과
'알고리즘 > SWEA' 카테고리의 다른 글
[SWEA][모의 SW 역량테스트][C++] 2115 벌꿀채취 (0) | 2020.07.28 |
---|---|
[SWEA][모의 SW 역량테스트][C++] 1952 수영장 (0) | 2020.07.24 |
[SWEA][모의 SW 역량테스트][C++] 4008 숫자 만들기 (0) | 2020.07.19 |
[SWEA][모의 SW 역량테스트][C++] 4014 활주로 건설 (0) | 2020.07.18 |
[SWEA][모의 SW 역량테스트][C++] 4012 요리사 (0) | 2020.07.09 |
Comments