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.08.14. 풀었던 문제들

프로그래머스 코딩테스트 실전 대비 모의고사 2회

1번

 3중포문으로 간단하게 풀면 되는 문제

int solution(vector<int> number) {
    int answer = 0;

    int n = number.size();
    for(int i = 0; i<n; i++){
        for(int j = i + 1; j<n; j++){
            for(int k = j + 1; k<n; k++){
                if(number[i] + number[j] + number[k] == 0) answer++;
            }
        }
    }

    return answer;
}

 

2번

 map으로 숫자 세면 되는 문제. 가운데 기준으로 2개의 window를 두고, middle point를 하나씩 오른쪽으로 옮겨가면서 right map에 있는 leftmost toppoing을 left map으로 옮기고, map의 크기 비교를 하면 된다.

int solution(vector<int> toppings) {
    map<int, int> left, right; // left : 왼쪽 조각의 토핑, right : 오른쪽 조각의 토핑
    // 초기 상태 : 안 자른 상태, right에 다 넣음
    for(int topping : toppings){
        if(right.find(topping) == right.end()){
            right[topping] = 1;
        } else{
            right[topping]++;
        }
    }

    int answer = 0;
    // middle pointer를 옮겨가면서 right 중 leftmost topping을 1개씩 left로 옮길 것.
    for(int topping : toppings){
		if (right[topping] == 1){ // right 중 leftmost 삭제
			right.erase(topping);
		}
		else{
			right[topping]--;
		}

		if (left.find(topping) == left.end()){ // 그것을 left에 삽입
			left[topping] = 1;
		}
		else{
			left[topping]++;
		}

		if(left.size() == right.size()) answer++;
    }

    return answer;
}

 

3번

 문제는 조금 꼬아져서 나와 있지만, destination으로부터 dijkstra를 취하면 되는 문제.

// weight가 작은 것을 pq의 탑으로
struct cmp{
    bool operator()(pii &a, pii &b){
        if(a.second == b.second) return a.first < b.first;
        else return a.second > b.second;
    }
};

vector<int> solution(int n, vector<vector<int>> roads, vector<int> sources, int destination) {
    vector<vector<int>> edges(n+1); // edges[i] : vertex i의 edge들
    for(vector<int>& edge : roads){
        int from = edge[0], to = edge[1];
        edges[from].push_back(to);
        edges[to].push_back(from);
    }

    int INF = 99999999;
    vector<int> dist(n+1, INF);
    dist[destination] = 0;

    priority_queue<pii, vector<pii>, cmp> pq; // .first : vertex, .second : weight
    pq.push({destination, 0});
    while(!pq.empty()){
        pii cur = pq.top(); pq.pop();
        for(int adj : edges[cur.first]){
            if(dist[adj] > dist[cur.first] + 1){
                dist[adj] = dist[cur.first] + 1;
                pq.push({adj, dist[adj]});
            }
        }
    }

    vector<int> answer;
    for(int source : sources){
        answer.push_back(dist[source] == INF ? -1 : dist[source]);
    }
    return answer;
}

// destination으로부터 모든 점까지 dijkstra 쓰면 될 것 같은데?

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

22.08.16. 풀었던 문제들  (0) 2022.08.16
22.08.15. 풀었던 문제들 *** vector erase, remove  (0) 2022.08.15
22.08.13. 풀었던 문제들  (0) 2022.08.13
22.08.12. 풀었던 문제들 - Codeforces #805 Div. 3 4/7  (0) 2022.08.13
22.08.11. 풀었던 문제들  (0) 2022.08.13
    hyelie
    hyelie

    티스토리툴바