algorithm

BOJ 20056

rkawk 2022. 10. 9. 15:25
๋”๋ณด๊ธฐ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด์™€ ํŒŒ์ด์–ด๋ณผ ์„ฑ๊ณต

 

 

1 ์ดˆ 512 MB 13402 5276 3173 35.720%

๋ฌธ์ œ

์–ด๋ฅธ ์ƒ์–ด๊ฐ€ ๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋˜์—ˆ๊ณ , ํŒŒ์ด์–ด๋ณผ์„ ๋ฐฐ์› ๋‹ค.

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๊ฐ€ ํฌ๊ธฐ๊ฐ€ N×N์ธ ๊ฒฉ์ž์— ํŒŒ์ด์–ด๋ณผ M๊ฐœ๋ฅผ ๋ฐœ์‚ฌํ–ˆ๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ํŒŒ์ด์–ด๋ณผ์€ ๊ฐ์ž ์œ„์น˜์—์„œ ์ด๋™์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋‹ค. i๋ฒˆ ํŒŒ์ด์–ด๋ณผ์˜ ์œ„์น˜๋Š” (ri, ci), ์งˆ๋Ÿ‰์€ mi์ด๊ณ , ๋ฐฉํ–ฅ์€ di, ์†๋ ฅ์€ si์ด๋‹ค. ์œ„์น˜ (r, c)๋Š” rํ–‰ c์—ด์„ ์˜๋ฏธํ•œ๋‹ค.

๊ฒฉ์ž์˜ ํ–‰๊ณผ ์—ด์€ 1๋ฒˆ๋ถ€ํ„ฐ N๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , 1๋ฒˆ ํ–‰์€ N๋ฒˆ๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ , 1๋ฒˆ ์—ด์€ N๋ฒˆ ์—ด๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋‹ค.

ํŒŒ์ด์–ด๋ณผ์˜ ๋ฐฉํ–ฅ์€ ์–ด๋–ค ์นธ๊ณผ ์ธ์ ‘ํ•œ 8๊ฐœ์˜ ์นธ์˜ ๋ฐฉํ–ฅ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ •์ˆ˜๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

7 0 1
6   2
5 4 3

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๊ฐ€ ๋ชจ๋“  ํŒŒ์ด์–ด๋ณผ์—๊ฒŒ ์ด๋™์„ ๋ช…๋ นํ•˜๋ฉด ๋‹ค์Œ์ด ์ผ๋“ค์ด ์ผ์–ด๋‚œ๋‹ค.

  1. ๋ชจ๋“  ํŒŒ์ด์–ด๋ณผ์ด ์ž์‹ ์˜ ๋ฐฉํ–ฅ di๋กœ ์†๋ ฅ si์นธ ๋งŒํผ ์ด๋™ํ•œ๋‹ค.
    • ์ด๋™ํ•˜๋Š” ์ค‘์—๋Š” ๊ฐ™์€ ์นธ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ด์–ด๋ณผ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  2. ์ด๋™์ด ๋ชจ๋‘ ๋๋‚œ ๋’ค, 2๊ฐœ ์ด์ƒ์˜ ํŒŒ์ด์–ด๋ณผ์ด ์žˆ๋Š” ์นธ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚œ๋‹ค.
    1. ๊ฐ™์€ ์นธ์— ์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ์€ ๋ชจ๋‘ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ์ง„๋‹ค.
    2. ํŒŒ์ด์–ด๋ณผ์€ 4๊ฐœ์˜ ํŒŒ์ด์–ด๋ณผ๋กœ ๋‚˜๋ˆ„์–ด์ง„๋‹ค.
    3. ๋‚˜๋ˆ„์–ด์ง„ ํŒŒ์ด์–ด๋ณผ์˜ ์งˆ๋Ÿ‰, ์†๋ ฅ, ๋ฐฉํ–ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
      1. ์งˆ๋Ÿ‰์€ ⌊(ํ•ฉ์ณ์ง„ ํŒŒ์ด์–ด๋ณผ ์งˆ๋Ÿ‰์˜ ํ•ฉ)/5⌋์ด๋‹ค.
      2. ์†๋ ฅ์€ ⌊(ํ•ฉ์ณ์ง„ ํŒŒ์ด์–ด๋ณผ ์†๋ ฅ์˜ ํ•ฉ)/(ํ•ฉ์ณ์ง„ ํŒŒ์ด์–ด๋ณผ์˜ ๊ฐœ์ˆ˜)⌋์ด๋‹ค.
      3. ํ•ฉ์ณ์ง€๋Š” ํŒŒ์ด์–ด๋ณผ์˜ ๋ฐฉํ–ฅ์ด ๋ชจ๋‘ ํ™€์ˆ˜์ด๊ฑฐ๋‚˜ ๋ชจ๋‘ ์ง์ˆ˜์ด๋ฉด, ๋ฐฉํ–ฅ์€ 0, 2, 4, 6์ด ๋˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 1, 3, 5, 7์ด ๋œ๋‹ค.
    4. ์งˆ๋Ÿ‰์ด 0์ธ ํŒŒ์ด์–ด๋ณผ์€ ์†Œ๋ฉธ๋˜์–ด ์—†์–ด์ง„๋‹ค.

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๊ฐ€ ์ด๋™์„ K๋ฒˆ ๋ช…๋ นํ•œ ํ›„, ๋‚จ์•„์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ ์งˆ๋Ÿ‰์˜ ํ•ฉ์„ ๊ตฌํ•ด๋ณด์ž.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N, M, K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๋‘˜์งธ ์ค„๋ถ€ํ„ฐ M๊ฐœ์˜ ์ค„์— ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ํŒŒ์ด์–ด๋ณผ์˜ ์ •๋ณด๋Š” ๋‹ค์„ฏ ์ •์ˆ˜ ri, ci, mi, si, di๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์„œ๋กœ ๋‹ค๋ฅธ ๋‘ ํŒŒ์ด์–ด๋ณผ์˜ ์œ„์น˜๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

์ถœ๋ ฅ

๋งˆ๋ฒ•์‚ฌ ์ƒ์–ด๊ฐ€ ์ด๋™์„ K๋ฒˆ ๋ช…๋ นํ•œ ํ›„, ๋‚จ์•„์žˆ๋Š” ํŒŒ์ด์–ด๋ณผ ์งˆ๋Ÿ‰์˜ ํ•ฉ์„ ์ถœ๋ ฅํ•œ๋‹ค.

์ œํ•œ

  • 4 ≤ N ≤ 50
  • 0 ≤ M ≤ N2
  • 1 ≤ K ≤ 1,000
  • 1 ≤ ri, ci ≤ N
  • 1 ≤ mi ≤ 1,000
  • 1 ≤ si ≤ 1,000
  • 0 ≤ di ≤ 7

ํ’€์ด

๋‹จ์ˆœ ๊ตฌํ˜„๋ฌธ์ œ์ด๋ฏ€๋กœ ๋ฌธ์ œ์— ๋‚˜์˜จ๋Œ€๋กœ ๊ตฌํ˜„ํ•˜๋ฉด ๋œ๋‹ค.

ํŒŒ์ด์–ด๋ณผ์€ ์š”์†Œ๊ฐ€ 5๊ฐœ๋‚˜ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ตฌ์กฐ์ฒด๋‚˜ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ•˜๋Š”๊ฒŒ ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด

struct fb{
    int r,c,m,d,s;
};

 ์ด๋ ‡๊ฒŒ ๊ฐ์ฒด๋‹จ์œ„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์กฐ์ฒด๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

 

๊ฒฉ์ž๋ฌด๋Šฌ ํŒ์€ ํŒŒ์ด์–ด๋ณผ์ด ์—ฌ๋Ÿฌ๊ฐœ ๋“ค์–ด๊ฐ€ ์žˆ์„๋•Œ๋„ ์‰ฝ๊ฒŒ ๋‚˜ํƒ€๋‚ด ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด

์ด์ฐจ์› ๋ฒกํ„ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.

 

vector<fb>v[51][51];

ํŒŒ์ด์–ด๋ณผ์ด ์›€์ง์ด๋Š” ๊ฒฝ์šฐ๋Š”

(ํ˜„์žฌ์˜ ์ขŒํ‘œ(x๊ฐ’, y๊ฐ’ ๋”ฐ๋กœ) +  ๋ณ€ํ™”๋Ÿ‰ * ์†๋„) % N ์„ ํ•ด์ค€ ๊ฒฝ์šฐ์—์„œ

0์ดํ•˜์ผ ๊ฒฝ์šฐ์—๋งŒ N์„ ๋”ฐ๋กœ ๋”ํ•ด์ฃผ๊ณ , 0 ์ดˆ๊ณผ์ผ ๊ฒฝ์šฐ์—๋Š” ๋”ฐ๋กœ ๊ณ„์‚ฐ์„ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

while(!v[i][j].empty()){
                    auto move_fb = v[i][j][v[i][j].size()-1];
                    v[i][j].pop_back();
                    int nx = (move_fb.r+dx[move_fb.d]*move_fb.s)%N;
                    int ny = (move_fb.c+dy[move_fb.d]*move_fb.s)%N;
                    if(nx <= 0) nx += N;
                    if(ny <= 0) ny += N;
                    move_fb.r = nx; move_fb.c = ny;
                    q.push(move_fb);
                }

์ „๋ถ€ ๋‹ค ์›€์ง์ธ ๊ฒฝ์šฐ์—๋Š” ์ด์ฐจ์› ๋ฒกํ„ฐ์˜ ๋ชจ๋“  ์ธ์ˆ˜๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ„ ์ƒํƒœ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ์ด์œ ๋Š” ์›€์ง์ธ ๋‹ค์Œ ๋ฐ”๋กœ ๋ฒกํ„ฐ์— ๋„ฃ์–ด์ฃผ๋ฉด ํŒŒ์ด์–ด๋ณผ์ด ์—ฌ๋Ÿฌ๋ฒˆ ์ฐธ์กฐ๊ฐ€ ๋˜์–ด ํ•œ๋ฒˆ์ด ์•„๋‹Œ ์—ฌ๋Ÿฌ๋ฒˆ ์›€์ง์—ฌ ์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 ๊ทธ ๋‹ค์Œ์—๋Š” ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ, ๋‘๊ฐœ ์ด์ƒ์˜ ํŒŒ์ด์–ด๋ณผ์ด ์žˆ์„๋•Œ ๋‚˜๋ˆ ์ฃผ๋ฉด ๋œ๋‹ค.

์ด ์—ฐ์‚ฐ์€ ๋”ํ•˜๊ณ , ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ „๋ถ€๋‹ค.

 

๋‹ค๋งŒ ์†๋„๊ฐ€ ๋ชจ๋‘ ํ™€์ˆ˜๋‚˜, ์ง์ˆ˜์ผ ๊ฒฝ์šฐ๋ฅผ ์ฒดํฌํ•ด์ฃผ๋Š”๊ฒƒ์„ ์žŠ์œผ๋ฉด ์•ˆ๋œ๋‹ค.

 

if(v[i][j].size() <=1) continue;
                int ms=0,ds1=0, ds2=0,ss=0,count=v[i][j].size();
                while(!v[i][j].empty()){
                    ms += v[i][j][v[i][j].size()-1].m;
                    if(v[i][j][v[i][j].size()-1].d %2 == 0)
                        ds1 += 1;
                    else
                        ds2 += 1;
                    ss += v[i][j][v[i][j].size()-1].s;
                    v[i][j].pop_back();
                }
                ms /= 5; ss /= count;
                if(ms == 0) continue;
                for(int k=0; k<4; k++){
                    fb divide_fb;
                    divide_fb.r = i; 
                    divide_fb.c = j;
                    divide_fb.m = ms;
                    divide_fb.s = ss;
                    if(ds1==0 || ds2 == 0){
                        divide_fb.d = 2*k;
                    }else{
                        divide_fb.d = 2*k+1;
                    }
                    v[i][j].push_back(divide_fb);
                }

 

 

์ „์ฒด ์ฝ”๋“œ

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
struct fb{
    int r,c,m,d,s;
};
int N,M,K,dx[8]={-1,-1,0,1,1,1,0,-1},dy[8]={0,1,1,1,0,-1,-1,-1};
vector<fb>v[51][51];
int main(){
    cin>>N>>M>>K;
    for(int i=0; i<M; i++){
        fb new_fb;
        cin>>new_fb.r>>new_fb.c>>new_fb.m>>new_fb.s>>new_fb.d;
        v[new_fb.r][new_fb.c].push_back(new_fb);
    }
    while(K--){
        queue<fb>q;
        for(int i=1; i<=N; i++)
            for(int j=1; j<=N; j++){
                if(v[i][j].empty()) continue;
                while(!v[i][j].empty()){
                    auto move_fb = v[i][j][v[i][j].size()-1];
                    v[i][j].pop_back();
                    int nx = (move_fb.r+dx[move_fb.d]*move_fb.s)%N;
                    int ny = (move_fb.c+dy[move_fb.d]*move_fb.s)%N;
                    if(nx <= 0) nx += N;
                    if(ny <= 0) ny += N;
                    move_fb.r = nx; move_fb.c = ny;
                    q.push(move_fb);
                }
            }
        while(!q.empty()){
            v[q.front().r][q.front().c].push_back(q.front());
            q.pop();
        }
        for(int i=1; i<=N; i++)
            for(int j=1; j<=N; j++){
                if(v[i][j].size() <=1) continue;
                int ms=0,ds1=0, ds2=0,ss=0,count=v[i][j].size();
                while(!v[i][j].empty()){
                    ms += v[i][j][v[i][j].size()-1].m;
                    if(v[i][j][v[i][j].size()-1].d %2 == 0)
                        ds1 += 1;
                    else
                        ds2 += 1;
                    ss += v[i][j][v[i][j].size()-1].s;
                    v[i][j].pop_back();
                }
                ms /= 5; ss /= count;
                if(ms == 0) continue;
                for(int k=0; k<4; k++){
                    fb divide_fb;
                    divide_fb.r = i; 
                    divide_fb.c = j;
                    divide_fb.m = ms;
                    divide_fb.s = ss;
                    if(ds1==0 || ds2 == 0){
                        divide_fb.d = 2*k;
                    }else{
                        divide_fb.d = 2*k+1;
                    }
                    v[i][j].push_back(divide_fb);
                }
            }
    }
    int ans = 0;
    for(int i=1; i<=N; i++)
        for(int j=1; j<=N; j++){
            if(v[i][j].empty()) continue;
            for(auto f : v[i][j]){
                ans += f.m;
            }
        }
    cout<<ans;

}

'algorithm' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

BOJ 2056  (2) 2022.10.10
BOJ 5021  (0) 2022.10.10
BOJ 1826  (0) 2022.10.07
BOJ 1174  (0) 2022.10.07
BOJ 14502  (0) 2022.10.07