[BOJ/20665] λ…μ„œμ‹€ 거리두기, c++

2021. 8. 20. 00:32Β·DEV/PS

πŸ”— 링크

https://www.acmicpc.net/problem/20665

 

20665번: λ…μ„œμ‹€ 거리두기

첫 번째 쀄에 λ…μ„œμ‹€ μ’Œμ„μ˜ 개수 N, λ…μ„œμ‹€ μ˜ˆμ•½μž 수 T, λ―Όκ·œκ°€ μ’‹μ•„ν•˜λŠ” μ’Œμ„ 번호 P κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. (1 ≤ N ≤ 100, 1 ≤ T ≤ 500, 1 ≤ P ≤ N) λ‹€μŒ T 개의 μ€„μ—λŠ” λ…μ„œμ‹€ μž…μ‹€

www.acmicpc.net

🀯 ν•œμ€„ ν›„κΈ°

κ·Έλƒ₯ γ…‘γ…‘ λ…μ„œμ‹€ κ°€μ§€λ§ˆ

🀷 문제

 

πŸ‘©‍πŸ’» 풀이

λŒ€νšŒ μ€€λΉ„λ‘œ Shake! 2020 셋을 ν’€μ–΄λ³΄μ•˜λ‹€. ν™•μ‹€νžˆ λŒ€ν•™λ³„ μ˜ˆμ„ μ „μ„ 거친 μ‚¬λžŒλ“€λ§Œ λ‚˜μ˜€λŠ” λŒ€νšŒλ‹€λ³΄λ‹ˆ λ¬Έμ œκ°€ μ–΄λ €μ› λ‹€ :-(

λŒ€νšŒ λ•Œ κ°€μž₯ λ§Žμ€ μ •λ‹΅λ₯ μ„ λ³΄μœ ν–ˆμ„ 것 같은 A번 문제
μ•„μ•„ λ³΄κΈ°λ§Œν•΄λ„ μ–΄μ§€λŸ¬μ›Œμ§€λŠ” λ¬Έμ œμ΄λ‹€. νžŒνŠΈκ°€ 글도 κΈΈκ³  그림도 λ‚˜μ˜€κ³ 
ν•˜μ§€λ§Œ 읽어보면 사싀 n μˆ˜λ„ ꡉμž₯히 μž‘κ³  κ·Έλƒ₯ bruteforce 둜 λ‹€ 돌렀보면 λœλ‹€. λ‹€λ§Œ,, κ΅¬ν˜„μ΄ 쑰금 λΉ‘μ„ΌνŽΈ? μ²˜μŒμ— μ§€λ ˆ 겁을 λ¨Ήκ³  그리디인가.. ν•˜λ©° 풀이 μƒκ°ν•˜λŠ”λ° μ‹œκ°„μ„ λ„ˆλ¬΄ μŸμ•˜λ‹€.
λ‹€μ–‘ν•œ 풀이 방법이 μ‘΄μž¬ν•  것 같은데 λ‚˜λŠ” timetable[h][m][seat] 3차원 배열을 λ§Œλ“€μ–΄μ„œ ν•΄λ‹Ήμ‹œκ°„μ— ν•΄λ‹Ή seat에 앉아 μžˆλŠ” μ‚¬λžŒμ΄ μ‘΄μž¬ν•œλ‹€λ©΄ 1둜 μ²΄ν¬ν•˜κ³ , λ§ˆμ§€λ§‰μ— κ΄€λ¦¬μžκ°€ 앉을 수 μžˆλŠ” 자리λ₯Ό 찾을 λ•ŒλŠ” timetable[h][m][P] 값이 0일 λ•Œλ§ˆλ‹€ 1λΆ„μ”© 좔가해쀬닀.
time은 μ²˜μŒμ— sort ν•΄μ£Όμ—ˆλ‹€. sortλŠ” μ‹œμž‘μ‹œκ°„μ΄ 먼저인 μ‚¬λžŒλΆ€ν„°, 그리고 μ’…λ£Œμ‹œκ°„μ΄ 더 짧은 μ‚¬λžŒλΆ€ν„°.
seatλ₯Ό κ³ λ₯Όλ•ŒλŠ” ν˜„μž¬ μ‹œκ°„λŒ€μ— μžλ¦¬κ°€ λΉ„μ–΄μžˆλŠ” λͺ¨λ“  seat λ§ˆλ‹€ κ°€μž₯ κ°€κΉŒμ΄ μžˆλŠ” μ‚¬λžŒκ³Όμ˜ 거리λ₯Ό ꡬ해 μ΅œμ’…μ μœΌλ‘œ 이 거리가 κ°€μž₯ λ¨Ό 자리 번호λ₯Ό κ³¨λΌμ£Όμ—ˆλ‹€.
자리 λ²ˆν˜Έκ°€ λ‚˜μ˜€λ©΄ 이제 ν•΄λ‹Ή μ‚¬λžŒμ˜ start time ~ end time κΉŒμ§€ λͺ¨λ“  timetable을 1둜 λ°”κΏ”μ£Όμ—ˆλ‹€.
이 κ³Όμ •μ—μ„œ 사싀 λ‚˜λŠ” ꡉμž₯히 μ§κ΄€μ μœΌλ‘œ μ ‘κ·Όν•œκ±°λΌ μΌ€μ΄μŠ€λ₯Ό 많이 λ‚˜λˆ μ€˜μ•Ό ν–ˆλ‹€. 더 쒋은 방법이 μžˆμ„ 것 κ°™λ‹€.

μž…λ ₯ μ‹œκ°„ 값이 4자리 숫자둜 λ‚˜μ˜€λŠ”λ° /100, mod 100 연산을 톡해 μ‰½κ²Œ μ‹œκ°„κ³Ό 뢄을 ꡬ할 수 μžˆλ‹€.

πŸ’» μ½”λ“œ

//AC
//BOJ 20666 λ…μ„œμ‹€ 거리두기
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <tuple>
using namespace std;
int N, T, P;
int timetable[25][60][101];  // s, m, seat

struct Time{
    int startT;
    int startM;
    int endT;
    int endM;
};

bool cmp (const Time &a, const Time &b) {
    if (a.startT == b.startT) {
        if (a.startM == b.startM) {
            if (a.endT == b.endT) {
                return a.endM < b.endM;
            }
            return a.endT < b.endT;
        }
        return a.startM < b.startM;
    }
    return a.startT < b.startT;
}

auto distance(int index, int h, int m) {
    int distance = 987654321;
    int minIndex = 1;
    for (int i = 1; i <= N; i++) {
        if (index == i)  continue;
        if (timetable[h][m][i]) {
            int d = abs(index - i);
            if(distance > d) {
                distance = d;
                minIndex = i;
            }
        }
    }
    return tuple(distance, minIndex);
}

int findSeat (int h, int m) {
    int index = 1;
    int maxDis = 0; 
    for(int i = 1; i<=N; i++) {
        if (!timetable[h][m][i]) {
            auto[md, mi] = distance(i, h, m);
            if(md > maxDis) {
                maxDis = md;
                index = i;
            }
        }
    }
    return index;
}

vector<Time> v;
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int a, b, res = 0;
    cin >> N >> T >> P;
    for(int i=0; i<T; i++) {
        cin >> a >> b;
        int sT = a / 100;
        int sM = a % 100;
        int eT = b / 100;
        int eM = b % 100;
        v.push_back({sT, sM, eT, eM});
    }
    sort(v.begin(), v.end(), cmp);
    for (Time t: v) {
        int sT = t.startT;  int sM = t.startM;
        int eT = t.endT;    int eM = t.endM;
        int idx = findSeat(sT, sM);
        for(int i = sT; i <= eT; i++) {
            if(sT == eT) {
                for(int j=sM; j < eM; j++) {
                    timetable[i][j][idx] = 1;
                }
                break;
            }
            if(i == sT) {
                for(int j=sM; j<=59; j++) {
                    timetable[i][j][idx] = 1;
                }
            }
            else if(i == eT) {
                for(int j=0; j<eM; j++) {
                    timetable[i][j][idx] = 1;
                }
            }
            else {
                for(int j=0; j<=59; j++) {
                    timetable[i][j][idx] = 1;
                }
            }
        }
    }
    for (int i = 9; i <= 20; i++) {
        for (int j = 0; j <= 59; j++)  {
            if (!timetable[i][j][P]) {
                res += 1;
            }
        }
    }
    cout << res;
    return 0;
}
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€ (μƒˆμ°½μ—΄λ¦Ό)

'DEV > PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ/20218] Parity Constraint Shortest Path, c++  (1) 2021.08.28
[BOJ/20666] 인물이와 μ •μˆ˜, c++  (2) 2021.08.20
[BOJ/11280] 2-SAT - 3, c++  (2) 2021.08.19
[BOJ/17222] μœ„μŠ€ν‚€ 거래, c++  (2) 2021.08.12
[BOJ/13904] 과제, c++  (0) 2021.08.10
'DEV/PS' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [BOJ/20218] Parity Constraint Shortest Path, c++
  • [BOJ/20666] 인물이와 μ •μˆ˜, c++
  • [BOJ/11280] 2-SAT - 3, c++
  • [BOJ/17222] μœ„μŠ€ν‚€ 거래, c++
jobchae
jobchae
λ§ν•˜λŠ” κ°μžμ§€λ§Œ, μ½”λ“œλ₯Ό λ„μ μ΄λŠ” Node.js λ°±μ—”λ“œ κ°œλ°œμžμž…λ‹ˆλ‹€.
  • jobchae
    JOBCHAE
    jobchae
  • 전체
    였늘
    μ–΄μ œ
    • πŸš€ JOBCHAE (182)
      • DEV (151)
        • PS (108)
        • Node.js (12)
        • React (3)
        • docker (1)
        • μž‘λ‹€ν•œ 개발 일지 (21)
        • injection (1)
        • JS, TS (3)
        • DB (2)
      • 좕ꡬ (0)
      • 일상 (19)
      • μ˜ν™” (3)
      • μŒμ•… (8)
  • λΈ”λ‘œκ·Έ 메뉴

    • πŸ’» Github
    • πŸ™‹πŸ» Linkedin
    • πŸ“– λ°©λͺ…둝
  • 링크

    • PS Github
  • 곡지사항

  • 인기 κΈ€

  • νƒœκ·Έ

    개발
    PS
    λ ›μΈ λ½νŽ˜μŠ€ν‹°λ²Œ
    μŠ¬λž™
    react
    μ•Œκ³ λ¦¬μ¦˜
    Nest.js
    μŠ¬λž™λ΄‡
    μš°μ„ μˆœμœ„ν
    회고
    typescript
    μ†νŠΈ
    node.js
    DP
    GitHub
    JavaScript
    λ°±μ€€
    db
    boj
    mongoDB
    λ¦¬μ•‘νŠΈ
    nodejs
    SOPT
    이뢄탐색
    Express
    DFS
    μ•±μžΌ
    BFS
    일상
    μœ„μƒμ •λ ¬
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.5
jobchae
[BOJ/20665] λ…μ„œμ‹€ 거리두기, c++
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”