hyelie
hyelie
Hyeil Jeong
       
글쓰기    관리    수식입력
  • 전체보기 (495)
    • PS (283)
      • Algorithm (28)
      • PS Log (244)
      • Contest (6)
      • Tips (5)
    • Development (52)
      • Java (14)
      • Spring (23)
      • SQL (2)
      • Node.js (2)
      • Socket.io (3)
      • Study (4)
      • Utils (4)
    • DevOps (36)
      • Git (5)
      • Docker (4)
      • Kubernetes (2)
      • GCP (3)
      • Environment Set Up (8)
      • Tutorial (12)
      • Figma (2)
    • CS (74)
      • OOP (7)
      • OS (24)
      • DB (2)
      • Network (24)
      • Architecture (0)
      • Security (2)
      • Software Design (0)
      • Parallel Computing (15)
    • Project (15)
      • Project N2T (5)
      • Project ASG (0)
      • Project Meerkat (1)
      • Model Checking (7)
      • Ideas (2)
    • 내가 하고싶은 것! (34)
      • Plan (16)
      • Software Maestro (10)
      • 취준 (8)
hELLO · Designed By 정상우.
hyelie

hyelie

PS/PS Log

22.06.08. 풀었던 문제들

1. 추석 트래픽

생각보다 간단한 문제였음. 로그 갯수가 바뀌는 위치 : 각 로그의 시작점 또는 끝점이다. 또한 greedy하게 시작점은 탐색할 필요가 없는 게, 앞에서 이미 탐색되는 위치이기 때문(끝점 탐색하면서) 따라서 끝점만 탐색하면 된다. 끝점 기준으로 +1초 탐색하면 됨

​

​

2. 셔틀버스

시간이 작기 때문에 그냥 시뮬레이션 돌려도 된다. 시간 뒤에서부터 탐색, 탈 수 있으면 break, 못타면 계속 탐색.

탐색 시 crew의 대기시간이 버스도착시간보다 크면 bus index 증가, 그렇지 않으면 bus값에 1 빼줌. 그러고 만약 bus가 가득 차면 bus index++. 이 때, '나'의 시간이 crew 시간보다 작고 버스 도착시간보다 작다 -> 나는 버스에 탈 수 있다. (크루 도착시간이 오름차순)

// 셔틀버스

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <map>

using namespace std;

int stringToMinute(string s){
    return 60 * stoi(s.substr(0, 2)) + stoi(s.substr(3, 2));
}

string timeToString(int t){
    int hour = t/60;
    string shour;
    if(hour == 0){
        shour = "00";
    }
    else if(hour < 10){
        shour = "0" + to_string(hour);
    } else{
        shour = to_string(hour);
    }
    
    int minute = t%60;
    string sminute;
    if(minute == 0)
        sminute = "00";
    else if(minute < 10){
        sminute = "0" + to_string(minute);
    } else{
        sminute = to_string(minute);
    }
    
    return shour + ":" + sminute;
    
}

string solution(int n, int t, int m, vector<string> timetable) {
    vector<int> crews;
    int firstBusArriveTime = stringToMinute("09:00");
    int lastBusArriveTime = firstBusArriveTime + (n-1) * t;
    for(string s : timetable){
        int crewArriveTime = stringToMinute(s);
        if(crewArriveTime > lastBusArriveTime) continue;
        crews.push_back(crewArriveTime);
    }
    sort(crews.begin(), crews.end());
    
    for(int objectTime = lastBusArriveTime + 1; objectTime >= 0; objectTime--){
        bool flag = false;
        vector<int> bus(n, m);
        if(objectTime == 541){
            cout<<"CHECK"<<endl;
        }
        for(int ci = 0, bi = 0; ci < crews.size() && bi < n; ci++){
            int busArriveTime = firstBusArriveTime + t * bi;
            if(crews[ci] <= busArriveTime){
                if(crews[ci] > objectTime && objectTime <= busArriveTime){
                    flag = true;
                    break;
                } else{
                    bus[bi]--;
                }
            } else{
                ci--; bi++;
                if(bi >= n) break;
            }
            if(bus[bi] == 0){
                bi++;
            }
        }
        for(int bi = 0; bi < n; bi++){
            int busArriveTime = firstBusArriveTime + t * bi;
            if(objectTime <= busArriveTime && bus[bi] > 0){
                flag = true;
                break;
            }
        }
        if(flag) return timeToString(objectTime);
    }
    
    
    return timeToString(0);
}

 

3. 합승 택시 요금

처음엔 벨만-포드로 풀고 경로를 저장해서 풀려 했는데 벨만포드는 O(VE) 반면 플로이드-와샬은 O(V^3)이기 때문에 size 200 내에선 충분히 풀 수 있었다. 따라서 플로이드-와샬 사용

​

​

4. 퍼즐 조각 채우기

귀찮은 문제다. 짜야 하는 함수들만

table에서 모든 조각을 가져오는 함수

조각들을 90도 rotate시키는 함수

1의 개수를 count하는 함수

두 조각이 match인지 검사하는 함수

이렇게 짜야 한다.

이렇게 짜면 쉽게 구할 수 있는데, game_board와 table에서 조각들을 가져오고 이 조각들을 n * m으로 2중포문으로 돌리면 된다. 다만 돌릴 때 table_part는 회전가능하므로 회전한 것도 검사할 것. 만약 matching이라면 해당 조각을 table_parts에서 지운다.

약간 깔끔하게 잘 짠 것 같다.

// 자물쇠와 열쇠

#include <string>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

vector<vector<int>> rotate(vector<vector<int>> m){
    vector<vector<int>> a(m[0].size(), vector<int>(m.size()));
    
    for(int r = 0; r<a.size(); r++){
        for(int c= 0; c<a[0].size(); c++){
            a[r][c] = m[c][m[0].size()-1-r];
        }
    }
    return a;
}

bool isMatching(vector<vector<int>>& nlock, int sr, int sc, int num_slot, vector<vector<int>>& key){
    int nlocksize = nlock.size(), keysize = key.size();
    int cnt = 0;
    for(int r = 0; r < keysize; r++){
        for(int c = 0; c<keysize; c++){
            if(nlock[sr + r][sc + c] == 2) continue;
            if(nlock[sr + r][sc + c] == 1 && key[r][c] == 1) return false;
            if(nlock[sr + r][sc + c] == 0 && key[r][c] == 0) return false;
            if(nlock[sr + r][sc + c] == 0 && key[r][c] == 1) cnt++;
        }
    }
    return cnt == num_slot;
}

bool solution(vector<vector<int>> key, vector<vector<int>> lock) {
    // keysize <= locksize
    int keysize = key.size(), locksize = lock.size(), nlocksize = locksize + 2 * keysize - 2;
    vector<vector<int>> nlock(nlocksize, vector<int>(nlocksize, 2));
    int num_slot = 0;
    for(int r = 0; r<locksize; r++){
        for(int c = 0; c<locksize; c++){
            nlock[r + keysize-1][c + keysize-1] = lock[r][c];
            if(lock[r][c] == 0)num_slot++;
        }
    }
    
    vector<vector<vector<int>>> keys;
    keys.push_back(key);
    for(int i = 0; i<4; i++){
        keys.push_back(rotate(keys[keys.size()-1]));
    }
    
    
    for(int lr = 0; lr < nlocksize - keysize + 1; lr++){
        for(int lc = 0; lc < nlocksize - keysize + 1; lc++){
            for(int i = 0; i<4; i++){
                bool result = isMatching(nlock, lr, lc, num_slot, keys[i]);
                if(result) return true;
            }
        }
    }
    
    return false;
}
​

'PS > PS Log' 카테고리의 다른 글

22.06.10. 풀었던 문제들  (0) 2022.06.23
22.06.09. 풀었던 문제들  (0) 2022.06.23
22.06.07. 풀었던 문제들  (0) 2022.06.23
22.06.06. 풀었던 문제들  (0) 2022.06.23
22.06.05. 풀었던 문제들  (0) 2022.06.23
    hyelie
    hyelie

    티스토리툴바