프로그래머스 코딩테스트 실전 대비 모의고사 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 |