[C++] 백준 1347 미로 만들기

semin·2023년 10월 25일
0

https://www.acmicpc.net/problem/1347
제목 : 미로 만들기
난이도 : Silver II

풀이

우리는 F, R, L 3가지 연산을 통해 미로를 이동 할 수 있습니다.
맵을 정해두고 이동을 하는것이 아닌 이동한 좌표를 기반으로 맵을 그려야 하기 때문에 저는 최초에 (0, 0)을 기준으로 방향에 맞춰 연산한 좌표를 모두 한 곳에 저장하고, 음수의 좌표를 전부 정수로 맞춰줘야 한다.
그리고 나서 x 축에서 제일 큰 수 + 1 과 y축에서 제일 큰 수 +1 크기의 맵을 그려서 벽인 "#"으로 채운다음 저장한 좌표에 "."을 넣어 길을 만들어주면 된다.

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

vector<pair<int, int>> getpoints(string s) {
    int y = 0, x = 0, dir = 0;
    int dx[4] = { 0, 1, 0, -1 };
    int dy[4] = { 1, 0, -1, 0 }; // 아래가 0  왼쪽이 1, 위 2, 오른쪽 3
    
    vector<pair<int, int>> tmp = { {0, 0} };

    for (int i = 0; i < s.length(); i++) {
        char c = s[i];
        if (c == 'R') {
            dir = ((dir + 4) - 1) % 4;
        }
        else if (c == 'L') {
            dir = (dir + 1) % 4;
        }
        else {
            y += dy[dir];
            x += dx[dir];
            tmp.push_back({ y, x });
        }
    }
    return tmp;
}

bool sortop(pair<int, int> a, pair<int, int> b) {
    auto [ay, ax] = a;
    auto [by, bx] = b;

    if (ay == by) return ax < bx;
    else return ay < by;
}

pair<int, int> getminpoint(vector<pair<int, int>>& points) { // 음수 중 제일 낮은 좌표를 가져옴
    int minY = 10000, minX = 10000;
    for (int i = 0; i < points.size(); i++) {
        minY = min(minY, points[i].first);
        minX = min(minX, points[i].second);
    }
    return { minY, minX };
}

pair<int, int> getsizeofmap(vector<pair<int, int>> &points) { // y x 사이즈 반환
    auto [fy, fx] = getminpoint(points);
    int maxY = 0, maxX = 0;
    for (int i = 0; i < points.size(); i++) {
        if (fy < 0) points[i].first += abs(fy);
        if (fx < 0) points[i].second += abs(fx);
        maxY = max(maxY, points[i].first);
        maxX = max(maxX, points[i].second);
    }

    return { maxY, maxX };
}

int main()
{
    int L;
    string order;
    cin >> L >> order;
    vector<pair<int, int>> points = getpoints(order);
    sort(points.begin(), points.end(), sortop);

    auto [y, x] = getsizeofmap(points);

    vector<string> map;
    for (int i = 0; i < y + 1; i++) {
        string s = "";
        for (int j = 0; j < x + 1; j++) {
            s += "#";
        }
        map.push_back(s);
    }

    for (int i = 0; i < points.size(); i++) {
        auto [y, x] = points[i];
        map[y][x] = '.';
    }
    for (int i = 0; i < map.size(); i++) {
        cout << map[i] << "\n";
    }
}

profile
게임 프로그래밍 공부

0개의 댓글

관련 채용 정보