Skip to content

Conversation

@froglike6
Copy link
Collaborator

@froglike6 froglike6 commented Jul 22, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

Gold 4 ๋ฐค(Time For The Moon Night)

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

20๋ถ„

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์ˆ˜๋„ ์ฝ”๋“œ

์ž…๋ ฅ N, M, K
Nร—M ํฌ๊ธฐ์˜ grid๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
K๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ:
โ€ƒx, y๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ grid\[x-1]\[y-1]๋ฅผ 1๋กœ ๋งŒ๋“ ๋‹ค (๋ณ„์ด ์žˆ๋Š” ์นธ ํ‘œ์‹œ)

๋„ค ๊ผญ์ง“์  (a1,b1), (a2,b2), (a3,b3), (a4,b4)๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค
๋ชจ๋“  ์ขŒํ‘œ์—์„œ 1์„ ๋นผ์„œ 0-๊ธฐ๋ฐ˜ ์ธ๋ฑ์Šค๋กœ ๋ฐ”๊พผ๋‹ค

visited ๋ฐฐ์—ด์„ Nร—M ํฌ๊ธฐ์˜ False๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค
์ƒํ•˜์ขŒ์šฐ ๋ฐฉํ–ฅ ๋ฐฐ์—ด dirs๋ฅผ ์ค€๋น„ํ•œ๋‹ค
answer๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค

๋ชจ๋“  ์นธ (i, j)์— ๋Œ€ํ•ด ๋ฐ˜๋ณตํ•œ๋‹ค:
โ€ƒ๋งŒ์•ฝ grid\[i]\[j]๊ฐ€ 0์ด๊ณ  visited\[i]\[j]๊ฐ€ False๋ผ๋ฉด:
โ€ƒโ€ƒstack์— (i, j)๋ฅผ ๋„ฃ๊ณ  visited\[i]\[j]๋ฅผ True๋กœ ๋งŒ๋“ ๋‹ค
โ€ƒโ€ƒcountA์™€ countB๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค

โ€ƒโ€ƒstack์ด ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค:
โ€ƒโ€ƒโ€ƒ(x, y)๋ฅผ stack์—์„œ ๊บผ๋‚ธ๋‹ค
โ€ƒโ€ƒโ€ƒ๋งŒ์•ฝ (x, y)๊ฐ€ ์ฒซ ๋ฒˆ์งธ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ผ๋ฉด countA๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
โ€ƒโ€ƒโ€ƒ๋งŒ์•ฝ (x, y)๊ฐ€ ๋‘ ๋ฒˆ์งธ ์ง์‚ฌ๊ฐํ˜• ๋‚ด๋ถ€๋ผ๋ฉด countB๋ฅผ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค

โ€ƒโ€ƒโ€ƒdirs์˜ ๋„ค ๋ฐฉํ–ฅ (dx, dy)์— ๋Œ€ํ•ด:
โ€ƒโ€ƒโ€ƒโ€ƒnx = x + dx, ny = y + dy
โ€ƒโ€ƒโ€ƒโ€ƒ๋งŒ์•ฝ nx, ny๊ฐ€ ๊ฒฉ์ž ๋ฒ”์œ„ ์•ˆ์ด๊ณ  grid\[nx]\[ny]๊ฐ€ 0์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด:
โ€ƒโ€ƒโ€ƒโ€ƒโ€ƒvisited\[nx]\[ny]๋ฅผ True๋กœ ๋งŒ๋“ค๊ณ  (nx, ny)๋ฅผ stack์— ๋„ฃ๋Š”๋‹ค

โ€ƒโ€ƒํƒ์ƒ‰์ด ๋๋‚˜๋ฉด answer์— countA ร— countB๋ฅผ ๋”ํ•œ๋‹ค

answer๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค

๋–จ๋ ค์˜ค๋Š” ๋ณ„๋น› ๋ฐ˜์ง์ด๋Š”๋ฐ ๋„Œ ์–ด๋””๋ฅผ ๋ณด๊ณ  ์žˆ๋Š”์ง€ ๊ธˆ๋ฐฉ์ด๋ผ๋„ ์‚ฌ๋ผ์งˆ ๊ฒƒ ๊ฐ™์€๋ฐ

์ด ๋ฌธ์ œ๋Š” $N \times M$ ๊ฒฉ์ž ์œ„์— ๋†“์ธ $K$๊ฐœ์˜ ๋ณ„์„ ํ”ผํ•ด, ๋‘ ๊ฐœ์˜ ์ง์‚ฌ๊ฐํ˜• ๊ตฌ์—ญ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์ž‘์  ์Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ ์ง์‚ฌ๊ฐํ˜• $A$์™€ $B$์—์„œ ๋ณ„์ด ์—†๋Š” ํ•œ ์นธ์”ฉ์„ ์ถœ๋ฐœ์ ์œผ๋กœ ์ •ํ•ด, ์„œ๋กœ ์ƒํ•˜์ขŒ์šฐ๋กœ๋งŒ ์ด๋™ํ•ด ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  $A$ ๊ตฌ์—ญ์˜ ์นธ๊ณผ ๋ชจ๋“  $B$ ๊ตฌ์—ญ์˜ ์นธ์„ ์ผ์ผ์ด DFS๋กœ ํƒ์ƒ‰ํ•˜๋ฉด ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ €๋Š” ๋ณ„์— ์˜ํ•ด ๋‚˜๋‰˜์–ด์ง„ ๋นˆ ์นธ ๋ฉ์–ด๋ฆฌ ๋‹จ์œ„๋กœ ์ ‘๊ทผํ–ˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์—ฐ๊ฒฐ๋œ ๋ฉ์–ด๋ฆฌ๋ณ„๋กœ ํ•œ ๋ฒˆ์˜ DFS๋ฅผ ๋Œ๋ ธ์Šต๋‹ˆ๋‹ค. ๊ฒฉ์ž๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋นˆ ์นธ์„ ์ฐพ์œผ๋ฉด, ๊ทธ ์นธ์—์„œ DFS๋ฅผ ๋Œ๋ ค ํ•˜๋‚˜์˜ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ, ๊ทธ ๋ฉ์–ด๋ฆฌ ์•ˆ์—์„œ $A$ ๊ตฌ์—ญ์— ์†ํ•œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ countA์—, $B$ ๊ตฌ์—ญ์— ์†ํ•œ ์นธ์˜ ๊ฐœ์ˆ˜๋ฅผ countB์— ๋„ฃ์€ ํ›„, ์ด ๋‘˜์„ ๊ณฑํ•ด ์ •๋‹ต์— ๋”ํ•ด์ฃผ๋Š” ํ˜•์‹์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ธ€๋กœ ๋ณธ๋‹ค๋ฉด ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹จ์ˆœํ•œ DFS ๋ฌธ์ œ(์žฅ์• ๋ฌผ์ด ์žˆ๋Š” ๊ฒฉ์ž)๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž.. ๋ฉ์–ด๋ฆฌ๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ฆฌ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ์‹œ๊ฐ„์„ ์“ด ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

Copy link
Contributor

@dohyeondol1 dohyeondol1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ „์— ๋จธ๋ฆฌ๋ฅผ ์‹ธ๋งค๋‹ค๊ฐ€ ๋„ํ˜„๋‹˜์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ์ฝ”๋“œ๋ฅผ ์งฐ์Šต๋‹ˆ๋‹ค.
์ผ๋ฐ˜์ ์ธ ๊ธธ์ฐพ๊ธฐ์˜€๋‹ค๋ฉด ํ’€ ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ ๊ฐ™์•˜๋Š”๋ฐ... ์กฐํ•ฉ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ผ๊ณ  ํ•ด์„œ ๋ชปํ’€์—ˆ์Šต๋‹ˆ๋‹ค.. ใ… ใ… 

๋„ํ˜„๋‹˜์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ํ’€์–ด์„œ ์ฝ”๋“œ์ƒ์—์„œ ๋ฆฌ๋ทฐํ• ๊ฑด ๋”ฐ๋กœ ์—†๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”..

#include <iostream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;

int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    
    int N, M, K;
    cin >> N >> M >> K;
    vector<vector<int>> grid(N, vector<int>(M, 0));
    for(int i = 0; i < K; i++) {
        int x, y;
        cin >> x >> y;
        grid[x-1][y-1] = 1;
    }
    
    int a1, b1, a2, b2, a3, b3, a4, b4;
    cin >> a1 >> b1 >> a2 >> b2 >> a3 >> b3 >> a4 >> b4;
    a1--; b1--; a2--; b2--; a3--; b3--; a4--; b4--;
    
    vector<vector<bool>> visited(N, vector<bool>(M, false));
    int dir[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
    long long answer = 0;
    
    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            if(grid[i][j] == 0 && !visited[i][j]) {
                stack<pair<int, int>> st;
                st.push({i, j});
                visited[i][j] = true;
                long long countA = 0, countB = 0;
                
                while(!st.empty()) {
                    auto [x, y] = st.top();
                    st.pop();
                    
                    if(x >= a1 && x <= a2 && y >= b1 && y <= b2)
                        countA++;
                    if(x >= a3 && x <= a4 && y >= b3 && y <= b4)
                        countB++;
                    
                    for(int d = 0; d < 4; d++) {
                        int nx = x + dir[d][0];
                        int ny = y + dir[d][1];
                        
                        if(nx >= 0 && nx < N && ny >= 0 && ny < M && grid[nx][ny] == 0 && !visited[nx][ny]) {
                            visited[nx][ny] = true;
                            st.push({nx, ny});
                        }
                    }
                }
                
                answer += countA * countB;
            }
        }
    }
    
    cout << answer << '\n';
    return 0;
}

๋ฆฌ๋ทฐ๋ฅผ ์ผ์ฃผ์ผ์ „์— ๋‹ฌ๋ ค๊ณ  ํ–ˆ๋Š”๋ฐ...
์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.. ใ…œ

@Fnhid
Copy link
Collaborator

Fnhid commented Aug 7, 2025

๋ฐ€๋ฆฐpr์„ ๋“œ๋””์–ด ์“ฐ๊ฒŒ ๋˜์—ˆ๋„ค์š”!

์ €๋„ ๋น„์Šทํ•˜๊ฒŒ ๋„ํ˜„๋‹˜์˜ ์ˆ˜๋„์ฝ”๋“œ๋ฅผ ์ฐธ๊ณ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ €๋Ÿฐ ๋ฐœ์ƒ์„ ์ €์ ˆ๋กœ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋ฐœ์ „ํ•ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค..

#include <iostream>
#include <vector>
#include <stack>

#define X first
#define Y second

using namespace std;
using Pos = vector<pair<int, int>>;

template <typename T>
using Grid = vector<vector<T>>;

int dx[4] = {0, -1, 0, 1};
int dy[4] = {1, 0, -1, 0};

long long dfs(const Pos& starPos, const Pos& boxPos, int n, int m){

    long long ans = 0;

    Grid<int> grid(n, vector(m, 0));
    Grid<bool> visited(n, vector(m, false));

    for (auto pos : starPos)
        if (pos.X >= 0 && pos.X < n && pos.Y >= 0 && pos.Y < m)
            grid[pos.X][pos.Y] = 1;



    for (int i=0;i<n;i++)
    {
        for (int j=0;j<m;j++)
        {
            if (visited[i][j] == true || grid[i][j] == 1) continue;
            long long countA=0, countB=0;
            stack<pair<int, int>> st;
            st.push({i, j});
            visited[i][j] = true;
            while (!st.empty())
            {
                auto [x, y] = st.top();
                st.pop();
                if(x >= boxPos[0].X && x <= boxPos[1].X && y >= boxPos[0].Y && y <= boxPos[1].Y)
                    countA++;
                if(x >= boxPos[2].X && x <= boxPos[3].X && y >= boxPos[2].Y && y <= boxPos[3].Y)
                    countB++;

                for (int d=0;d<4;d++)
                {
                    int nx = x + dx[d];
                    int ny = y + dy[d];

                    if (nx >= 0 && nx < n && ny >= 0 && ny < m && grid[nx][ny] == false && visited[nx][ny] == false){
                        visited[nx][ny] = true;
                        st.push({nx, ny});
                    }
                }

            }
            ans += countA * countB;
        }
    }



    return ans;

}

int main()
{
    cin.tie(nullptr)->sync_with_stdio(false);

    int n, m, k;

    cin >> n >> m >> k;

    Pos starPos(k);
    Pos boxPos(4);


    for (int i=0;i<k;i++){
        cin >> starPos[i].X >> starPos[i].Y;
        starPos[i].X--;
        starPos[i].Y--;
    }

    for (int i=0;i<4;i++){
        cin >> boxPos[i].X >> boxPos[i].Y;
        boxPos[i].X--;
        boxPos[i].Y--;
    }

    cout << dfs(starPos, boxPos, n, m);

    return 0;
}

@Fnhid Fnhid merged commit 0017dbc into 21-froglike6 Aug 7, 2025
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants