4013번 특이한 자석
해결방법
주어진 조건을 구현하는 시뮬레이션 문제이다
삼성 기출문제인 톱니바퀴 문제와 동일하다
⭐️ 솔루션 ⭐️
저번에 풀었던 문제인데도 좌•우 회전이 헷갈렸다
leftValue
와rightValue
값을 갱신해가며 회전 여부를 파악하면 됐다또한 점수를 매기는 방식이 헷갈렸는데 구글링을 통해 간단한 방법을 찾았다
문제 조건
- 8개의 전극을 가지고 있는 자석이 총 4개
- 서로 다른 극이 접해야 회전을 함
소스코드
문제 해결 시간 : 1h
메모리 : 12488 KB
시간 : 6 ms
#include <iostream>
#include <algorithm>
using namespace std;
int testcase;
int k,ind,dir,ans,sum;
int magnet[5][9];
void rotateMagnet(int i,int d){
// 시계 방향 회전
if(d == 1){
int tmp = magnet[i][8];
for(int j=8; j>=2; j--){
magnet[i][j] = magnet[i][j-1];
}
magnet[i][1] = tmp;
}
// 반시계 방향 회전
else{
int tmp = magnet[i][1];
for(int j=1; j<=7; j++){
magnet[i][j] = magnet[i][j+1];
}
magnet[i][8] = tmp;
}
}
void go(){
// 현재 자석 정보
int leftValue = magnet[ind][7];
int rightValue = magnet[ind][3];
// 해당 자석 회전
rotateMagnet(ind, dir);
// 왼쪽 회전
int d = dir;
for(int i=ind-1; i>=1; i--){
if(leftValue != magnet[i][3]){
d *= -1;
leftValue = magnet[i][7];
rotateMagnet(i,d);
}else{
break;
}
}
// 오른쪽 회전
d = dir;
for(int i=ind+1; i<=4; i++){
if(rightValue != magnet[i][7]){
d *= -1;
rightValue = magnet[i][3];
rotateMagnet(i,d);
}else{
break;
}
}
}
int main(int argc, const char * argv[]) {
// cin,cout 속도향상
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin >> testcase;
for(int tc=1; tc<=testcase; tc++){
cin >> k;
for(int i=1; i<=4; i++){
for(int j=1; j<=8; j++){
cin >> magnet[i][j];
}
}
for(int i=0; i<k; i++){
cin >> ind >> dir;
go();
}
ans = 0;
sum = 1;
for(int i=1; i<=4; i++){
if(magnet[i][1] == 1){
ans += sum;
}
sum *= 2;
}
cout << "#" << tc << " " << ans << "\n";
}
return 0;
}
'Algorithm > SWEA 문제풀이' 카테고리의 다른 글
[SWEA] 5644번 무선 충전 (0) | 2019.03.15 |
---|---|
[SWEA] 4014번 활주로 건설 (0) | 2019.03.15 |
[SWEA] 4012번 요리사 (0) | 2019.03.15 |
[SWEA] 4008번 숫자 만들기 (0) | 2019.03.15 |
[SWEA] 2383번 점심 식사시간 (0) | 2019.03.15 |