728x90

๋ฌธ์ œ

1์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ, 0์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

(1,1)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (N,M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ๋•Œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์ตœ์†Œ ์นธ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ 1

4 6
101111
101010
101011
111011

์ถœ๋ ฅ 1

15

์ฝ”๋“œ

#include<iostream>
#include<queue>
#include<algorithm>
#define MAX 101

using namespace std;

int MAP[MAX][MAX];
int visited[MAX][MAX];
int dist[MAX][MAX];
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
int N, M;
pair<int, int> startP, endP;

queue < pair<int, int>> Q;

void BFS() {
    
    Q.push(make_pair(startP.first, startP.second));

    dist[startP.first][startP.second]++;
    visited[startP.first][startP.second] = 1;

    while (!Q.empty()) {
        int y = Q.front().first;
        int x = Q.front().second;
        Q.pop();
        //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];


            if ((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)
                && MAP[ny][nx] == 1 &&!visited[ny][nx]) {
                visited[ny][nx] = 1;
                Q.push(make_pair(ny, nx));
                dist[ny][nx] = dist[y][x] + 1;
            }
        }
    }
    cout << dist[endP.first-1][endP.second-1];
}


void input() {
    string num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        for (int j = 0; j < M; j++) {
            MAP[i][j] = num[j]-'0';
        }
    }
}

int main() {

    cin.tie(NULL); cout.tie(NULL); ios::sync_with_stdio(false);

    int tmp;
    cin >> N>>M;
    startP = make_pair(0, 0);
    endP = make_pair(N, M);
    
    input();
    BFS();

    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

์ € input ํ•จ์ˆ˜์—์„œ cin์„ ํ†ตํ•ด MAP์„ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

์ฃผ์˜ํ•  ์ ์€ ํ•œ ์ค„๋‹น ๋ถ™์–ด์žˆ๋Š” ์ƒํƒœ๋กœ ๋ฐ›์•„์™€์„œ cin์œผ๋กœ ๋ฐ›์€ ๋‹ค์Œ ๋Š์–ด์„œ ์ €์žฅํ•ด์ฃผ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

void input() {
    string num;
    for (int i = 0; i < N; i++) {
        cin >> num;
        for (int j = 0; j < M; j++) {
            MAP[i][j] = num[j]-'0';
        }
    }
}

string์œผ๋กœ ๋ฐ›์€ ๋‹ค์Œ string์—์„œ ์ธ์ž๋กœ ์ ‘๊ทผํ•ด์ฃผ๋ฉด char ํ˜•์ด์—ฌ์„œ charํ˜•์„ int๋กœ ๋ฐ”๊พธ๋ ค๋ฉด '0'์˜ ์ˆซ์ž๋ฅผ ๋นผ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ๋‹ค์Œ BFS ํƒ์ƒ‰์„ ํ†ตํ•ด ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์•„์ฃผ๋ฉด ๋˜๋Š”๋ฐ BOJ 6087๋ฒˆ ๋ ˆ์ด์ € ํ†ต์‹ ๊ณผ ๋ฌธ์ œ๊ฐ€ ๋งค์šฐ ํก์‚ฌํ•ฉ๋‹ˆ๋‹ค.

https://dana3711.tistory.com/90

 

[C++] BOJ 6087๋ฒˆ: ๋ ˆ์ด์ € ํ†ต์‹ 

๋ฌธ์ œ ๊ฑฐ์šธ์„ ์„ค์น˜ํ•˜๋ฉด ๋ฐฉํ–ฅ์„ 90๋„ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. *์€ ๋ฒฝ์œผ๋กœ ๋šซ๊ณ  ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค. ๊ฑฐ์šธ์„ ์ตœ์†Œ๋กœ ์„ค์น˜ํ•˜์—ฌ์„œ ์ฒ˜์Œ ์‹œ์ž‘์ง€์  C์—์„œ ๋์ง€์  C์— ๋„๋‹ฌํ• ๋•Œ๊นŒ์ง€ ๊ฐ€์•ผํ•œ๋‹ค. ์ตœ์†Œ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ

dana3711.tistory.com

๋‹ค๋งŒ ๋‹ค๋ฅธ์ ์€ ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€ ๊ฐ€๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ๋น„์šฉ์„ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ

if ((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)&& MAP[ny][nx] == 1 &&!visited[ny][nx]) 
{
    visited[ny][nx] = 1;
    Q.push(make_pair(ny, nx));
    dist[ny][nx] = dist[y][x] + 1;
}

4๋ฐฉํ–ฅ ํƒ์ƒ‰์„ ํ• ๋•Œ ๋งŒ์•ฝ ๋งต ์•ˆ์— ์žˆ๊ณ ((nx >= 0 &&nx < M) && (ny >= 0 && ny < N)), ๊ทธ ์นธ์ด ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ด๋ผ๋ฉด(MAP[ny][nx] == 1) ํ•ด๋‹น ์นธ์„ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜์„ ๋•Œ

ํ•ด๋‹น ์นธ์œผ๋กœ ์ž๋ฆฌ๋ฅผ ์ด๋™ํ•˜๊ณ  ๊ฐ€๋Š” ๋น„์šฉ์„ +1 ํ•ด์ค๋‹ˆ๋‹ค.

 

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

 

๋ฐ˜์‘ํ˜•
728x90

๋ฌธ์ œ

๊ฑฐ์šธ์„ ์„ค์น˜ํ•˜๋ฉด ๋ฐฉํ–ฅ์„ 90๋„ ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

*์€ ๋ฒฝ์œผ๋กœ ๋šซ๊ณ  ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๋‹ค.

๊ฑฐ์šธ์„ ์ตœ์†Œ๋กœ ์„ค์น˜ํ•˜์—ฌ์„œ ์ฒ˜์Œ ์‹œ์ž‘์ง€์  C์—์„œ ๋์ง€์  C์— ๋„๋‹ฌํ• ๋•Œ๊นŒ์ง€ ๊ฐ€์•ผํ•œ๋‹ค.

์ตœ์†Œ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์šธ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๋ผ

 

์ž…๋ ฅ 1

7 8
.......
......C
......*
*****.*
....*..
....*..
.C..*..
.......

์ถœ๋ ฅ 1

3

์ฝ”๋“œ

#include<iostream>
#include<algorithm>
#include<utility>
#include<queue>
#include<vector>

using namespace std;

//6087๋ฒˆ ๋ ˆ์ด์ € ํ†ต์‹ 

char MAP[101][101];
int visited[101][101];
int w, h;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };

pair<int, int> startP, endP;
queue<pair<int,int>> cntDir;
queue < pair<int, int>> Q;
void BFS() {
    for (int i = 0; i < 4; i++) {
        Q.push(make_pair(startP.first, startP.second));
        cntDir.push(make_pair(0, i));
    }
    visited[startP.first][startP.second] = 0;

    while (Q.empty() == 0) {
        int y = Q.front().first;
        int x = Q.front().second;
        int cnt = cntDir.front().first;
        int dir = cntDir.front().second;
        Q.pop();
        cntDir.pop();
        //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];
            int nCnt = cnt;

            if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
            if (MAP[ny][nx] == '*') continue;
            if (dir != i) nCnt++;
            if (visited[ny][nx] >= nCnt) {
                visited[ny][nx] = nCnt;
                Q.push(make_pair(ny, nx));
                cntDir.push(make_pair(nCnt, i));
            }
        }
    }
    cout << visited[endP.first][endP.second];
}

void input() {
    bool isFirst = true;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> MAP[i][j];
            if (MAP[i][j] == 'C') {
                (isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
                isFirst = false;
            }
            visited[i][j] = 10001;
        }
    }
}

int main() {

    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);

    cin >> w >> h;
    
    input();
    BFS();


    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

void input() {
    bool isFirst = true;
    for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
            cin >> MAP[i][j];
            if (MAP[i][j] == 'C') {
                (isFirst) ? startP = make_pair(i, j) : endP = make_pair(i, j);
                isFirst = false;
            }
            visited[i][j] = 10001;
        }
    }
}

๋จผ์ € input ํ•จ์ˆ˜์—์„œ cin์„ ํ†ตํ•ด MAP์„ ๋ฐ›์•„์˜ต๋‹ˆ๋‹ค.

๊ทธ ์ค‘ ๋งŒ์•ฝ C๊ฐ€ ์ž…๋ ฅ๋˜์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ์ฒ˜์Œ์ด๋ผ๋ฉด startP์— ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋„ฃ๊ณ , ์ฒ˜์Œ์ด ์•„๋‹ˆ๋ผ๋ฉด endP์— ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋„ฃ๋Š”๋‹ค.

void BFS() {
    for (int i = 0; i < 4; i++) {
        Q.push(make_pair(startP.first, startP.second));
        cntDir.push(make_pair(0, i));
    }
    visited[startP.first][startP.second] = 0;

    while (Q.empty() == 0) {
        int y = Q.front().first;
        int x = Q.front().second;
        int cnt = cntDir.front().first;
        int dir = cntDir.front().second;
        Q.pop();
        cntDir.pop();
        //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
        for (int i = 0; i < 4; i++) {
            int ny = y + arrow[i][0];
            int nx = x + arrow[i][1];
            int nCnt = cnt;

            if (nx <0 || nx >= w || ny < 0 || ny >=h) continue;
            if (MAP[ny][nx] == '*') continue;
            if (dir != i) nCnt++;
            if (visited[ny][nx] >= nCnt) {
                visited[ny][nx] = nCnt;
                Q.push(make_pair(ny, nx));
                cntDir.push(make_pair(nCnt, i));
            }
        }
    }
    cout << visited[endP.first][endP.second];
}

ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ์œ„์น˜์ธ startP์˜ ์œ„์น˜๋ฅผ 4๋ฒˆ Q์— ์˜ฎ๊ฒจ๋‹ด์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ ์œ„์น˜์—์„œ ์œ„,์•„๋ž˜,์™ผ์ชฝ,์˜ค๋ฅธ์ชฝ ๋ฐฉํ–ฅ์„ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉํ–ฅ์„ ์ €์žฅํ•ด์ค๋‹ˆ๋‹ค. ๋ฐฉํ–ฅ์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๊ฑฐ์šธ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋”ํ•ด์ค˜์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

๊ทธ ๋‹ค์Œ Q๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ while๋ฌธ์„ ๋Œ๋ฆฝ๋‹ˆ๋‹ค. Q์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋ฅผ ๋ณ€์ˆ˜์— ๋‹ด๊ณ  ์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ํƒ์ƒ‰์—์„œ *์ธ ๋ฒฝ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ๋งต์„ ๋ฒ—์–ด๋‚˜๋ฉด ํƒ์ƒ‰์„ ๊ฑด๋„ˆ๋›ฐ๊ณ , ๋งŒ์•ฝ ๊ฐ€๋˜ ๋ฐฉํ–ฅ๊ณผ ํ˜„์žฌ ๋ฐฉํ–ฅ์ด ๋งž์ง€ ์•Š๋‹ค๋ฉด ๊ฑฐ์šธ์„ ๋”ํ•ด์ค๋‹ˆ๋‹ค. ํ˜„์žฌ ๋ฐฉ๋ฌธํ•œ ์œ„์น˜์—์„œ์˜ ๊ฑฐ์šธ์„ ์‚ฌ์šฉํ•œ ๊ฐฏ์ˆ˜๋ฅผ visited[][] ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ธฐ์— ๋งŒ์•ฝ ์‚ฌ์šฉํ•œ ๊ฐฏ์ˆ˜๊ฐ€ ํ˜„์žฌ ์นด์šดํŠธ๋ณด๋‹ค ๋†’๋‹ค๋ฉด ์ตœ์†Œ๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ๋์ง€์ ์— ๋„๋‹ฌํ• ๋•Œ๊นŒ์ง€ ๊ณ„์† ๋ฐ˜๋ณตํ•˜์—ฌ์„œ visited[๋์ง€์ .y][๋์ง€์ .x] ์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋‹ต์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

 

๋ฐ˜์‘ํ˜•
728x90

 

๋ฌธ์ œ

์ฒซ์งธ ์ค„์— n์ด ์ฃผ์–ด์ง„๋‹ค. n์€ 1,000,000,000,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

์ž…๋ ฅ 1

1000

์ถœ๋ ฅ 1

228875

์ฝ”๋“œ

#include<iostream>
#include<cmath>

using namespace std;

//2749๋ฒˆ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜ 3
//ํ”ผ์‚ฌ๋…ธ ์ฃผ๊ธฐ๋ฅผ ์ด์šฉ

long long arr[1500050];     //๋ฉ”๋ชจ์ด์ œ์ด์…˜
int m = 1000000;            //๋‚˜๋ˆ„๋Š” ์ˆ˜
int cycle;

int cycle_func() {
    int k=0,tmp=m;
    while (tmp > 1) {
        tmp /= 10;
        k++;
    }

    return 15 * pow(10, k - 1);
}

void pisano_fibo() {
    arr[0] = 0;
    arr[1] = 1;
    //ํŒŒ์‚ฌ๋…ธ ์ฃผ๊ธฐ์— ์˜ํ•˜์—ฌ 1500000์˜ ๊ฐ’๋“ค์ด ๋ฐ˜๋ณต๋œ ํ›„์— ๋‹ค์‹œ ์žฌ ๋ฐ˜๋ณต๋จ
    cycle = cycle_func();
    for (int i = 0; i < cycle; i++) {
        arr[i + 2] = (arr[i+1]+arr[i])%m;
    }
}

int main() {

    cin.tie(NULL);cout.tie(NULL);
    ios::sync_with_stdio(false);

    long long n;
    cin >> n;
    pisano_fibo();
    cout << arr[n % cycle];

    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

ํ”ผ์‚ฌ๋…ธ ์ฃผ๊ธฐ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘ธ๋Š” ๋ฌธ์ œ์ด๋‹ค ๊ธฐ๋ณธ์ ์œผ๋กœ n์˜ ๋ฒ”์œ„๊ฐ€ 1,000,000,000,000,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ์กด์— ์“ฐ๋˜ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ์„œ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ„์ด ๋งค์šฐ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์“ธ์ˆ˜๊ฐ€ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ํ”ผ์‚ฌ๋…ธ ์ฃผ๊ธฐ๋ฅผ ํ†ตํ•ด ๋ฐ˜๋ณต ์ฃผ๊ธฐ๋ฅผ ์ฐพ๊ณ  ๊ทธ ์ฃผ๊ธฐ๋™์•ˆ์˜ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์—์„œ m์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ ๊ฐ’๋“ค์„ ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค. ๊ทธ ํ›„ ์ €์žฅํ•œ ๋ฐฐ์—ด์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” n๋ฒˆ์งธ๊ฐ€ ์ฃผ๊ธฐ์—์„œ ๋ช‡๋ฒˆ์งธ ์ˆซ์ž์ธ์ง€ ์ฐพ์•„๋‚ด์„œ ํ•ด๋‹น ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค. ํ”ผ์‚ฌ๋…ธ ์ฃผ๊ธฐ๋Š”

๋‚˜๋ˆ„๋Š” ๊ฐ’์„ M์ด๋ผ๊ณ  ์ง€์นญํ–ˆ์„ ๋•Œ,

M=10^k , cycle = 15 x 10^(k-1)

์ด๋‹ค.

 

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•
728x90

๋ฌธ์ œ

๋‘ ๋‹ค๊ฐํ˜•์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋‘ ๋‹ค๊ฐํ˜•์˜ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋งŒ์•ฝ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋‹ค๊ฐํ˜•์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๋ฉด ๋‹ค์Œ์˜ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ ํ•˜๋‚˜์˜ ๋‹ค๊ฐํ˜•๋งŒ์„ ๊ตฌํ•˜๋„๋ก ํ•œ๋‹ค. ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ๊ฒƒ์ด ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์ด๋‹ค.

 

์ž…๋ ฅ 1

3 3
0 0
1 0
1 1
0 1
0 0
1 0

์ถœ๋ ฅ 1

5
0 0
2 0
2 1
1 2
0 1

์ฝ”๋“œ

#include<iostream>
#include<algorithm>
#include<vector>
#define x first
#define y second
using namespace std;

//2244๋ฒˆ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค ํ•ฉ
//Convex Hull(CCW(Counter Clock Wise)) ์‚ฌ์šฉ

typedef pair<long long, long long> Point2f;
Point2f a[1010];
Point2f b[1010];

//counter clock wise : ์ขŒํšŒ์ „ํ•˜๋Š”์ง€ ํŒ๋‹จ
//๋ฒกํ„ฐ AB์™€ ๋ฒกํ„ฐ AC์˜ CW/CCW
// 0๋ณด๋‹ค ํฌ๋ฉด ๋ฐ˜์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” ๊ฒƒ, 0๋ณด๋‹ค ์ž‘์œผ๋ฉด ์‹œ๊ณ„๋ฐฉํ–ฅ์œผ๋กœ ๋„๋Š” ๊ฒƒ
//int์— 1LL์„ ๊ณฑํ•ด์ฃผ๋ฉด long long์œผ๋กœ ํ˜•๋ณ€ํ™˜์„ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ
int ccw(Point2f a, Point2f b, Point2f c) {
    long long res = a.x * b.y + b.x * c.y + c.x * a.y;
    res -= b.x * a.y + c.x * b.y + a.x * c.y;
    if (res > 0) return 1;          //์‹œ๊ณ„ ๋ฐ˜๋Œ€๋ฐฉํ–ฅ
    if (res) return -1;             //์‹œ๊ณ„ ๋ฐฉํ–ฅ
    return 0;                           //ํ‰๋ฉด์ƒ
}

long long dist(Point2f a, Point2f b) {
    long long dx = 1LL*a.x - b.x;
    long long dy = 1LL * a.y - b.y;
    return dx * dx + dy * dy;
}

int main() {

    vector<Point2f> arr;
    int aNum, bNum;
    int xTmp, yTmp;
    int pIdx = 0;
    cin >> aNum >> bNum;
    pIdx = aNum * bNum;
    for (int i = 0; i < aNum; i++) {
        cin >> xTmp >> yTmp;
        a[i].x = xTmp; a[i].y = yTmp;
    }
    for (int i = 0; i < bNum; i++) {
        cin >> xTmp >> yTmp;
        b[i].x = xTmp; b[i].y = yTmp;
    }
    //๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ ๋“ค vector ์ œ์ž‘
    for (int i = 0; i < aNum; i++) {
        for (int j = 0; j < bNum; j++) {
            arr.push_back(Point2f{ a[i].x + b[j].x,a[i].y + b[j].y });
        }
    }

    //arr์˜ ์ตœ์†Œ ๊ฐ’์„ ์ฐพ์•„์„œ 0๋ฒˆ ์ž๋ฆฌ์™€ ๋ฐ”๊ฟˆ(0๋ฒˆ์„ ์ œ์ผ ์ž‘์€ ๊ฐ’์œผ๋กœ ์„ค์ •)
    swap(arr[0], *min_element(arr.begin(), arr.end()));
    //0๋ฒˆ์„ ์ œ์™ธํ•œ ์ ๋“ค์„ ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ์ •๋ ฌ
    //[&]{}๋Š” ๋žŒ๋‹ค์‹์œผ๋กœ์จ ํ•ด๋‹น ํ•จ์ˆ˜์—๋”ฐ๋ผ์„œ sort๋ฅผ ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•จ
    sort(arr.begin() + 1, arr.end(), [&](Point2f& a, Point2f& b) {
        int cw = ccw(arr[0], a, b);
        //cw๊ฐ€ 0 ์ด์ƒ์ด๋ฉด ๋ฐ˜์‹œ๊ณ„ ๋ฐฉํ–ฅ์ด๊ณ  true๋ฅผ ๋ฐ˜ํ™˜ 0์ด๋ฉด false ๋ฐ˜ํ™˜, cw๊ฐ€ -1์ธ ๊ฒฝ์šฐ(์‹œ๊ณ„ ๋ฐฉํ–ฅ) if๋ฌธ์„ ๋“ค์–ด์˜ค์ง€ ์•Š์Œ
        if (cw) return cw > 0;          
        return dist(arr[0], a) < dist(arr[0], b); //cw๊ฐ€ -1์ธ ๊ฒฝ์šฐ ๊ธฐ์ค€์  arr[0]์—์„œ์˜ ๊ฑฐ๋ฆฌ์ˆœ์œผ๋กœ ์ •๋ ฌ
        });

    vector<Point2f> hull;
    for (int i = 0; i < arr.size();i++) {
        while (hull.size() >= 2 && ccw(hull[hull.size() - 2], hull.back(), arr[i]) <= 0) {
            hull.pop_back();
        }
        hull.push_back(arr[i]);
    }
    cout << hull.size() << "\n";
    for (int i = 0; i < hull.size(); i++) {
        cout << hull[i].x << " " << hull[i].y << "\n";
    }

    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

convex hull๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

convex hull์€ ์ฃผ์–ด์ง„ ์ ์—์„œ ์™ธ๊ณฝ์„ ์„ ์ด๋ฃจ๋Š” ์ ๋“ค์„ ์ฐพ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ ๋ฏผ์ฝ”ํ”„์Šคํ‚ค์˜ ํ•ฉ ๋˜ํ•œ ๊ณต๊ฐ„์˜ ํ•ฉ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— convex hull ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ์˜ ํ•ต์‹ฌ์ ์ธ ๋ถ€๋ถ„์€ https://justicehui.github.io/ioi/2019/05/21/BOJ2244/ ์—์„œ ๋”ฐ์™”๋‹ค.

๋ช‡๊ฐ€์ง€ ๋žŒ๋‹ค์‹์ด๋ผ๋˜์ง€ auto์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ๋‚˜์—๊ฒŒ ์–ด๋ ค์›Œ์„œ for๋ฌธ์œผ๋กœ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์ฃผ์„์„ ๋‹ฌ์•„์„œ ์ง„ํ–‰ํ•ด๋ณด์•˜๋‹ค. ๊ธฐ์กด์˜ ๋‹ค๋ฅธ๊ณณ์—์„œ ์ฐพ์•„์„œ convex hull์„ ๊ตฌํ˜„ํ•ด์„œ ๋„ฃ์–ด๋ณด์•˜๋Š”๋ฐ ์˜ˆ์ œ๋ฅผ ๋„ฃ์–ด๋ณด์•˜์„ ๋•Œ๋Š” ์ถœ๋ ฅ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜๋‚˜์™”์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฑ์ค€์—์„œ ํ…Œ์ŠคํŠธ ํ• ๋•Œ๋งˆ๋‹ค 

์ด๋Ÿฌํ•œ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋‚˜ ์ถœ๋ ฅ ์ดˆ๊ณผ๊ฐ€ ๋‚˜์™€์„œ ๋ญ๊ฐ€ ๋ฌธ์ œ์ธ์ง€ ๋ชฐ๋ผ์„œ ๋‹ค๋ฅธ ๋ถ„ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ณด๊ณ  ์ฐธ๊ณ ํ•ด์„œ ํ•ด๋ณด์•˜๋Š”๋ฐ ์•„๋งˆ sortingํ•˜๋Š” ๊ณผ์ •์—์„œ ์—๋Ÿฌ๊ฐ€ ๋‚œ๊ฒŒ ์•„๋‹๊นŒ ์‹ถ๋‹ค..

convex hull ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•œ ๊ธ€์€ https://kbw1101.tistory.com/50 ์—ฌ๊ธฐ ๋ธ”๋กœ๊ทธ์— ์•„์ฃผ ์นœ์ ˆํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•
728x90

๋ฌธ์ œ

๋™๊ตด์— ์žˆ๋Š” ๋ฏธ๋„ค๋ž„์˜ ๋ชจ์–‘๊ณผ ๋‘ ์‚ฌ๋žŒ์ด ๋˜์ง„ ๋ง‰๋Œ€์˜ ๋†’์ด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ชจ๋“  ๋ง‰๋Œ€๋ฅผ ๋˜์ง€๊ณ  ๋‚œ ์ดํ›„์— ๋ฏธ๋„ค๋ž„ ๋ชจ์–‘์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ 1

5 6
. . . . . .
. . X X . .
. . X . . .
. X X X X .
1
3

์ถœ๋ ฅ 1

. . . . . .
. . . . . .
. . X X . .
. . X X . .
. X X X X .

์ฝ”๋“œ

#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#define y first
#define x second
using namespace std;

//2933๋ฒˆ ๋ฏธ๋„ค๋ž„

//2์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ
char arr[101][101];
int visited[101][101];      //dfs๋ฅผ ์œ„ํ•œ ๋ฐฉ๋ฌธ ๋ฐฐ์—ด
int R, C;
vector<pair<int,int>> cluster;
int arrow[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };

void DFS(int yIdx, int xIdx) {
    if (arr[yIdx][xIdx] == '.' || visited[yIdx][xIdx]) return;
    visited[yIdx][xIdx] = true;
    cluster.push_back({yIdx,xIdx});
    //์ขŒ์šฐ์œ„์•„๋ž˜ ํƒ์ƒ‰
    for (int i = 0; i < 4; i++) {
        int ny = yIdx + arrow[i][0];
        int nx = xIdx + arrow[i][1];    
        if (nx >= 0 && nx < C && ny >= 0 && ny < R)
            DFS(ny, nx);
    }
}

void checkCluster() {
    memset(visited, 0, sizeof(visited));
    for (int a = 0; a < R; a++) {
        for (int b = 0; b < C; b++) {
            if (arr[a][b] == '.' || visited[a][b]) continue;
            cluster.clear();
            DFS(a,b);
            vector<int> low(C, -1);     //vector(์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ• ๋‹น๋  ๊ฐ’)
            for (int z = 0; z < cluster.size(); z++) {
                pair<int, int> p= cluster[z];
                low[p.x] = max(low[p.x], p.y);
                arr[p.y][p.x] = '.';
            }

            //์–ผ๋งˆ๋‚˜ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธธ์ง€ i์— ๋„ฃ๊ธฐ
            int lowmove = R;
            for (int i, j = 0; j < C; j++) {
                if (low[j] == -1) continue;
                i = low[j];

                //'.'์ด ์•„๋‹Œ๊ฒฝ์šฐ, ํƒ์ƒ‰ ๋†’์ด๊ฐ€ ๋†’์ด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
                while (i < R &&arr[i][j] == '.') {
                    i++;
                }
                lowmove = min(lowmove, i - low[j] - 1);
            }

            for (int i = 0; i < cluster.size(); i++) {
                pair<int, int> p = cluster[i];
                p.y += lowmove;
                arr[p.y][p.x] = 'x';
                visited[p.y][p.x] = true;
            }
        }
    }
    
}

void shoot(int orderNum,int height) {
    //์™ผ์ชฝ์ธ์ง€ ์˜ค๋ฅธ์ชฝ์ธ์ง€ ํŒ๋‹จ
    height = R - height;
    if (orderNum % 2 == 0) {
        for (int i = 0; i < C; i++) {
            if (arr[height][i] == 'x') {
                arr[height][i] = '.';
                break;
            }
        }
    }
    else {
        for (int i = C-1; i >= 0; i--) {
            if (arr[height][i] == 'x') {
                arr[height][i] = '.';
                break;
            }
        }
    }
    
    checkCluster();
}

int main() {
    
    cin.tie(NULL);
    cout.tie(NULL);
    ios::sync_with_stdio(false);


    cin >> R >> C;

    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cin >> arr[i][j];
        }
    }
    int N,height=0;
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> height;
        shoot(i, height);
    }

    for (int i = 0; i < R; i++) {
        for (int j = 0; j < C; j++) {
            cout << arr[i][j];
        }
        cout << "\n";
    }

    return 0;
}

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

checkCluster() ํ•จ์ˆ˜ ๋ถ€๋ถ„์€ https://100100e.tistory.com/152 ์ด ๋ธ”๋กœ๊ทธ ๋ถ„์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ์„œ ์ œ์ž‘ํ•˜์˜€๋‹ค. ์ œ์ผ ๋‚˜๋ž‘ ์ƒ๊ฐ์ด ๋น„์Šทํ•˜๊ธฐ๋„ ํ–ˆ๊ณ  ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑ๋˜์–ด์žˆ์–ด์„œ ์ข‹์•˜๋‹ค. checkCluster() ๋ถ€๋ถ„์„ ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…ํ•ด๋ณผ๊นŒ ์‹ถ๋‹ค.

 memset(visited, 0, sizeof(visited));
    for (int a = 0; a < R; a++) {
        for (int b = 0; b < C; b++) {

 

checkCluster๋Š” ๋ถ€๋ฉ”๋ž‘์„ ๋˜์ง„ ํ›„์— ๋–จ์–ด์ง€๋Š” ํด๋Ÿฌ์Šคํ„ฐ๋“ค์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•œ ํ•จ์ˆ˜๋กœ์จ ์‹คํ–‰๋œ๋‹ค. ๋”ฐ๋ผ์„œ DFS๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•˜๋ ค๋ฉด visited ๋ฐฐ์—ด์„ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค˜์•ผํ•œ๋‹ค. ๊ทธ๋ฅผ ์œ„ํ•ด memset ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค. ๋‚˜๋จธ์ง€ for๋ฌธ์€ R x C ํฌ๊ธฐ์˜ ๋งต์„ for๋ฌธ์„ ํ†ตํ•ด ๋Œ๋ฆฐ๋‹ค.

if (arr[a][b] == '.' || visited[a][b]) continue;
cluster.clear();
DFS(a,b);

๊ทธ ๋‹ค์Œ์—๋Š” ํ•ด๋‹น ๋งต์˜ ์นธ์ด . ์œผ๋กœ ๋น„์–ด์žˆ๋Š” ์นธ์ด๊ฑฐ๋‚˜ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๋ฐฐ์—ด์ผ ๊ฒฝ์šฐ ๊ทธ๋Œ€๋กœ ๋ฐ‘์˜ ๊ณ„์‚ฐ์„ ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ DFS ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด์„œ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ขŒ์šฐ์œ„์•„๋ž˜๋ฅผ ํƒ์ƒ‰ํ•ด์„œ cluster ๋ฒกํ„ฐ์— ๋„ฃ๋Š”๋‹ค.

vector<int> low(C, -1);     //vector(์ปจํ…Œ์ด๋„ˆ ํฌ๊ธฐ, ๊ฐ๊ฐ ํ• ๋‹น๋  ๊ฐ’)
for (int z = 0; z < cluster.size(); z++) {
    pair<int, int> p= cluster[z];
    low[p.x] = max(low[p.x], p.y);
    arr[p.y][p.x] = '.';
}

๊ทธ ํ›„์—  low ๋ผ๋Š” ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฒกํ„ฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค. low(C,-1) ์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด C ํฌ๊ธฐ ๋งŒํผ์„ -1์˜ ๊ฐ’์œผ๋กœ ํ• ๋‹นํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค. ๊ทธ ๋‹ค์Œ for๋ฌธ์„ ํ†ตํ•ด์„œ ์ €์žฅ๋œ cluster๋งŒํผ ๋Œ๋ ค์ฃผ๊ณ  ๋งŒ์•ฝ ํ•ด๋‹น ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋†’์ด ๊ฐ’์ธ p.y ๊ฐ’์ด ๋งŒ์•ฝ์— ๊ธฐ์กด์— ์ €์žฅ๋œ ๋†’์ด ๊ฐ’์ธ low[p.x]์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ํฐ ๊ฐ’์„ low[p.x]์— ์ €์žฅํ•ด์ค€๋‹ค. ์ €์žฅํ•œ ๋‹ค์Œ์—๋Š” ํ•ด๋‹น ๊ฐ’์€ ๋‚˜์ค‘์— ๋‹ค์‹œ ๋–จ์–ด์ง„ ํด๋Ÿฌ์Šคํ„ฐ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝํ•ด์ค„ ๊ฒƒ์ž„์œผ๋กœ ๋ฏธ๋ฆฌ .์œผ๋กœ ๋ณ€๊ฒฝ ์‹œ์ผœ์ค€๋‹ค.

int lowmove = R;
for (int i, j = 0; j < C; j++) {
    if (low[j] == -1) continue;
    i = low[j];

    //'.'์ด ์•„๋‹Œ๊ฒฝ์šฐ, ํƒ์ƒ‰ ๋†’์ด๊ฐ€ ๋†’์ด๋ณด๋‹ค ์ž‘์€ ๊ฒฝ์šฐ
    while (i < R &&arr[i][j] == '.') {
        i++;
    }
    lowmove = min(lowmove, i - low[j] - 1);
}

์–ผ๋งŒํผ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธธ์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. lowmove ๋ณ€์ˆ˜์—๋Š” ๊ฐ€์žฅ ๋งŽ์ด ๋‚ด๋ ค๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ๋†’์ด R๊ฐ’์„ ๋„ฃ์€ ๋‹ค์Œ ๋น„๊ตํ•ด๊ฐ€๋ฉด์„œ ์ž‘์œผ๋ฉด ๋ณ€๊ฒฝํ•˜๋Š” ํ˜•์‹์ด๋‹ค. if(low[j]==-1) continue; ์˜ ๊ฒฝ์šฐ ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” ์—ฐ์‚ฐ์„ ํ•˜์ง€ ์•Š๊ณ  ๋„˜์–ด๊ฐ„๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ i = low[j];๋กœ ๋•…์— ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋†’์ด๋ฅผ ๋„ฃ๋Š”๋‹ค. ๊ทธ ํ›„ while๋ฌธ์„ ํ†ตํ•ด์„œ ๋งŒ์•ฝ ํ•ด๋‹น ์ขŒํ‘œ์˜ ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋นˆ๊ณต๊ฐ„์ธ ๊ฒฝ์šฐ ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ๊ฐ’์ธ i๋ฅผ ++ํ•ด์ค€๋‹ค. ํ•ด๋‹น while๋ฌธ์ด ๊ธ‘๋‚˜๊ณ  ๋‚˜๋ฉด min ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ lowmove ๊ฐ’๊ณผ i-low[j]-1์„ ๋น„๊ตํ•œ๋‹ค. arr[i][j]์˜ ๊ฒฝ์šฐ ์•„๊นŒ ์œ„์—์„œ .์œผ๋กœ ๋งŒ๋“ค์–ด๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๊ฐœ๊ฐ€ ๋” ์„ธ์–ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ์ˆ˜ i ์—์„œ -1์„ ํ•œ ๋‹ค์Œ ๊ธฐ์กด ๋†’์ด์ธ low[j]๋ฅผ ๋นผ์ฃผ๋ฉด ๋‚ด๋ ค๊ฐ€์•ผํ•  ์นธ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋‚˜์˜จ๋‹ค.

for (int i = 0; i < cluster.size(); i++) {
                pair<int, int> p = cluster[i];
                p.y += lowmove;
                arr[p.y][p.x] = 'x';
                visited[p.y][p.x] = true;
}

๋งˆ์ง€๋ง‰์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ฐฏ์ˆ˜ ๋งŒํผ for๋ฌธ์„ ๋Œ๋ ค์„œ lowmove ๋งŒํผ ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์˜ฎ๊ฒจ์ค€๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•
728x90

๋ฌธ์ œ

๋ฐฑ์ค€์ด๋Š” ๋™์ƒ์—๊ฒŒ "๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š”" ๊ฒŒ์ž„์„ ๊ฐ€๋ฅด์ณ์ฃผ๊ณ  ์žˆ๋‹ค. ๋ฐฑ์ค€์ด๊ฐ€ ์ •์ˆ˜๋ฅผ ํ•˜๋‚˜์”ฉ ์™ธ์น ๋•Œ๋งˆ๋‹ค ๋™์ƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฑ์ค€์ด๊ฐ€ ๋งํ•œ ์ˆ˜ ์ค‘์—์„œ ์ค‘๊ฐ„๊ฐ’์„ ๋งํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ, ๊ทธ๋™์•ˆ ๋ฐฑ์ค€์ด๊ฐ€ ์™ธ์นœ ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ง์ˆ˜๊ฐœ๋ผ๋ฉด ์ค‘๊ฐ„์— ์žˆ๋Š” ๋‘ ์ˆ˜ ์ค‘์—์„œ ์ž‘์€ ์ˆ˜๋ฅผ ๋งํ•ด์•ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฑ์ค€์ด๊ฐ€ ๋™์ƒ์—๊ฒŒ 1, 5, 2, 10, -99, 7, 5๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ์™ธ์ณค๋‹ค๊ณ  ํ•˜๋ฉด, ๋™์ƒ์€ 1, 1, 2, 2, 2, 2, 5๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋งํ•ด์•ผ ํ•œ๋‹ค. ๋ฐฑ์ค€์ด๊ฐ€ ์™ธ์น˜๋Š” ์ˆ˜๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋™์ƒ์ด ๋งํ•ด์•ผ ํ•˜๋Š” ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

์ž…๋ ฅ 1

7
1
5
2
10
-99
7
5

์ถœ๋ ฅ 1

1
1
2
2
2
2
5

 

์ฝ”๋“œ

#include<iostream>
#include<queue>
#include<vector>

using namespace std;

//1655๋ฒˆ ๊ฐ€์šด๋ฐ๋ฅผ ๋งํ•ด์š”
//์ตœ์†Œํž™, ์ตœ๋Œ€ํž™ ์‚ฌ์šฉ
int main() {
    
    cin.tie(NULL);
    cout.tie(NULL);

    int N,temp;
    priority_queue<int> max;        //์ตœ๋Œ€ํž™       ์šฐ์„ ์ˆœ์œ„ ํ๋Š” default๋กœ less<in>๋ฅผ ์‚ฌ์šฉ
    priority_queue<int,vector<int>,greater<int>> min;       //์ตœ์†Œํž™
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> temp;

        (max.size() == min.size()) ? max.push(temp) : min.push(temp);

        if (!max.empty() && !min.empty()&& max.top() > min.top()) {
            //์ค‘๊ฐ„ ๊ฐ’์˜ ์ˆœ์„œ๊ฐ€ ๋‹ฌ๋ผ์ง„๋‹ค๋ฉด ๊ฐ’ ๋ฐ”๊พธ๊ธฐ
            int maxVal, minVal;
            maxVal = max.top();
            minVal = min.top();
            max.pop();
            min.pop();
            max.push(minVal);
            min.push(maxVal);
        }

        cout << max.top()<<"\n";
    }
    
    return 0;
}

 

*๊ฐ„๋‹จํ•œ ํ•ด์„ค*

์—ฌ๋Ÿฌ๊ฐ€์ง€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘์—์„œ ๋ฌด์—‡์„ ์™œ ์“ฐ๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ์ธ๋ฐ ์—ฌ๊ธฐ์„œ๋Š” ์ตœ์†Œํž™, ์ตœ๋Œ€ํž™์„ ์‚ฌ์šฉํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” ํž™์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ๊ฐ’ ์ค‘ ์ตœ๋Œ“๊ฐ’ ๋˜๋Š” ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„๋‚ด๋Š” ์—ฐ์‚ฐ์ด ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋น ๋ฅธ ์—ฐ์‚ฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

ํž™์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์™„์ „ ์ด์ง„ํŠธ๋ฆฌ์ด๋ฏ€๋กœ ๋ฐฐ์—ด์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

์ตœ๋Œ€ ํž™์€ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ์ €์žฅ๋œ ๊ฐ’์ด ์ปค์ง€๋Š” ๊ตฌ์กฐ์ด๋‹ค. 

์ตœ์†Œ ํž™์€ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก ๊ฐ’์ด ์ž‘์•„์ง€๋Š” ๊ตฌ์กฐ์ด๋‹ค.

 

์ด ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์„ ๋ฐ˜ํ‹ˆ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ํ•œ์ชฝ์€ ์ตœ์†Œ ํž™, ํ•œ์ชฝ์€ ์ตœ๋Œ€ ํž™์„ ์‚ฌ์šฉํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์—ฐ์‚ฐํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด ๊ฒฝ์šฐ priority_queue๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. priority_queue๋Š” ํž™์„ ์ด์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด ์žˆ๊ณ  ์˜ต์…˜์„ ์ด์šฉํ•˜์—ฌ greater<int> ๋ฐ less<int>๋ฅผ ์ด์šฉํ•˜์—ฌ ์œ„์™€๊ฐ™์€ ์ตœ์†Œํž™, ์ตœ๋Œ€ํž™ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ†ตํ•ด์„œ ์ค‘๊ฐ„๊ฐ’์„ ์ฐพ๋Š” ๊ฒƒ์ด๋ผ ๋ฐ˜ํ‹ˆ์„ ๋‚˜๋ˆ„์–ด์„œ ์˜ค๋ฆ„์ฐจ์ˆœ, ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋˜๋Š” ์ตœ์†Œํž™, ์ตœ๋Œ€ํž™์„ ์ด์šฉํ•˜๋ฉด ๋น ๋ฅด๊ฒŒ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 

 

*์ด ๋ฐฉ๋ฒ•๋งŒ์ด ๋งž๋Š” ์ •๋‹ต์€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ›จ์”ฌ ์ข‹๊ณ  ๋น ๋ฅธ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€ํ•˜์‹œ๋Š” ๋ถ„๋“ค ํ™”์ดํŒ…! '0'/*

๋ฐ˜์‘ํ˜•

+ Recent posts