[C++]SWEA 1220번 Magnetic
오늘은 SWEA 1220번 Magnetic 문제를 풀어보도록 하자.
처음엔 Inbound를 설정하여 하나하나씩 움직이는 방법을 생각했다. 하지만 그림을 계속 보며 무언가 규칙이 있다는 것을 깨달았다.
map을 봤을 때 세로 한 줄을 예시로 들어보자. 1 0 1 2 0 1 1 2 2 가 있다고 하면 결국 1 1 2 0 1 1 2 2 가 될 것이다.
우리가 구하는 것은 교착된 상태의 자성체들.
따라서 교착이 되있으려면 1과 2가 연속되어 있는 것을 찾으면 된다. 근데 이걸 하나하나 움직여주지 않아도 된다. 왜냐하면
어차피 강한 자기장 때문에 0은 생각해주지 않아도 되고 (어차피 붙을거임) 2 1 2 였다고 해도 2는 나가 떨어지므로 결국 1 2만 남아 1개로 카운팅이 된다.
문제는 다음과 같다.
[접근법]
1. 교착되는 상태는 어떠한 상태인지 생각해본다. (이전 변수에 저장된 값이 1이였는데 현재 변수에 저장된 값이 2면 교착상태 따라서 result++)
2. 문자열을 이용해서 다 붙여도 되지만 그냥 그리디적으로 풀었다.
[코드]
#include <iostream>
using namespace std;
char map[101][101];
int N, Testcase = 10, i = 0;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
while (Testcase--) {
int result = 0;
cin >> N;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> map[i][j];
}
}
for (int i = 1; i <= N; i++) {
char prev = '0';
char next = '0';
for (int j = 1; j <= N; j++) {
if (map[j][i] == '1') {
prev = '1';
}
else if (map[j][i] == '2') {
if (prev == '1') {
result++;
prev = '2';
}
}
}
}
cout <<'#'<<++i<<' '<<result<<'\n';
}
return 0;
}