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

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

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

신청 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번 문제  접근법 : 

두수  0~9까지의 수들을 새서 

공통된 개수는 가장 작은 개수를 리턴받아 가장 큰수를 만드는 알고리즘 문제입니다.

9부터 집어넣으면 되겠죠?

그러나 예외는 맨앞의 수가 0이라면 000으로 만들어진 수니까 0으로 만들줘야하는거

만든수가 없다면 -1로 예외처리해주면 됩니다.

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
using namespace std;
string solution(string X, string Y) {
    string answer = "";
    int number1[10= { 0 };
    int number2[10= { 0 };
    for (char c : X)number1[c - '0']++;
    for (char c : Y)number2[c - '0']++;
    for (int i = 0; i < 10; i++)
        number1[i] = min(number1[i], number2[i]);
    for (int i = 9; i >= 0; i--) {
        while (number1[i]--)
            answer += to_string(i);
    }
    if (answer.empty())return"-1";
    if (answer[0== '0')return "0";
    return answer;
}
cs

 

2번

 

2번문제 접근법 : map을 이용한 투포인터 문제입니다.

정확히 10개맞췄기때문에 투포인터를 굳이 사용하지 않아서 노가다적으로 풀어도 되지만 

빠르게 풀기위해 투포인터로 풀었습니다.

프로그래머스 카카오 2020 인턴 문제인 보석 쇼핑이랑 매우 똑같더군요

문제 URL : https://school.programmers.co.kr/learn/courses/30/lessons/67258

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀어본사람은 쉽게 풀수있다고 생각합니다. 

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<bits/stdc++.h>
using namespace std;
int solution(vector<string> want, vector<int> number, vector<string> discount) {
    int answer = 0;
    unordered_map<stringint> m;
    unordered_map<stringint> point;
    for (int i = 0; i < want.size(); i++)
        m[want[i]] = number[i];
 
    int left = 0;
    for (int i = 0; i < 10; i++)
        point[discount[i]]++;
    answer += (m == point);
    for (int i = 10; i < discount.size(); i++) {
        point[discount[left]]--;
        if (point[discount[left]] == 0)
            point.erase(discount[left]);
        point[discount[i]]++;
        answer += (m == point);
        left++;
    }
    return answer;
}
cs

 

3번

 

3번문제 접근법 : 

스택을이용한 시뮬문제입니다. 

그렇지만 전 스택보단 백터를 이용했지만

보조컨테이너벨트에 항상 물건을 집어넣고 거기뒤에 있는 순서가 현재 넣어야하는 순서가 맞으면 트럭에 집어넣으면 되는문제입니다.

 

소스코드 : 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<bits/stdc++.h>
using namespace std;
 
int solution(vector<int> order) {
    int answer = 0;
    vector<int> v,truck;
    int left = 0;
    for (int i = 1; i <= order.size(); i++) {
        v.push_back(i);
        while (!v.empty() && left<order.size()&&order[left]==v.back()) {
            truck.push_back(v.back());
            v.pop_back();
            left++;
        }
    }
    return truck.size();
}
cs

 

4번

 

4번문제 접근법 : 전수조사 문제입니다.

위의 행을 누르면 한줄이 바뀌고 다시 그것을누르면  원상태로 돌아옵니다. 

즉 n*m 사이즈라면 2^n *2*m = 2^(n+m) 의 상태를 가질수 있는 얘기 입니다.  해당 몇번눌러서 target과 같은지

조사합니다.  최악의경우 사이즈가 최대 10, 2^10*2^10 = 약 100만 그리고 target 10*10 =100 이기에

100만 *100은 1억까지 가는 연산을 하지만  1초가 나오긴하지만 실제 1억번 연산한다해도 1초가 나오는게아닌

4억번을 연산해야 1초가 나옵니다.

그래서 모든경우의수를 조사했습니다.

bfs,dfs, 다가능 합니다.  그렇게 화려하게 코드를 짜는짓은 저는 잘못해서 비트마스크를 이용한 전수 조사를 하는 코드를 짜게 됐습니다.

 

소스코드 : 

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
34
35
36
37
38
39
40
41
42
43
#include<bits/stdc++.h>
using namespace std;
void rowreverse(int h,int n,vector<vector<int>> &temp) {
    for (int i = 0; i < n; i++) {
        if (h & (1 << i)) {
            for (int j = 0; j < temp[i].size(); j++)
                temp[i][j] = !temp[i][j];
        }
    }
}
void colreverse(int h,int n, int m, vector<vector<int>>& temp) {
    for (int i = 0; i < m; i++) {
        if (h & (1 << i)) {
            for (int j = 0; j < n; j++)
                temp[j][i] = !temp[j][i];
        }
    }
}
int bitcount(int h) {
    if (h == 0)return 0;
    return h % 2 + bitcount(h / 2);
}
int solution(vector<vector<int>> beginning, vector<vector<int>> target) {
    int answer = 0;
    int n = beginning.size();
    int m = beginning[0].size();
    if (beginning == target)
        return 0;
    int res = 1e8;
    for (int i = 0; i < (1 << n); i++) {
        vector<vector<int>> temp = beginning;
        rowreverse(i, n, temp);
        for (int j = 0; j < (1 << m); j++) {
            vector<vector<int>> temp2 = temp;
            colreverse(j, n, m, temp2);
            if (temp2 == target) {
                res=min(res,bitcount(i) + bitcount(j));
            }
        }
    }
 
    return res == 1e8 ? -1 : res;
}
cs

 

 

 

프로그래머스에서 무료로 코테 모의고사란 문제를 신청받길래  풀어봤습니다.

4문제에 3시간을 줬지만 새벽에 풀어서그런가 생각보다 머리가 잘 돌아가더군요

다풀고나니 1시간 20분이 넘게  시간이 남아서 좀 놀랬습니다. 

개인적으로 문제가 쉬웠던 것 같지만 대충 코테는 이것보다 더 어려우니 많은 공부를 하시길 바랍니다.

3,4번 문제에서 막히시는분도 분명있을거라 생각들기에 올려봤습니다.

 

궁금한점 혹은 모르는점은 댓글 부탁드립니다.