no image
프로그래머스/C++ 최소직사각형
문제 설명명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.명함 번호 가로 길이 세로 길이16050 23070 36030 48040 가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 400..
2025.01.31
no image
프로그래머스/C++ 문자열 다루기 기본
문제 설명문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.제한 사항s는 길이 1 이상, 길이 8 이하인 문자열입니다.s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.입출력 예s return"a234"false"1234"true#include using namespace std;bool solution(string s) { // 문자열의 길이가 4 또는 6인지 확인 if (s.length() != 4 && s.length() != 6) { return false; } // 문자열이 숫자로만 구성되..
2025.01.31
no image
프로그래머스/C++ 문자열을 정수로 바꾸기
문제 설명문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.제한 조건s의 길이는 1 이상 5이하입니다.s의 맨앞에는 부호(+, -)가 올 수 있습니다.s는 부호와 숫자로만 이루어져있습니다.s는 "0"으로 시작하지 않습니다.입출력 예예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.#include #include using namespace std;int solution(string s) { long long ans = stoll(s); return ans;}
2025.01.31
no image
프로그래머스/C++ 문자열 나누기
문제 설명문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.제한사항1 ≤..
2025.01.31
no image
프로그래머스/C++ 크기가 작은 부분문자열
문제 설명숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.제한사항1 ≤ p의 길이 ≤ 18p의 길이 ≤ t의 길이 ≤ 10,000t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.입출력 예t p result"3141592""271"2"500220839878""7"8"10203""15"3입..
2025.01.31
no image
프로그래머스/C++ 문자열 내 마음대로 정렬하기
문제 설명문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.제한 조건strings는 길이 1 이상, 50이하인 배열입니다.strings의 원소는 소문자 알파벳으로 이루어져 있습니다.strings의 원소는 길이 1 이상, 100이하인 문자열입니다.모든 strings의 원소의 길이는 n보다 큽니다.인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.입출력 예strings n return["sun", "bed", "car"..
2025.01.31
no image
프로그래머스/C++ K번째수
문제 설명배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.2에서 나온 배열의 3번째 숫자는 5입니다.배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.제한사항array의 길이는 1 이상 100 이하입니다.array의 각 원..
2025.01.31
no image
프로그래머스/C++ 콜차츠 추측
문제 설명1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.제한 사항입력된 수, ..
2025.01.22
반응형

문제 설명

명함 지갑을 만드는 회사에서 지갑의 크기를 정하려고 합니다. 다양한 모양과 크기의 명함들을 모두 수납할 수 있으면서, 작아서 들고 다니기 편한 지갑을 만들어야 합니다. 이러한 요건을 만족하는 지갑을 만들기 위해 디자인팀은 모든 명함의 가로 길이와 세로 길이를 조사했습니다.

아래 표는 4가지 명함의 가로 길이와 세로 길이를 나타냅니다.

명함 번호 가로 길이 세로 길이

1 60 50  
2 30 70  
3 60 30  
4 80 40  

가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다.

모든 명함의 가로 길이와 세로 길이를 나타내는 2차원 배열 sizes가 매개변수로 주어집니다. 모든 명함을 수납할 수 있는 가장 작은 지갑을 만들 때, 지갑의 크기를 return 하도록 solution 함수를 완성해주세요.


제한사항

  • sizes의 길이는 1 이상 10,000 이하입니다.
    • sizes의 원소는 [w, h] 형식입니다.
    • w는 명함의 가로 길이를 나타냅니다.
    • h는 명함의 세로 길이를 나타냅니다.
    • w와 h는 1 이상 1,000 이하인 자연수입니다.

입출력 예

sizes result

[[60, 50], [30, 70], [60, 30], [80, 40]] 4000
[[10, 7], [12, 3], [8, 15], [14, 7], [5, 15]] 120
[[14, 4], [19, 6], [6, 16], [18, 7], [7, 11]] 133

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

명함들을 적절히 회전시켜 겹쳤을 때, 3번째 명함(가로: 8, 세로: 15)이 다른 모든 명함보다 크기가 큽니다. 따라서 지갑의 크기는 3번째 명함의 크기와 같으며, 120(=8 x 15)을 return 합니다.

입출력 예 #3

명함들을 적절히 회전시켜 겹쳤을 때, 모든 명함을 포함하는 가장 작은 지갑의 크기는 133(=19 x 7)입니다.

#include <string>
#include <vector>
#include <algorithm> // max, min

using namespace std;

int solution(vector<vector<int>> sizes) {
    int maxWidth = 0;
    int maxHeight = 0;

    for (const auto& size : sizes) { // sizes의 각 명함 [w, h]
        // 큰 값을 가로로, 작은 값을 세로로 배치
        int w = max(size[0], size[1]);
        int h = min(size[0], size[1]);

        // 가로와 세로의 최대값 갱신
        maxWidth = max(maxWidth, w);
        maxHeight = max(maxHeight, h);
    }

    // 지갑의 최소 크기 계산
    return maxWidth * maxHeight;
}

 

반응형
반응형

문제 설명

문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항

  • s는 길이 1 이상, 길이 8 이하인 문자열입니다.
  • s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

입출력 예

s return

"a234" false
"1234" true
#include <string>
using namespace std;

bool solution(string s) {
    // 문자열의 길이가 4 또는 6인지 확인
    if (s.length() != 4 && s.length() != 6) {
        return false;
    }

    // 문자열이 숫자로만 구성되어 있는지 확인
    for (char c : s) {
        if (!isdigit(c)) {  // 문자가 숫자가 아니면 false 반환
            return false;
        }
    }

    return true;  // 길이가 4 또는 6이고 숫자로만 구성되어 있다면 true 반환
}

isdigit 함수는 C++에서 특정 문자가 숫자인지 확인하는 데 사용하는 함수입니다.

반응형
반응형

문제 설명

문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.

제한 조건

  • s의 길이는 1 이상 5이하입니다.
  • s의 맨앞에는 부호(+, -)가 올 수 있습니다.
  • s는 부호와 숫자로만 이루어져있습니다.
  • s는 "0"으로 시작하지 않습니다.

입출력 예

예를들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.

str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.

#include <string>
#include <vector>

using namespace std;

int solution(string s) {
    long long ans = stoll(s);
    return ans;
}
반응형
반응형

문제 설명

문자열 s가 입력되었을 때 다음 규칙을 따라서 이 문자열을 여러 문자열로 분해하려고 합니다.

  • 먼저 첫 글자를 읽습니다. 이 글자를 x라고 합시다.
  • 이제 이 문자열을 왼쪽에서 오른쪽으로 읽어나가면서, x와 x가 아닌 다른 글자들이 나온 횟수를 각각 셉니다. 처음으로 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리합니다.
  • s에서 분리한 문자열을 빼고 남은 부분에 대해서 이 과정을 반복합니다. 남은 부분이 없다면 종료합니다.
  • 만약 두 횟수가 다른 상태에서 더 이상 읽을 글자가 없다면, 역시 지금까지 읽은 문자열을 분리하고, 종료합니다.

문자열 s가 매개변수로 주어질 때, 위 과정과 같이 문자열들로 분해하고, 분해한 문자열의 개수를 return 하는 함수 solution을 완성하세요.


제한사항

  • 1 ≤ s의 길이 ≤ 10,000
  • s는 영어 소문자로만 이루어져 있습니다.

입출력 예

s result

"banana" 3
"abracadabra" 6
"aaabbaccccabba" 3

입출력 예 설명

입출력 예 #1

s="banana"인 경우 ba - na - na와 같이 분해됩니다.

입출력 예 #2

s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 분해됩니다.

입출력 예 #3

s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 분해됩니다.

#include <string>
using namespace std;

int solution(string s) {
    int answer = 0;
    int i = 0;

    while (i < s.length()) {
        char x = s[i];  // 첫 글자를 x로 설정
        int x_count = 0, other_count = 0;

        // x와 다른 문자의 개수가 같아질 때까지 반복
        while (i < s.length()) {
            if (s[i] == x) {
                x_count++;
            } else {
                other_count++;
            }

            i++;

            // x의 개수와 다른 문자의 개수가 같아지면 분리
            if (x_count == other_count) {
                answer++;
                break;
            }
        }
        
        // 만약 반복문을 나왔는데 x_count와 other_count가 같지 않다면,
        // 남은 문자를 하나의 그룹으로 처리
        if (x_count != other_count) {
            answer++;
        }
    }

    return answer;
}

반응형
반응형

문제 설명

숫자로 이루어진 문자열 t와 p가 주어질 때, t에서 p와 길이가 같은 부분문자열 중에서, 이 부분문자열이 나타내는 수가 p가 나타내는 수보다 작거나 같은 것이 나오는 횟수를 return하는 함수 solution을 완성하세요.

예를 들어, t="3141592"이고 p="271" 인 경우, t의 길이가 3인 부분 문자열은 314, 141, 415, 159, 592입니다. 이 문자열이 나타내는 수 중 271보다 작거나 같은 수는 141, 159 2개 입니다.


제한사항

  • 1 ≤ p의 길이 ≤ 18
  • p의 길이 ≤ t의 길이 ≤ 10,000
  • t와 p는 숫자로만 이루어진 문자열이며, 0으로 시작하지 않습니다.

입출력 예

t p result

"3141592" "271" 2
"500220839878" "7" 8
"10203" "15" 3

입출력 예 설명

입출력 예 #1

본문과 같습니다.

입출력 예 #2

p의 길이가 1이므로 t의 부분문자열은 "5", "0", 0", "2", "2", "0", "8", "3", "9", "8", "7", "8"이며 이중 7보다 작거나 같은 숫자는 "5", "0", "0", "2", "2", "0", "3", "7" 이렇게 8개가 있습니다.

입출력 예 #3

p의 길이가 2이므로 t의 부분문자열은 "10", "02", "20", "03"이며, 이중 15보다 작거나 같은 숫자는 "10", "02", "03" 이렇게 3개입니다. "02"와 "03"은 각각 2, 3에 해당한다는 점에 주의하세요

#include <string>
using namespace std;

int solution(string t, string p) {
    int answer = 0;
    long long p_num = stoll(p);  // p를 정수로 변환

    for (int i = 0; i <= t.length() - p.length(); i++) {
        string substring = t.substr(i, p.length());  // p와 같은 길이의 부분 문자열 추출
        long long sub_num = stoll(substring);  // 부분 문자열을 정수로 변환

        if (sub_num <= p_num) {
            answer++;
        }
    }

    return answer;
}

몰랐던 부분

string을 정수형으로 변환하는 법

  • stoi: string to int의 약자로, 문자열을 int 타입으로 변환합니다.
  • int number = stoi("12345"); // 문자열 "12345"를 정수 12345로 변환
  • stol: string to long의 약자로, 문자열을 long 타입으로 변환합니다.
  • long number = stol("12345"); // 문자열 "12345"를 long 타입 정수로 변환
  • stoll: string to long long의 약자로, 문자열을 long long 타입으로 변환합니다.
  • long long number = stoll("1234567890123"); // 큰 수를 long long 타입으로 변환
  • substr(pos, len): 특정 위치(pos)부터 지정한 길이(len)만큼 부분 문자열을 반환합니다.
반응형
반응형

문제 설명

문자열로 구성된 리스트 strings와, 정수 n이 주어졌을 때, 각 문자열의 인덱스 n번째 글자를 기준으로 오름차순 정렬하려 합니다. 예를 들어 strings가 ["sun", "bed", "car"]이고 n이 1이면 각 단어의 인덱스 1의 문자 "u", "e", "a"로 strings를 정렬합니다.

제한 조건

  • strings는 길이 1 이상, 50이하인 배열입니다.
  • strings의 원소는 소문자 알파벳으로 이루어져 있습니다.
  • strings의 원소는 길이 1 이상, 100이하인 문자열입니다.
  • 모든 strings의 원소의 길이는 n보다 큽니다.
  • 인덱스 1의 문자가 같은 문자열이 여럿 일 경우, 사전순으로 앞선 문자열이 앞쪽에 위치합니다.

입출력 예

strings n return

["sun", "bed", "car"] 1 ["car", "bed", "sun"]
["abce", "abcd", "cdx"] 2 ["abcd", "abce", "cdx"]

입출력 예 설명

입출력 예 1

"sun", "bed", "car"의 1번째 인덱스 값은 각각 "u", "e", "a" 입니다. 이를 기준으로 strings를 정렬하면 ["car", "bed", "sun"] 입니다.

입출력 예 2

"abce"와 "abcd", "cdx"의 2번째 인덱스 값은 "c", "c", "x"입니다. 따라서 정렬 후에는 "cdx"가 가장 뒤에 위치합니다. "abce"와 "abcd"는 사전순으로 정렬하면 "abcd"가 우선하므로, 답은 ["abcd", "abce", "cdx"] 입니다.

#include <string>
#include <vector>

using namespace std;

vector<string> solution(vector<string> strings, int n) {
    // 사용자 정의 정렬 함수 설정
    sort(strings.begin(), strings.end(), [n](const string &a, const string &b) {
        // n번째 문자가 다르면 n번째 문자를 기준으로 비교
        if (a[n] != b[n]) {
            return a[n] < b[n];
        }
        // n번째 문자가 같으면 사전순으로 비교
        return a < b;
    });
    
    return strings;
}

몰랐던것

  • sort(시작 반복자, 종료 반복자, 비교 함수);
  • 람다 함수 [n](const string &a, const string &b) { ... }
    • [n]캡처(capture) 부분입니다. 캡처는 람다 함수가 외부에서 선언된 변수를 사용할 수 있게 해줍니다. 여기서는 **n**을 캡처하여 람다 함수 내부에서 사용할 수 있게 합니다.
    • (const string &a, const string &b): 람다 함수의 매개변수 목록입니다. 여기서는 **const string &a**와 **const string &b**라는 두 개의 string 참조를 매개변수로 받습니다.
    • { ... }: 람다 함수의 본문으로, 두 매개변수 **a**와 **b**를 비교하여 true 또는 **false**를 반환합니다. 이 반환값은 sort 함수가 **a**와 **b**의 순서를 결정하는 데 사용합니다.

그냥 배열 []을 쓰지않고 vector를 쓰는 이유는 배열은 정적배열이고, vector는 동적 배열이다 벡터는 크기를 자유자제로 변하게할수있고, 일반 배열은 크기를 바꿀수없다.

vector<int> a;
a.push_back(10);  // 벡터에 요소 추가 가능
a.resize(5);      // 크기 조절 가능

int arr[5];       // 정적 배열은 크기 변경 불가능
  • vector<int>: 다양한 함수(size()push_back()pop_back()erase()clear()insert())가 제공되므로 사용이 편리하고 기능이 풍부합니다.
  • int[]: 기본적인 인덱스 접근 외에 별도의 메서드가 없습니다. 크기를 확인하려면 **sizeof**를 사용해야 합니다.
반응형
반응형

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

array commands return

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.

[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.

[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

#include <string>
#include <vector>
#include <algorithm> // 정렬에 필요한 헤더

using namespace std;

vector<int> solution(vector<int> array, vector<vector<int>> commands) {
    vector<int> answer;

    // 각 command에 대해 처리
    for (const auto& command : commands) {
        int i = command[0];
        int j = command[1];
        int k = command[2];
        
        // array의 i번째부터 j번째까지 자른 부분을 subArray에 저장
        vector<int> subArray(array.begin() + i - 1, array.begin() + j);
        
        // subArray 정렬
        sort(subArray.begin(), subArray.end());
        
        // k번째 요소를 answer에 추가
        answer.push_back(subArray[k - 1]);
    }
    
    return answer;
}

몰랐던 것들

  • push_back(value)
    • 벡터의 끝에 새로운 요소 **value**를 추가합니다.
    • 코드에서 **answer.push_back(subArray[k - 1]);**로 answer 벡터에 **k**번째 요소를 추가했습니다.
    answer.push_back(subArray[k - 1]);
    
  • begin()과 end()
    • begin(): 벡터의 첫 번째 요소를 가리키는 반복자를 반환합니다.
    • end(): 벡터의 마지막 요소 다음을 가리키는 반복자를 반환합니다.
    • 코드에서 부분 배열을 자를 때 **array.begin() + i - 1**과 **array.begin() + j**를 사용했습니다.
vector<int> subArray(array.begin() + i - 1, array.begin() + j);
  • sort(begin, end)
    • C++의 <algorithm> 헤더에 포함된 함수로, 지정된 범위 **[begin, end)**를 정렬합니다.
    • 코드에서 **sort(subArray.begin(), subArray.end());**로 subArray 벡터의 요소를 정렬했습니다.
    sort(subArray.begin(), subArray.end());
    
반응형
반응형

문제 설명

1937년 Collatz란 사람에 의해 제기된 이 추측은, 주어진 수가 1이 될 때까지 다음 작업을 반복하면, 모든 수를 1로 만들 수 있다는 추측입니다. 작업은 다음과 같습니다.

1-1. 입력된 수가 짝수라면 2로 나눕니다. 1-2. 입력된 수가 홀수라면 3을 곱하고 1을 더합니다. 2. 결과로 나온 수에 같은 작업을 1이 될 때까지 반복합니다.

예를 들어, 주어진 수가 6이라면 6 → 3 → 10 → 5 → 16 → 8 → 4 → 2 → 1 이 되어 총 8번 만에 1이 됩니다. 위 작업을 몇 번이나 반복해야 하는지 반환하는 함수, solution을 완성해 주세요. 단, 주어진 수가 1인 경우에는 0을, 작업을 500번 반복할 때까지 1이 되지 않는다면 –1을 반환해 주세요.

제한 사항

  • 입력된 수, num은 1 이상 8,000,000 미만인 정수입니다.

입출력 예

n result

6 8
16 4
626331 -1

입출력 예 설명

입출력 예 #1

문제의 설명과 같습니다.

입출력 예 #2

16 → 8 → 4 → 2 → 1 이 되어 총 4번 만에 1이 됩니다.

입출력 예 #3

626331은 500번을 시도해도 1이 되지 못하므로 -1을 리턴해야 합니다.


※ 공지 - 2022년 6월 10일 다음과 같이 지문이 일부 수정되었습니다.

  • 주어진 수가 1인 경우에 대한 조건 추가
#include <string>
#include <vector>

using namespace std;

int solution(int num) {
    int count = 0;
    
    while (num != 1) {
        if (count >= 500) { 
            return -1;
        }
        if (num % 2 == 0) {
            num /= 2;
        } else {
            num = num * 3 + 1;
        }
        count++;
    }
    
    return count; 
}

반응형