[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ๋“ฑ๊ตฃ๊ธธ :: C++, ํšจ์œจ์„ฑ ํ†ต๊ณผํ•˜๊ธฐ, ์ฝ”๋“œ

๋“ฑ๊ตฃ๊ธธ

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

๊ณ„์†๋˜๋Š” ํญ์šฐ๋กœ ์ผ๋ถ€ ์ง€์—ญ์ด ๋ฌผ์— ์ž ๊ฒผ์Šต๋‹ˆ๋‹ค. ๋ฌผ์— ์ž ๊ธฐ์ง€ ์•Š์€ ์ง€์—ญ์„ ํ†ตํ•ด ํ•™๊ต๋ฅผ ๊ฐ€๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ง‘์—์„œ ํ•™๊ต๊นŒ์ง€ ๊ฐ€๋Š” ๊ธธ์€ m x n ํฌ๊ธฐ์˜ ๊ฒฉ์ž๋ชจ์–‘์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„๋ž˜ ๊ทธ๋ฆผ์€ m = 4, n = 3 ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

image0.png

๊ฐ€์žฅ ์™ผ์ชฝ ์œ„, ์ฆ‰ ์ง‘์ด ์žˆ๋Š” ๊ณณ์˜ ์ขŒํ‘œ๋Š” (1, 1)๋กœ ๋‚˜ํƒ€๋‚ด๊ณ  ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜, ์ฆ‰ ํ•™๊ต๊ฐ€ ์žˆ๋Š” ๊ณณ์˜ ์ขŒํ‘œ๋Š” (m, n)์œผ๋กœ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

๊ฒฉ์ž์˜ ํฌ๊ธฐ m, n๊ณผ ๋ฌผ์ด ์ž ๊ธด ์ง€์—ญ์˜ ์ขŒํ‘œ๋ฅผ ๋‹ด์€ 2์ฐจ์› ๋ฐฐ์—ด puddles์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ๋งŒ ์›€์ง์—ฌ ์ง‘์—์„œ ํ•™๊ต๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ 1,000,000,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ๊ฒฉ์ž์˜ ํฌ๊ธฐ m, n์€ 1 ์ด์ƒ 100 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • m๊ณผ n์ด ๋ชจ๋‘ 1์ธ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌผ์— ์ž ๊ธด ์ง€์—ญ์€ 0๊ฐœ ์ด์ƒ 10๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ง‘๊ณผ ํ•™๊ต๊ฐ€ ๋ฌผ์— ์ž ๊ธด ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

 

์ฝ”๋“œ

#include <string>
#include <vector>

using namespace std;

bool isPuddles(int y, int x, vector<vector<int>> & pud){
    for(int i=0; i<pud.size(); i++){ // 10
        if(pud[i][0]==x+1 && pud[i][1]==y+1)
            return true;
    }
    return false;
}

int solution(int m, int n, vector<vector<int>> puddles) {
    long long answer = 0;

    vector<vector<long long>> map(n, vector<long long>(m));
    for(int i=0; i<n; i++){ // 10^4
        for(int j=0; j<m; j++){
            if(i==0 && j==0){
                map[i][j] = 1;
                continue;
            }
            if(isPuddles(i, j, puddles)) { // ์›…๋ฉ์ด๊ฐ€ ์žˆ์œผ๋ฉด 0
                map[i][j] = 0;
                continue;
            }
            if(i>=1){ // ์ ‘ํ•˜๋Š” ์œ„์ชฝ ๊ตฌ๊ฐ„์ด ์žˆ์œผ๋ฉด
                map[i][j]+=map[i-1][j]; // ์œ„์—์„œ ์˜จ ์ˆ˜ ๋”ํ•˜๊ธฐ
                map[i][j]%=1000000007;
            }
            if(j>=1){ // ์ ‘ํ•˜๋Š” ์™ผ์ชฝ ๊ตฌ๊ฐ„์ด ์žˆ์œผ๋ฉด
                map[i][j]+=map[i][j-1]; // ์™ผ์ชฝ์—์„œ ์˜จ ์ˆ˜ ๋”ํ•˜๊ธฐ
                map[i][j]%=1000000007;
            }
        }
    }
    answer = map[n-1][m-1];
    if(answer>=1000000007)
        answer %= 1000000007;
    return answer;
}

 

ํ’€์ด

DP๋ผ๊ธฐ์—๋Š” ๋„ˆ๋ฌด ๋‹จ์ˆœํ•œ, ๊ทธ๋ƒฅ ๋ฐฐ์—ด์„ ์ด์šฉํ•œ ๋ง์…ˆ ๋ฌธ์ œ์˜€๋‹ค. ์–ด๋ฆด ๋•Œ๋ถ€ํ„ฐ ํ•ด์˜ค๋˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ์ฐพ๋Š” ๋ฒ•์„ ์ด์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.

์ตœ๋‹จ๊ฒฝ๋กœ๋ผ๋Š” ์‚ฌ์‹ค์„ ์ค˜๋†“๊ณ  ๋˜, ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜๋กœ ์ œํ•œ์„ ๊ฑธ์–ด๋‘ฌ์„œ ํ•œ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ๋งŒ ํ’€ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

๋ฐฉ์‹์€ (1,1)์—์„œ 1์„ ์ €์žฅํ•˜๋ฉด์„œ ์‹œ์ž‘ํ•œ ๋’ค, ์›…๋ฉ์ด์—๋Š” 0์„ ์›…๋ฉ์ด๊ฐ€ ์•„๋‹Œ ๊ณณ์—๋Š” ํ•ด๋‹น ์ขŒํ‘œ์˜ ์™ผ์ชฝ๊ณผ ์œ„์ชฝ์˜ ์ˆ˜๋ฅผ ๋”ํ•ด์„œ ๊ธฐ์žฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ฆผ์ฒ˜๋Ÿผ ์ƒ‰์น ๋œ ๊ณณ์˜ ์ˆซ์ž๋Š” ์™ผ์ชฝ๊ณผ ์œ„์— ๊ธฐ์žฌ๋œ ์ˆ˜๋ฅผ ๋”ํ•ด์ค€ ์ˆ˜์ด๋‹ค.

์›…๋ฉ์ด๋ฅผ 0์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ์œผ๋ฏ€๋กœ ์›…๋ฉ์ด๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€๋Š” ๊ฒฝ๋กœ๋Š” ์„ธ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์ฑ„์ ๊ฒฐ๊ณผ

n์ด 10^4์ธ๋ฐ, O(n)์œผ๋กœ ํ’€์–ด์„œ ์‹œ๊ฐ„์€ ์ ๊ฒŒ ๋‚˜์™”๋‹ค.

 

์ฃผ์˜์‚ฌํ•ญ

์ฝ”๋“œ ์ค‘๊ฐ„์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์ด ์žˆ๋Š”๋ฐ,

map[i][j]%=1000000007;

์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ์ปค์ ธ์„œ long long ํ˜•์œผ๋กœ ๋‹ด๊ธด ํž˜๋“  ๋ชจ์–‘์ธ์ง€, answer์—์„œ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ๊ณ„์† ์‹คํŒจ๊ฐ€ ๋‚˜์™”๋‹ค.

๊ทธ๋ž˜์„œ ์ฝ”๋“œ ์ค‘๊ฐ„์— ์•„์˜ˆ ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ๋„ฃ์–ด๋ฒ„๋ฆฌ๋‹ˆ๊นŒ ๊ทธ์ œ์„œ์•ผ ํ’€๋ ธ๋‹ค... ใ…‚ใ„ท

ํšจ์œจ์„ฑ์—์„œ๋งŒ ์˜ค๋ฅ˜๋‚  ๋•Œ๋Š” ์ž๋ฃŒํ˜•์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์ž.

๋ฐ˜์‘ํ˜•