SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
<풀이>
1. 자석 상태와 회전 정보를 입력받고, 시뮬레이션을 진행한다.
2. 이 후, 자석 점수를 계산하여 출력한다.
<해법>
1. 시뮬레이션 문제
=> 시뮬레이션 문제는 조건에 맞는 정확한 구현이 가장 중요합니다. 저는 코드를 짜기 전에 사용될 자료구조와, 조건에 맞는 구현 방법을 미리 생각합니다.
(1) 자료구조
① 자석 자료구조
: 원형으로 돌아가기 때문에, 맨 앞에있는 것과 맨 뒤에있는 것을 쉽게 넣고 뺄 수 있는 덱(deque)를 선택하였습니다.

덱은 위와 같은 구조로 되어있고, 자세한 것은 검색을 통해 알아보시면 좋을 것 같습니다.

저는 덱을 이용해서 위와같은 방식으로 동작하도록 구현하였습니다.
(2) 조건에 맞는 구현방법
① 자석을 회전하는 방법
: 저는 재귀함수를 이용해서 구현하였습니다. 이유는 모두 같은 방법으로 자석이 회전하기 때문입니다. '같은 방식으로 다음 동작도 수행' 할 때, 재귀함수를 이용하면 깔끔하게 코드를 작성할 수 있습니다.
| 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 | #include <iostream> #include <string.h> #include <deque> using namespace std; int K; deque<int> magnet[5]; bool visited[5]; int answer; int calculateScore() {     int output = 0;     int cnt = 1;     for (int i = 1; i <= 4; i++) {         if (magnet[i][0] == 1) {             output += cnt;         }         cnt *= 2;     }     return output; } void rotate(int num, int dir) {     visited[num] = true;     //왼쪽 자석 돌리기     if (num > 1 && magnet[num][6] != magnet[num - 1][2] && !visited[num - 1]) {         rotate(num - 1, -dir);     }     //오른쪽 자석 돌리기     if (num < 4 && magnet[num][2] != magnet[num + 1][6] && !visited[num + 1]) {         rotate(num + 1, -dir);     }     //해당자석 칸 옮기기     if (dir == 1) {         magnet[num].push_front(magnet[num][7]);         magnet[num].pop_back();     }     else {         magnet[num].push_back(magnet[num][0]);         magnet[num].pop_front();     } } int main() {     int test_case;     int T;     cin >> T;     for (test_case = 1; test_case <= T; test_case++) {         //초기화         K = 0;         for (int i = 0; i < 5; i++) {             magnet[i].clear();         }         memset(visited, false, sizeof(visited));         answer = 0;         //입력         cin >> K;         for (int i = 1; i <= 4; i++) {             for (int j = 0; j < 8; j++) {                 int num = 0;                 cin >> num;                 magnet[i].push_back(num);             }         }         for (int i = 0; i < K; i++) {             int num, dir = 0;             cin >> num >> dir;             //해법             rotate(num, dir);             memset(visited, false, sizeof(visited));         }         answer = calculateScore();         //출력         cout << "#" << test_case << " " << answer << "\n";     }     //종료     return 0; } | 
시뮬레이션과 재귀함수에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > SWEA' 카테고리의 다른 글
| [C++] SWEA 4012 - 요리사 (0) | 2022.12.06 | 
|---|---|
| [C++] SWEA 5648 - 원자 소멸 시뮬레이션 (0) | 2022.12.05 | 
| [C++] SWEA 2477 - 차량 정비소 (1) | 2022.11.30 | 
| [C++] SWEA 5653 - 줄기세포배양 (0) | 2022.11.29 | 
| [C++] SWEA 2115 - 벌꿀채취 (0) | 2022.11.28 |