삼성 SW 역량 테스트 기출 문제다.
삼성 문제는 구현 문제가 많은데 특정 알고리즘을 요구하면
그대로 구현해야한다. 근데 저 그대로가 상당히 까다롭다.
문제의 알고리즘을 보면 간단하다.
핵심은 딱 저대로 구현해야한다는것이다.
처음에 도전했을때 요구하지도 않은 dfs로 풀었는데 동작방식이 완전히 달라졌다.
결국 맞긴했는데 깔끔하지도 않고 요구사항이 조금만 바뀌어도 코드 전체를 뜯어야했다.
그래서 정말 요구사항을 원칙적으로 지키는 코드를 작성했다.
코드 작성시간도 정말 짧았고 무엇보다 가시적이었다.
삼성 문제를 풀때는 이렇게 깔끔하게 풀어야겠다.
/**
* 백준 14503
* 시뮬레이션
*/
#include <bits/stdc++.h>
using namespace std;
int N,M;
int graph[50][50];
int ans=0;
int d=0;
int dy[]={-1,0,1,0};
int dx[]={0,1,0,-1};
void func1(int y,int x);
void func2(int y,int x);
// #1
void func1(int y,int x){
graph[y][x]=2;
ans++;
func2(y,x);
}
void func2(int y,int x){
// #2.b
for(int i=0;i<4;i++){
d=(d-1+4)%4;
int my=y+dy[d];
int mx=x+dx[d];
if(my<0 || my>=N || mx<0 || mx>=M) continue;
// #2.a
if(graph[my][mx]==0) func1(my,mx);
}
int ry=y+dy[(d-2+4)%4];
int rx=x+dx[(d-2+4)%4];
// #2.d
if(ry<0 || ry>=N || rx<0 || rx>=M || graph[ry][rx]==1){
cout<<ans<<endl;
exit(0);
}
// #2.c 후진
func2(ry,rx);
}
int main(void){
cin>>N>>M;
int sY,sX,sD;
cin>>sY>>sX>>sD;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
scanf("%d",&graph[i][j]);
}
}
d=sD;
func1(sY,sX);
}