본문 바로가기
프로그래머스

프로그래머스 코딩테스트 실전 대비 모의고사 2차 문제집 22년 07월 27일 14:00 ~ 08월 23일

by 콩순이냉장고 2022. 7. 27.

신청 URL : https://career.programmers.co.kr/competitions/2627

 

코딩테스트 실전 대비 모의고사

접수   22년 07월 13일 10:00 ~ 08월 23일 23:59 테스트   22년 07월 13일 10:00 ~ 08월 23일 23:59

career.programmers.co.kr

 

1번

1번 접근법 : 삼중 for문으로 세개 다더해서 0되는지만 찾으면 그만인 문제입니다. 

사이즈가 너무작아서 삼중 for문으로 그냥 바로 풀어도되지만 실제로 시간복잡도 O(n^2)으로도 풀수있어요

그러나 1번같은건 빨리 풀고 지나가 버리는게 나으니 그냥 O(n^3)으로 바로 코딩하죠

소스코드 : 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//By 콩순이냉장고
#include<bits/stdc++.h>
using namespace std;
 
int solution(vector<int> number) {
    int answer = 0;
    for (int i = 0;i<number.size()-2;i++){
        for (int j = i+1; j < number.size() - 1; j++) {
            for (int k = j + 1; k < number.size(); k++) {
                answer += (number[i] + number[j] + number[k] == 0);
            }
        }
    }
    return answer;
}
cs
 

2번

 

2번 접근법 : 이전 1차 문제집 2번이랑 같은문제입니다. 

map을 이용해도되고 단순 배열 2개를 이용해도되지만 귀찮으니 map을 이용해서 누적합 이용해서 사이즈가 같은지만 확인하기 때문에 매우 생각보다 너무 쉽게 풀려서 당황했습니다.

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//By 콩순이냉장고
#include<bits/stdc++.h>
using namespace std;
 
int solution(vector<int> topping) {
    int answer = 0;
    unordered_map<intint>m1, m2;
    for (int t : topping)m1[t]++;
    for (int t : topping) {
        m1[t]--;
        if (m1[t] == 0)
            m1.erase(t);
        m2[t]++;
        answer += m1.size() == m2.size();
    }
    return answer;
}
cs

3번

 

 

 

 

3번 접근법 : 두노드간의 거리문제입니다. 양방향 노드이기때문에 destination에서 출발해서 

bfs 혹은 다익스트라 둘중 하나 선택해서 한번만  거리구하면 됩니다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//By 콩순이냉장고
#include<bits/stdc++.h>
using namespace std;
 
vector<int> solution(int n, vector<vector<int>> roads, vector<int> sources, int destination) {
    vector<int> answer,check(n+1,-1);
    vector<vector<int>> v(n+1);
    for (vector<int>& r : roads) {
        v[r[0]].push_back(r[1]);
        v[r[1]].push_back(r[0]);
    }
 
    queue<int> q;
    int dist = 0;
    check[destination] = 0;
    q.push(destination);
    while (!q.empty()) {
        int qsize = q.size();
        while (qsize--) {
            int cur = q.front();
            q.pop();
            for (int next : v[cur]) {
                if (check[next] == -1) {
                    q.push(next);
                    check[next] = dist + 1;
                }
            }
        }
        dist++;
    }
    for (int s : sources)answer.push_back(check[s]);
    return answer;
}
cs

 

 

후기 :30분만에 다풀었지만 솔직히 빠른편은 아니다라는 생각듭니다.

읽는속도에서 느리고 이해가 좀느렸다고 생각 하기때문에

이렇게 생각하는 이유는 문제가 지나치게 기초적인 문제였기 때문에

1,2,3번 푸는데 소요한시간입니다.

2차문제집 공개 되서 바로 풀어봤는데 솔직히 이번엔 1차보다 어렵게 냈겠지? 생각했는데

 

문제수도 적고 시간도 적어서 기대했지만 풀고나니 기대가 완전히 실망으로 바뀐 문제집입니다.

1차보다 더 쉽고, 코테 모의고사라고 하기에 민망할 정도수준의 문제집이라 생각됩니다. 

이번꺼는 개인적으로 알고리즘 처음배우는 기초 문제집이라 생각합니다.

 

 

 

 

궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.