⛔ 단순히 기록용 입니다... 어떻게 풀었는가 생각도 다시 해보고 그러니까 아마도 도움은 안되실 것 같습니다.
약 1년전에 풀이했던 문제인데, 성공한줄 모르고 풀다가 로그인했을때 성공표시가 되어있었다..
이 문제를 보고, 50글자가 최대이기 때문에 아무리 올라가도 아무리 내려가도 아무리 좌우로 가도 50을 벗어나지 않기 때문에, 현재 위치는 (50,50)으로 해두고 최고로 높이간 곳, 최고로 아래 또는 좌우로 간곳으로 이동마다 비교를해서, 최대 최소값을 구하고 그 범위안에 방문했다면 '.' 방문하지 않았다면 '#' 으로 표시해 배열을 그릴 수 있다. 그리고 1년전 문제풀이보다 지금이 더욱 깔끔하게 작성된것을 보면? 그래도 코드 짜는 능력이 조금은 발전했다고 볼 수 있을것 같다.
실력이 오르는가 안오르는가 생각을 많이하는 요즘이였는데, 이런 문제 하나로 조금은 판단이 된것 같다. 쭉 열심히 해나가보자.
먼저, 1년전 코드
#include<iostream>
#include<vector>
#include<algorithm>
#define MAX 550
using namespace std;
const int dx[4] = {0,-1,0,1};
const int dy[4] = {1,0,-1,0}; // south, left, up, right +1 right, -1 left
struct Person{
int y;
int x;
int dir;
};
int visited[MAX][MAX];
Person person = {250,250,0};
string str;
vector<int> leftRight,upDown;
void init() {
int n; cin >> n;
cin >> str;
leftRight.push_back(250);
upDown.push_back(250);
visited[250][250] = 1;
}
void simulation() {
for(int i = 0; i < str.length(); i++){
int y = person.y;
int x = person.x;
int d = person.dir;
if(str[i] == 'R'){
d += 1;
if(d > 3) d = 0;
person.dir = d;
}
else if(str[i] == 'L'){
d -= 1;
if(d < 0) d = 3;
person.dir = d;
}
else if(str[i] == 'F'){
int ny = y + dy[d];
int nx = x + dx[d];
person = {ny,nx,d};
leftRight.push_back(nx);
upDown.push_back(ny);
visited[ny][nx] = true;
}
}
sort(leftRight.begin(), leftRight.end());
sort(upDown.begin(), upDown.end());
for(int i = upDown[0]; i <= upDown[upDown.size() - 1]; i++){
for(int j = leftRight[0]; j <= leftRight[leftRight.size() - 1]; j++){
if(visited[i][j]) cout << ".";
else cout << "#";
}
cout << "\n";
}
}
int main() {
init();
simulation();
return 0;
}
현재 코드
#include<iostream>
#define MAX 110
using namespace std;
const int dx[4] = {0,-1,0,1};
const int dy[4] = {1,0,-1,0}; // down, left, up, right -> +1 : right, -1 : left
pair<int,int> current;
int visited[MAX][MAX];
int n,y,x,_y,_x,dir; // max : not underbar, min : have underbar
void move(char m){
if(m == 'R'){
dir += 1;
if(dir > 3) dir = 0;
} else if(m == 'L'){
dir -= 1;
if(dir < 0) dir = 3;
} else{
int cy = current.first;
int cx = current.second;
int ny = cy + dy[dir];
int nx = cx + dx[dir];
visited[ny][nx] = 1;
// min, max initial
x = max(nx, x);
_x = min(nx, _x);
y = max(ny, y);
_y = min(ny, _y);
current = {ny, nx};
}
}
int main() {
cin >> n;
x = 50, y = 50, _x = 50, _y = 50;
dir = 0;
current = {50,50};
visited[current.first][current.second] = 1;
for(int i = 0; i < n; i++){
char c; cin >> c;
move(c);
}
for(int i = _y; i <= y; i++){
for(int j = _x; j <= x; j++){
if(visited[i][j]) cout << '.';
else cout << '#';
}
cout << "\n";
}
return 0;
}
'PS > BaekJoon' 카테고리의 다른 글
[C++/1790] 수 이어 쓰기 2 (0) | 2024.06.16 |
---|---|
[C++/31937] 로그프레소 마에스트로 (1) | 2024.06.13 |
[C++/1660] 캡틴 이다솜 (0) | 2024.06.03 |
[C++/30024] 옥수수 밭 (0) | 2024.05.27 |
[C++/28432] 끝말잇기 (0) | 2024.05.22 |