728x90
반응형
목차
https://www.acmicpc.net/problem/15662
문제
문제 접근
8자리에 0, 1로 이루어져서 비트마스킹으로 할려다가 그게 더 복잡한 것 같아서 그냥 배열로 풀었다.
맞닿는 인덱스가 2와 6이라는 것을 통해 따로 저장해 두고 그걸 바탕으로 쉬프트 해주면 간단하게 풀 수 있다.
코드 구현
#include <iostream>
#include <vector>
#include<map>
#include<math.h>
#include <algorithm>
using namespace std;
//N = 0 S = 1
// 1 = 시계 -1=반시계
// 오 2 -> 6 왼 6->2
//다르면 반대 회전 같으면 회전 x
//1 1 0 1 0 1 1 1-> 1 0 1 0 1 1 1 1
int T, K;
string str;
vector<int> v[1002];
vector<pair<int, int>> rotation;
void targeting(int idx, int dr) {
int str = idx;
int D = dr;
rotation.push_back({ str, D });
for (int j = str; j < T - 1; j++) {
if (v[j][2] == v[j + 1][6])break;
else {
if (D == 1)D = -1;
else
D = 1;
rotation.push_back({ j + 1, D });
}
}
D = dr;
for (int j = str; j >= 1; j--) {
if (v[j][6] == v[j - 1][2])break;
else {
if (D == 1)D = -1;
else
D = 1;
rotation.push_back({ j - 1, D });
}
}
}
void rotating() {
for (auto p : rotation) {
if (p.second == 1) {
int tmp = v[p.first][7];
for (int j = 7; j >= 1; j--) {
v[p.first][j] = v[p.first][j - 1];
}
v[p.first][0] = tmp;
}
else {
int tmp = v[p.first][0];
for (int j = 0; j <= 6; j++) {
v[p.first][j] = v[p.first][j +1];
}
v[p.first][7] = tmp;
}
}
}
int counting() {
int total = 0;
for (int i = 0; i < T; i++) {
total += v[i][0];
}
return total;
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int a, b;
cin >> T;
for (int i = 0; i < T; i++) {
cin >> str;
for (int j = 0; j < 8; j++) {
v[i].push_back(str[j] - '0');
}
}
cin >> K;
for (int i = 0; i < K; i++) {
cin >> a >> b;
targeting(a-1, b);
rotating();
rotation.clear();
}
cout << counting();
return 0;
}
반응형
'백준 문제풀이' 카테고리의 다른 글
[백준][완전탐색] 17070 파이프 옮기기 c++구현 (0) | 2024.09.23 |
---|---|
[백준][브루트포스] 14888 연산자 끼워넣기 c++구현 (2) | 2024.09.22 |
[백준][그리디] 1911 흙길 보수하기 c++구현 (0) | 2024.09.20 |
[백준][백트래킹][브루트포스] 15683 감시 c++구현 (0) | 2024.09.19 |
[백준][누적합][구현] 27942 danceplant c++ 구현 (1) | 2024.09.19 |