https://www.acmicpc.net/problem/14503
그대로 시뮬레이션한다.
2.b. 를 구현함에 있어 조금 고민을 했다.
cycle을 리턴하고 새로운 cycle을 만들지, 아니면 하나의 그냥 의미상으로 하나의 cycle 안에서 왼쪽으로 돌려가며 4방향 중 갈 수 있는 방향이 있으면 그걸 선택할지...
전자의 경우 몇번 회전했는지, 한 바퀴를 돈 것인지 검사하는 게 번거로울 것 같아 후자를선택했다.
#include<iostream>
using namespace std;
int di[] = { -1,0,1,0 };
int dj[] = { 0,1,0,-1 };
int ri, rj, rd;
int tab[50][50];
int roll_d(int d) {
return ((d - 1) + 4) % 4;
}
bool one_ccl() {
tab[ri][rj] = 2;
for (int ctr = 0; ctr < 4; ctr++) {
//자기자신 방향으로 되돌아옴
rd = roll_d(rd);
int ci = ri + di[rd], cj = rj + dj[rd];
if (tab[ci][cj] == 0) {
//cout << "case A. 방문"<<ci<<","<<cj << endl;
ri = ci;
rj = cj;
return true;
}
}
//3번, 4번
//한 칸 후진할 수 있는가?
int ci = ri - di[rd], cj = rj - dj[rd];
if (tab[ci][cj] != 1) {
//벽이 아님
//cout << "case B. 후진" << endl;
ri = ci;
rj = cj;
return true;
}
else {
//cout << "case C. 종료" << endl;
return false;
}
}
void print_tab(int n, int m) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cout << tab[i][j] << " ";
}
cout << endl;
}
cout << endl;
}
int main() {
int n, m;
cin >> n >> m;
cin >> ri >> rj >> rd;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cin >> tab[i][j];
}
}
//print_tab(n, m);
while (one_ccl()) {
//print_tab(n,m);
}
//집계
int sum_clean = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (tab[i][j] == 2) {
sum_clean++;
}
}
}
cout << sum_clean << endl;
}
현재 코테 언어를 cpp에서 python으로 바꾸려고 노력 중인데... 같은 코드더라도 아직 python으로 잘 못 짜겠다... 배열 다루는 작업/그래프 방문의 경우 cpp를 유지하고 string 문제 / 명령어 있는 token화가 필요한 작업의 경우 python으로 풀어야하나 고민중이다.
사실 cpp로 알고리즘 문제를 풀 때 장점이 있긴 하다.
배열의 선언이 간단하다는 것(동적 할당이 크게 요구되지 않는, 범위가 정해진 알고리즘 문제의 경우 [5000]과 같이 선언하면 돼서 상당히 쉽다.)
또한 배열을 순회함에 있어서 인덱스 움직임이 python보다 자유롭다.
(나는 python을 찍먹했기 때문에 인덱스 움직임이 부자연스럽다...)
그리고 방금 느낀건데 python의 경우 웬만한 라이브러리 출신 오브젝트(deque같은 거)가 shallow copy여서 중간에 내용물을 찍어본다거나 하는 내 코딩 스타일에서 부자연스럽다.
혹시라도 여기까지 읽어주신 분이 있으시다면 해결책을 댓글로 공유해주시면 감사하겠습니다 ㅠㅅㅠ