기록 보관소

[프로그래머스] 코딩 기초 트레이닝 PART 8(C++) 본문

코딩 테스트/프로그래머스

[프로그래머스] 코딩 기초 트레이닝 PART 8(C++)

JongHoon 2024. 1. 15. 23:28

프로그래머스  코딩 테스트 연습 : 코딩 기초 트레이닝(C++)

https://school.programmers.co.kr/learn/challenges?order=recent&languages=cpp&partIds=44139&page=2

 

코딩테스트 연습 | 프로그래머스 스쿨

개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!

school.programmers.co.kr


프로그래머스 코딩 기초 트레이닝 : 간단한 논리 연산

https://school.programmers.co.kr/learn/courses/30/lessons/181917

 

프로그래머스

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

programmers.co.kr


문제 설명

boolean 변수 x1x2x3x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.

  • (x1 ∨ x2) ∧ (x3 ∨ x4)

입출력 예

입출력 예
입출력 예 설명

코드

#include <string>
#include <vector>

using namespace std;

bool solution(bool x1, bool x2, bool x3, bool x4) {
    return (x1 || x2) && (x3 || x4);
}

결과


프로그래머스 코딩 기초 트레이닝 : 주사위 게임 3

https://school.programmers.co.kr/learn/courses/30/lessons/181916

 

프로그래머스

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

programmers.co.kr


문제 설명

1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다.

네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.

  • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
  • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
  • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
  • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
  • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.

네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 abcd로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.


제한 사항

  • abcd는 1 이상 6 이하의 정수입니다.

입출력 예

입출력 예
입출력 예 설명

코드

#include <string>
#include <vector>
#include <cstdlib>
#include <map>

using namespace std;

int solution(int a, int b, int c, int d) {
    map<int, int> m;
    m[a]++; m[b]++; m[c]++; m[d]++;
    
    if (m.size() == 1)
        return 1111 * a;
    else if (m.size() == 2) {
        bool isPair = false;
        int q = 0;
        int p = 0;
        
        for (auto it = m.begin(); it != m.end(); it++) {
            if (it->second == 2) {
                if (p == 0)
                    p = it->first;
                else if (it->first != p)
                    q = it->first;
                isPair = true;
            }
            else if (it->second == 3)
                p = it->first;
            else
                q = it->first;
        }
        
        if (!isPair)
            return (10 * p + q) * (10 * p + q);
        else
            return (p + q) * abs(p - q);
    }
    else if (m.size() == 3) {
        int q = 0;
        int r = 0;
        
        for (auto it = m.begin(); it != m.end(); it++)
            if (it->second == 1) {
                if (q == 0)
                    q = it->first;
                else
                    r = it->first;
            }
        
        return q * r;
    }
    else {
        vector<int> arr = {a, b, c, d};
        int min = 7;
        for (int num : arr)
            if (num < min)
                min = num;
        
        return min;
    }
}
// 다른 사람의 풀이 1 : vector를 이용하는 방법

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

using namespace std;

int solution(int a, int b, int c, int d) {
    int answer = 0;

    vector<int> table(6);
    table[a-1]++;    table[b-1]++;    table[c-1]++;    table[d-1]++;
    vector<vector<int>> nums(5);    
    nums[table[0]].emplace_back(1);
    nums[table[1]].emplace_back(2);
    nums[table[2]].emplace_back(3);
    nums[table[3]].emplace_back(4);
    nums[table[4]].emplace_back(5);
    nums[table[5]].emplace_back(6);

    if(!nums[4].empty())    
    {
        return 1111*nums[4][0];
    }
    else if(!nums[3].empty())    
    {
        return pow(10*nums[3][0]+nums[1][0],2);
    }
    else if(nums[2].size() == 2)    
    {
        return (nums[2][0]+nums[2][1])*abs(nums[2][0]-nums[2][1]);
    }
    else if(nums[2].size() == 1)
    {
        return nums[1][0]*nums[1][1];
    }
    else
    {
        return *min_element(nums[1].begin(),nums[1].end());
    }

    return answer;
}
// 다른 사람의 풀이 2 : if-else문으로 해결한 방법

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(int a, int b, int c, int d) {

    if(a == b && b == c && c == d) return 1111*a;
    else if (a == b && b == c) return (10*a+d)*(10*a+d);
    else if (b == c && c == d) return (10*b+a)*(10*b+a);
    else if (c == d && d == a) return (10*c+b)*(10*c+b);
    else if (d == a && a == b) return (10*d+c)*(10*d+c);
    else if (a == b && c == d) return (a+c)*abs(a-c);
    else if (a == c && b == d) return (a+d)*abs(a-d);
    else if (a == d && b == c) return (a+b)*abs(a-b);
    else if (a == b) return c*d;
    else if (a == c) return b*d;
    else if (a == d) return b*c;
    else if (b == c) return a*d;
    else if (b == d) return a*c;
    else if (c == d) return a*b;
    else return min(a, min(b, min(c, d)));
}

결과


프로그래머스 코딩 기초 트레이닝 : 글자 이어 붙여 문자열 만들기

https://school.programmers.co.kr/learn/courses/30/lessons/181915

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다.

my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.


제한 사항

  • 1 ≤ my_string의 길이 ≤ 1,000
  • my_string의 원소는 영소문자로 이루어져 있습니다.
  • 1 ≤ index_list의 길이 ≤ 1,000
  • 0 ≤ index_list의 원소 < my_string의 길이

입출력 예

입출력 예
입출력 예 설명

코드

#include <string>
#include <vector>

using namespace std;

string solution(string my_string, vector<int> index_list) {
    string answer = "";
    
    for (int index : index_list)
        answer += my_string[index];
    
    return answer;
}

결과


프로그래머스 코딩 기초 트레이닝 : 9로 나눈 나머지

https://school.programmers.co.kr/learn/courses/30/lessons/181914

 

프로그래머스

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

programmers.co.kr


문제 설명

음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.

이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.


제한 사항

  • 1 ≤ number의 길이 ≤ 100,000
  • number의 원소는 숫자로만 이루어져 있습니다.
  • number는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.

입출력 예

입출력 예
입출력 예 설명

코드

#include <string>
#include <vector>

using namespace std;

int solution(string number) {
    int answer = 0;
    
    for (int i = 0; i < number.size(); i++)
        answer += number[i] - '0';
    
    return answer % 9;
}

결과


프로그래머스 코딩 기초 트레이닝 : 문자열 여러 번 뒤집기

https://school.programmers.co.kr/learn/courses/30/lessons/181913

 

프로그래머스

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

programmers.co.kr


문제 설명

문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다.

queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다.

my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.


제한 사항

  • my_string은 영소문자로만 이루어져 있습니다.
  • 1 ≤ my_string의 길이 ≤ 1,000
  • queries의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < my_string의 길이를 만족합니다.
  • 1 ≤ queries의 길이 ≤ 1,000

입출력 예

입출력 예
입출력 예 설명

코드

#include <string>
#include <vector>

using namespace std;

string solution(string my_string, vector<vector<int>> queries) {
    for (auto query : queries) {
        string temp = "";
        
        for (int i = 0; i <= query[0] - 1; i++)
            temp += my_string[i];
        
        for (int i = query[1]; i >= query[0]; i--)
            temp += my_string[i];
        
        for (int i = query[1] + 1; i < my_string.size(); i++)
            temp += my_string[i];
        
        my_string = temp;
    }
    
    return my_string;
}
// 다른 사람의 풀이 1 : reverse 함수를 사용한 방법 1

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string my_string, vector<vector<int>> queries) {
    for(const auto& q : queries)
    {
        reverse(my_string.begin()+q[0],my_string.begin()+q[1]+1);
    }
    return my_string;
}
// 다른 사람의 풀이 2 : reverse 함수를 사용한 방법 2

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

string solution(string my_string, vector<vector<int>> queries) {
    string answer = my_string;
    for(auto i : queries)
        reverse(answer.begin()+i[0],answer.begin()+i[1]+1);
    return answer;
}

결과


여담

이번 문제 대부분은 무난하게 해결했지만, 주사위 게임 3은 조금 어려웠다.

정확히는 어렵다기보단, 바로 map으로 접근은 했지만 중간에 size가 2인 경우(주사위가 3개/1개로 같거나 2개/2개로 같은 경우)를 좀 더 깔끔하게 만들고 싶었던 욕심에 계속 고민하고 고치다가 미궁에 빠진 느낌이었다.

결국 정공법으로 if-else를 한 것보다 더 더럽게 해결한 것같아서 아쉬웠다..