기록 보관소

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

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

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

JongHoon 2024. 2. 1. 23:28

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

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

 

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

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

school.programmers.co.kr


프로그래머스 코딩 기초 트레이닝 : 조건에 맞게 수열 변환하기 1

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

 

프로그래머스

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

programmers.co.kr


문제 설명

정수 배열 arr가 주어집니다.

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱합니다.

그 결과인 정수 배열을 return 하는 solution 함수를 완성해 주세요.


제한사항

  • 1 ≤ arr의 길이 ≤ 1,000,000
    • 1 ≤ arr의 원소의 값 ≤ 100

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    
    for (auto num : arr) {
        if (num >= 50 && num % 2 == 0)
            answer.push_back(num / 2);
        else if (num < 50 && num % 2 != 0)
            answer.push_back(num * 2);
        else
            answer.push_back(num);
    }
    
    return answer;
}
// 다른 사람의 풀이 : 삼항연산자로 해결하는 방법

#include <vector>
using namespace std;

vector<int> solution(vector<int> arr) {
    for(auto& i : arr) 
        i = (i & 1) ? (i < 50 ? i << 1 : i) : (i >= 50 ? i >> 1 : i);
    return arr;
}
// 다른 사람의 풀이 : answer에 넣지 않고 arr을 바로 return 하는 방법

#include <string>
#include <vector>

using namespace std;

vector<int> solution(vector<int> arr) {
    vector<int> answer;
    for(auto &n : arr){
        if(n & 1){
            if(50 > n) n *= 2;
        }else{
            if(50 <= n) n /= 2;
        }
    }
    return arr;
}

결과


프로그래머스 코딩 기초 트레이닝 : 조건에 맞게 수열 변환하기 2

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

 

프로그래머스

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

programmers.co.kr


문제 설명

정수 배열 arr가 주어집니다.

arr의 각 원소에 대해 값이 50보다 크거나 같은 짝수라면 2로 나누고, 50보다 작은 홀수라면 2를 곱하고 다시 1을 더합니다.

이러한 작업을 x번 반복한 결과인 배열을 arr(x)라고 표현했을 때, arr(x) = arr(x + 1)인 x가 항상 존재합니다.

이러한 x 중 가장 작은 값을 return 하는 solution 함수를 완성해 주세요.

단, 두 배열에 대한 "="는 두 배열의 크기가 서로 같으며, 같은 인덱스의 원소가 각각 서로 같음을 의미합니다.


제한사항

  • 1 ≤ arr의 길이 ≤ 1,000,000
    • 1 ≤ arr의 원소의 값 ≤ 100

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> arr) {
    int answer = 0;
    vector<int> temp;
    
    while (temp != arr) {
        temp = arr;
        
        for (auto &num : arr) {
            if (num >= 50 && num % 2 == 0)
                num /= 2;
            else if (num < 50 && num % 2 != 0) {
                num *= 2;
                num++;
            }
        }
        
        answer++;
    }
    
    return (answer - 1);
}

결과


프로그래머스 코딩 기초 트레이닝 : 1로 만들기

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

 

프로그래머스

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

programmers.co.kr


문제 설명

정수가 있을 때, 짝수라면 반으로 나누고, 홀수라면 1을 뺀 뒤 반으로 나누면, 마지막엔 1이 됩니다.

예를 들어 10이 있다면 다음과 같은 과정으로 1이 됩니다.

  • 10 / 2 = 5
  • (5 - 1) / 2 = 4
  • 4 / 2 = 2
  • 2 / 2 = 1

위와 같이 4번의 나누기 연산으로 1이 되었습니다.

정수들이 담긴 리스트 num_list가 주어질 때, num_list의 모든 원소를 1로 만들기 위해서 필요한 나누기 연산의 횟수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • 3 ≤ num_list의 길이 ≤ 15
  • 1 ≤ num_list의 원소 ≤ 30

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> num_list) {
    int answer = 0;
    
    for (auto &num : num_list)
        while (num != 1) {
            if (num & 1) {
                num--;
                num /= 2;
            }
            else
                num /= 2;
            answer++;
        }
    
    return answer;
}
// 다른 사람의 풀이 : 홀짝을 구분하지 않고(int형은 2로 나눠도 홀짝 결과가 같음)해결하는 방법

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> num_list) {
    int answer = 0;
    for(int num : num_list)
    {
        while(num != 1)
        {
            num /= 2;
            answer++;
        }
    }
    return answer;
}

결과


프로그래머스 코딩 기초 트레이닝 : 길이에 따른 연산

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

 

프로그래머스

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

programmers.co.kr


문제 설명

정수가 담긴 리스트 num_list가 주어질 때, 리스트의 길이가 11 이상이면 리스트에 있는 모든 원소의 합을 10 이하이면 모든 원소의 곱을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ num_list의 길이 ≤ 20
  • 1 ≤ num_list의 원소 ≤ 9
  • num_list의 원소를 모두 곱했을 때 2,147,483,647를 넘는 입력은 주어지지 않습니다.

입출력 예

입출력 예
입출력 예 설명


코드

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> num_list) {
    int answer = 0;
    
    if (num_list.size() > 10)
        for (auto num : num_list)
            answer += num;
    else {
        answer = 1;
        for (auto num : num_list)
            answer *= num;
    }
    
    return answer;
}
// 다른 사람의 풀이 : 삼항 연산자와 accumulate()함수로 해결하는 방법

#include <bits/stdc++.h>
using namespace std;

int solution(vector<int> l) {
    return l.size() >= 11 ? accumulate(l.begin(), l.end(), 0) : accumulate(l.begin(), l.end(), 1, multiplies<int>());
}

결과


프로그래머스 코딩 기초 트레이닝 : 원하는 문자열 찾기

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

 

프로그래머스

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

programmers.co.kr


문제 설명

알파벳으로 이루어진 문자열 myString과 pat이 주어집니다.

myString의 연속된 부분 문자열 중 pat이 존재하면 1을 그렇지 않으면 0을 return 하는 solution 함수를 완성해 주세요.

단, 알파벳 대문자와 소문자는 구분하지 않습니다.


제한사항

  • 1 ≤ myString의 길이 ≤ 100,000
  • 1 ≤ pat의 길이 ≤ 300
  • myString과 pat은 모두 알파벳으로 이루어진 문자열입니다.

입출력 예

입출력 예
입출력 예 설명


코드

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

using namespace std;

int solution(string myString, string pat) {
    transform(myString.begin(), myString.end(), myString.begin(), ::tolower);
    transform(pat.begin(), pat.end(), pat.begin(), ::tolower);
    return (myString.find(pat) != string::npos);
    
}

결과


여담

2번째로 풀었던 문제인 '조건에 맞춰 수열 변환하기 2'은 문제를 잘못 이해하고 배열의 원소를 비교하는 줄 알아서 시간을 낭비한걸 제외하면 큰 어려움은 없었다. 예 설명에서 arr(5), arr(6)을 arr[5], arr[6]으로 보는 바람에...