728x90
반응형
 

프로그래머스

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

programmers.co.kr

정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers의 길이는 2 이상 100 이하입니다.
    • numbers의 모든 수는 0 이상 100 이하입니다.

입출력 예

  numbers                                                                result

[2,1,3,4,1] [2,3,4,5,6,7]
[5,0,2,7] [2,5,7,9,12]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <string>
#include <vector>
#include <algorithm>
 
using namespace std;
 
vector<int> solution(vector<int> numbers) {
    vector<int> answer;
    
    for(int i=0; i<numbers.size(); i++// 예를 들어 [0]을 기준으로
        for(int j=i+1; j<numbers.size(); j++// [1], [2], [3], [4] 각각을 모두 더한다. 
            answer.push_back(numbers[i]+numbers[j]); // 중복 상관 없이 넣는다.
    // [0] -> [1], [2], [3], [4]
    // [1] -> [2], [3], [4]
    // [2] -> [3], [4]
    // [3] -> [4]
    
    sort(answer.begin(), answer.end()); // 정렬
    answer.erase(unique(answer.begin(), answer.end()), answer.end());
    // answer의 처음부터 끝까지 중복된 것들을 answer의 끝쪽으로 보내버리고, 그 끝부터 end() 까지 모두 제거.
    
    return answer;
}
cs
728x90
반응형
728x90
반응형
 

프로그래머스

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

programmers.co.kr

모든 출저는 위임.

 

코딩테스트 연습 - 크레인 인형뽑기 게임

[[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4

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
24
25
26
#include <string>
#include <vector>
#include <stack>
 
using namespace std;
 
int solution(vector<vector<int>> board, vector<int> moves) {
    int answer = 0;
    stack<int> stbasket; // 뽑은 인형을 담는 스택!
    
    for(auto c : moves) // 뽑을 라인!
        for(int r=0; r<board.size(); r++)
            if(board[r][c-1!= 0// 비어져있지 않은 [r][c] 칸이 나오면
            {
                if(!stbasket.empty() && stbasket.top() == board[r][c-1])
                { // 1. 스택에 인형이 있고 2. 스택 제일 위에 인형이 지금 넣으려고하는 인형과 같다면
                    stbasket.pop(); // 넣어봤자 터지므로 그냥 빼고
                    answer+=2// 터진 인형 두 개 증가.
                }
                else // 스택이 비었거나, 넣으려는 인형과 스택 제일 위의 인형이 같지 않다면
                    stbasket.push(board[r][c-1]); // 인형을 넣어준다.
                board[r][c-1= 0// 그리고 board에서 뽑은 인형 자리는 비워준다.
                break// c를 갱신한다.
            }
    return answer;
}
cs
728x90
반응형
728x90
반응형
 

프로그래머스

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

programmers.co.kr

모든 출처는 위 프로그래머스임.

문제 설명

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.

각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항

  • numbers는 길이 1 이상 7 이하인 문자열입니다.
  • numbers는 0~9까지 숫자만으로 이루어져 있습니다.
  • 013은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

입출력 예

numbersreturn

17 3
011 2

입출력 예 설명

예제 #1
[1, 7]으로는 소수 [7, 17, 71]를 만들 수 있습니다.

예제 #2
[0, 1, 1]으로는 소수 [11, 101]를 만들 수 있습니다.

  • 11과 011은 같은 숫자로 취급합니다.

 

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
44
45
46
47
48
49
50
51
52
53
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
 
using namespace std;
 
bool isPrime(int n)
{
    if(n < 2
        return false;
    
    for(int i=2; i<=sqrt(n); i++// 1을 제외하고 2부터 시작해서 목표 n-1까지 돌면서 -> 근데 제곱근까지만 돌면 됨(대칭성)
        if(n % i == 0// 나누어 떨어지면 == 약수가 존재하면 
            return false// 소수가 아님
    
    return true// 소수임
}
 
int solution(string numbers)
{
    int answer = 0;
    vector<char> piece; // 각 숫자를 하나씩 저장하고 한번 저장할 때마다, 수의 조합을 만들어 내도록 한다.
    vector<int> nums; // 각 숫자들로 만들 수 있는 모든 수 집합.
    string temp = "";
    
    
    for(int i=0; i<numbers.size(); i++)
    {
        piece.push_back(numbers[i]); // 하나씩 저장. 1개~size()개 까지.
        sort(piece.begin(), piece.end()); // 시작부터 끝까지 정렬.
        
        do 
        {
            temp.clear(); // 갱신을 위한 초기화
            for(int j=0; j<piece.size(); j++// 주어진 조합에 대해서 만들 수 있는 모든 경우의 수를 만듦.
            {
                temp.push_back(piece[j]);
                nums.push_back(stoi(temp));
            }
        } while (next_permutation(piece.begin(), piece.end())); // 조합을 변형함
    }    
    
    sort(nums.begin(), nums.end()); // 정렬하고, 
    nums.erase(unique(nums.begin(), nums.end()), nums.end()); 
    // unique를 통해 중복되는 값을 nums의 끝으로 보낸다. 그리고 뒤로 보내진 모든 값부터 end()까지 모두 제거.
    
    for(int i=0;i<nums.size();i++)
        if(isPrime(nums[i]) == true)
            answer++;
    
    return answer;
}
cs

 

728x90
반응형
728x90
반응형
 

프로그래머스

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

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
 
using namespace std;
 
string solution(string new_id) {
    string answer = "";
 
    // - 1단계 new_id의 모든 대문자를 대응되는 소문자로 치환합니다.
    for(char& ch : new_id)
        ch = std::tolower(ch); // 대문자를 받으면 소문자로 변환 후 리턴!
    std::cout<<"1단계]"<<new_id<<std::endl;    
    
    // - 2단계 new_id에서 알파벳 소문자, 숫자, 빼기(-), 밑줄(_), 마침표(.)를 제외한 모든 문자를 제거합니다.
    for(char& ch : new_id)
        if((ch >= 'a' && ch <= 'z'|| (ch >= '0' && ch <= '9'|| ch == '-' || ch == '_' || ch == '.' )
            answer.push_back(ch); // 위 조건에 해당되는 문자들만 넣어서 재구성함.
    std::cout<<"2단계]"<<answer<<std::endl;    
    
    // - 3단계 new_id에서 마침표(.)가 2번 이상 연속된 부분을 하나의 마침표(.)로 치환합니다.
    bool prev_dot_flag = false// 이전에 .이 나왔었는지 확인하는 flag -> .이 나오면 일반 문자가 나올 때까지 true 상태.
    new_id = answer; // 갱신
    answer.clear();
    
    for(char& ch : new_id)
    {
        if(ch == '.'// . 이 나오면 연속적으로 .인지, 첫 .인지 확인 후, 첫 점이면 대입하고 이후 나오는 점이면 무시함.
        {
            if(prev_dot_flag == false)
            {
                answer.push_back(ch);
                prev_dot_flag = true;
            }
            continue;
        }
        answer.push_back(ch);
        prev_dot_flag = false;
    }
    std::cout<<"3단계]"<<answer<<std::endl;  
    
    // - 4단계 new_id에서 마침표(.)가 처음이나 끝에 위치한다면 제거합니다.
    
    if(answer.front() == '.'// 처음이 점이면
        answer.erase(0,1);
    
    if(answer.back() == '.'// 끝이 점이면
        answer.erase(answer.size()-1,1);
    std::cout<<"4단계]"<<answer<<std::endl;
    
    // - 5단계 new_id가 빈 문자열이라면, new_id에 "a"를 대입합니다.
    if(answer.empty())
        answer.push_back('a');
    std::cout<<"5단계]"<<answer<<std::endl;
    
    // - 6단계 new_id의 길이가 16자 이상이면, new_id의 첫 15개의 문자를 제외한 나머지 문자들을 모두 제거합니다.
    //        만약 제거 후 마침표(.)가 new_id의 끝에 위치한다면 끝에 위치한 마침표(.) 문자를 제거합니다.
    if(answer.size() >= 16)
    {
        if(answer.at(14== '.')
            answer = answer.substr(014);
        else
            answer = answer.substr(015);
    } // 그냥 15개를 자르고 마지막 answer.back() == '.' 이면 pop_back() 이렇게 처리해도 된다.
    std::cout<<"6단계]"<<answer<<std::endl;
    
    // - 7단계 new_id의 길이가 2자 이하라면, new_id의 마지막 문자를 new_id의 길이가 3이 될 때까지 반복해서 끝에 붙입니다.
    if(answer.size() <= 2)
        while(answer.size() <= 2)
            answer.push_back(answer.back()); // answer += answer.back(); 이렇게도 가능하다.
    std::cout<<"7단계]"<<answer<<std::endl;
    
    return answer;
}
cs

 

728x90
반응형
728x90
반응형
 

프로그래머스

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

programmers.co.kr

 

핵심 문제와 예는 위와 같다. 자연수 n을 넣었을 때, 124나라의 숫자로 변환해주면 되는 문제이다.

1 | 1, 2, 4만을 사용하는 나라? -> 3진법으로 처리
2 | 근데 3진법인데도 0, 1, 2가 아니라, 1, 2, 4이므로 10진수 0부터 10까지 변환해가면서 규칙을 찾아야함.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <string>
#include <vector>
 
using namespace std;
 
string solution(int n) {
    string answer = "";
    string base[3= { "4""1""2" }; // 계산해보면 3진수로 0은 4에 매칭, 1과 2는 그대로.
    
    while(n != 0)
    {
        answer = base[(n%3)] + answer; // 나머지 연산을 통해, 일의 자리부터 구해나감.
        if(n%3 == 0// 만약에 3의 배수를 나누면
            n = (n-1)/3// 몫을 구할 때 하나를 빼야 한다.
        else
            n = n/3
    }
    return answer;
}
cs

base 라는 배열 대신에, answer = "412"[a] + answer; 이런 식으로 풀이한 경우도 있다. "412"[n]은 굉장히 신박했다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

728x90
반응형

'프로그래밍응용 > 오답노트' 카테고리의 다른 글

프로그래머스, 완전탐색, 소수찾기(C++)  (0) 2021.02.22
카카오 2021 문제 - 신규 아이디 추천(C++)  (0) 2021.02.21
다음 큰 숫자  (0) 2021.02.18
문자열 검색  (0) 2021.02.18
두 수 사이 합  (0) 2021.02.18

+ Recent posts