[알고리즘]프로그래머스 0528

정제철·2023년 5월 27일
0

알고리즘

목록 보기
2/12
post-thumbnail

📢1.분수의 덧셈

  • 문제 설명
    첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

  • 제한사항
    0 <numer1, denom1, numer2, denom2 < 1,000

  • 입출력 예
    numer1 denom1 numer2 denom2 result
    1 2 3 4 [5, 4]
    9 2 1 3 [29, 6]

✍내풀이

#include <vector>

using namespace std;

vector<int> solution(int numer1, int denom1, int numer2, int denom2) {
    
    int ja = numer1*denom2 + denom1*numer2;
    int mo = denom1*denom2;
    vector<int> answer = {ja, mo};
    for(int i = mo; i>1;i--)
    {
        if(ja%i==0 && mo%i==0)
        {
            answer.at(0)= (ja/i);
            answer.at(1)= (mo/i);
            break;
        }
    }
    return answer;
}

첫째날에 분수 덧셈 문제를 풀어보려고 들어갔었는데 '분수를 풀어낼 때' 약분을 어떤식으로 해야할지 막막해서 문제를 뒤로 미뤘었다.
그리고 시간이 지나 4일차인 오늘 문제를 풀어보는데 그간 머리 로직을 정리해서 그런지 쉽게 문제를 풀 수 있었다. 이제는 vector를 사용하는 것이나 for문 조건을 바꿔서 설정하는 것이 어렵지 않게 되었다.

📢2.나누어 떨어지는 숫자 배열

  • 문제 설명
    array의 각 element 중 divisor로 나누어 떨어지는 값을 오름차순으로 정렬한 배열을 반환하는 함수, solution을 작성해주세요.
    divisor로 나누어 떨어지는 element가 하나도 없다면 배열에 -1을 담아 반환하세요.

  • 제한사항
    arr은 자연수를 담은 배열입니다.
    정수 i, j에 대해 i ≠ j 이면 arr[i] ≠ arr[j] 입니다.
    divisor는 자연수입니다.
    array는 길이 1 이상인 배열입니다.

  • 입출력 예


arr |divisor | return
[5, 9, 7, 10] | 5 | 5, 10
[2, 36, 1, 3] | 1 | [1, 2, 3, 36][3,2,6] | 10 | [-1]


✍내풀이

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

using namespace std;

vector<int> solution(vector<int> arr, int divisor) {
    vector<int> answer={};
    for(auto i : arr)
    {
        if(i % divisor == 0)
        {
            answer.push_back(i);
        }
    }
    if(answer.empty()==true) return {-1};
    else sort(answer.begin(),answer.end());
    return answer;
}

📍empty(), sort()

✂배울점

return answer.empty() ? vector<int>(1, -1) : answer;
  • empty()함수는 기본적으로 true, false값을 지니므로 삼항연산자로 구성할 수 있다.

📢3.음양 더하기

  • 문제 설명
    어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

  • 제한사항
    absolutes의 길이는 1 이상 1,000 이하입니다.
    absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
    signs의 길이는 absolutes의 길이와 같습니다.
    signs[i] 가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

✍내풀이

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> absolutes, vector<bool> signs) {
    int answer = 0;
    for(int i = 0; i<absolutes.size();i++)
    {
        if(signs[i]==false) absolutes[i]*=-1;
        answer+=absolutes[i];
    }    
    return answer;
}

📢4.수박수박수박수?

  • 문제 설명
    길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

  • 제한 조건
    n은 길이 10,000이하인 자연수입니다.

  • 입출력 예
    n return
    3 "수박수"
    4 "수박수박"

✍내풀이

#include <string>

using namespace std;

string solution(int n) {
    string answer = "";
    string x = "수";
    string y = "박";
    for(int i = 1; i<=n;i++)
    {
        if(i&1) answer+=x;
        else answer +=y;
    }
    return answer;
}

짝수를 구하는 코드에는 비트연산자를 사용하여 if(i&1)를 사용하는 것이 익숙해졌다.

✂배울점

 i & 1 ? answer += "박" : answer += "수";

모든 것을 삼항연산자로 쉽게 가능할지 고민해봐야 할 것이다.

profile
성공의 반대는 실패가 아닌 도전하지 않는 것이다.

0개의 댓글