본문 바로가기
프로그래머스 C++/Level.0

프로그래머스 C++ Level. 0 짝수는 싫어요

by yeni_0224 2023. 3. 18.
728x90
반응형

나도 너 시러요

정수 n이 매개변수로 주어질 때, n 이하의 홀수가 오름차순으로 담긴 배열을 return하도록 solution 함수를 완성해주세요.

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n) {
    vector<int> answer;
    for(int i = 0; i <= n; i ++){
        if(i % 2 == 1){
           answer.push_back(i);
        }
    }
    return answer;
}

짧은 식으로 끝낼 수 있는 방법은 push_back 함수를 사용하는 것이다.

n 이하의 수 중에서 홀수를 리턴해야하기 때문에

n의 갯수만큼 반복문을 사용하여 갯수를 세어준다.

그 안에서 홀수의 조건을 달아주어 결과값을 리턴하면 되는데..

 

배열 answer을 출력해내기 위해서는 일단 배열의 사이즈가 얼마나 되는지 사전에 선언해줘야한다. 그런데 우리는 배열의 갯수를 미리 알 수 없고, n에 의해 정해지는 배열의 사이즈에 맞게 배열 "answer"을 출력해줘야한다. 그렇기 때문에 answer을 선언할적에는 따로 제한을 두지 않다가, 조건식 안에서 배열에 값을 넣어주는 그 순간에 배열을 하나씩 추가하면 된다.

딱 이 지점을 생각할적에 동적으로 배열을 만들어서 값을 넣어주면 되지 않을까 했는데 new를 사용하여 동적으로 배열을 사용해 값을 넣어주기에는 이 문제가 level 0의 초반부가 아닌가..! 그래서 작성한 답안은 push_back 함수를 사용하는 것이었다. push_back은 값을 배열의 뒤쪽부터 집어넣어주는 함수이다. 그래서그런가, 이 문제의 다른 풀이에서도 push_back 함수가 많이 등장했다. 


<push_back 함수에 대한 복습은 여기!>

2023.03.09 - [프로그래머스 Level.0] - 프로그래머스 C++ Level. 0 배열 두 배 만들기

 

프로그래머스 C++ Level. 0 배열 두 배 만들기

정수 배열 numbers가 매개변수로 주어집니다. numbers의 각 원소에 두배한 원소를 가진 배열을 return하도록 solution 함수를 완성해주세요. #include using namespace std; vector solution(vector numbers) { for(int i = 0; i

yeni-0224.tistory.com


하지만 코린이인 나는 궁금했다. 정말 정석대로 문제를 해결할 수 있는 방법이!!!

 

그래서 도움을 받아보았다. 무작정 답을 알려달라고 하지는 않았다. 그리고 이 부분에 대해 알려준 요정님도 답을 알려주지 않으셨다. 내가 생각해낼 수 있도록 인내하고 기다려주신 요정님께 감사..❤

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int n) {
    int a;      
    if(n % 2 ==0) //n이 짝수면 n/2
    {
     a = n / 2;  
    }
    else if(n % 2 ==1) //n이 홀수면 n/2 + 1
    {
     a = n / 2 + 1; 
    }
    //배열 갯수 알아내기 위한 변수 a
     vector<int> answer(a);    
    //n이하의 홀수를 찾아내려고 반복 
    //n = 0, n이하, 0 % 2= 0 
    //i = 1, n이하, 1%2= 1, answer[0] = 1
    //i = 2, n이하, 2%2 = 0 
    //i =3, n이하, 3% 2 = 1 answer[1] = 3 answer[2] = 5
    for(int i = 0; i <= n; i ++){
        if(i % 2 == 1){
           answer[i / 2] = i;
        }
    }
    return answer;
}

힘들었다.. 생각해내는 그 과정이..! 그래서 이 조건식에서 내가 출력하고 있는 값은 뭔데, 내가 무엇을 반복하고 있는데, 무엇을 카운팅 하고 있는데..! 이 생각의 흐름이 끊기지 않고 다음으로 연결시키는 그 과정이 쉽지 않았다. 생각하면서 요정님께 제송하다고 해따.. 생각해내는데 오래 걸리기도 하고 주석처리가 된 부분이 늘어난 것처럼, 계속 생각했기 때문이다.

 

일단, 배열의 갯수를 사전에 정해줘야했다. n이하의 홀수 배열을 리턴해줘야하기 때문이다. 배열은 출력해주려면 일단 사전에 사이즈가 얼마나 되는지 알려줘야한다. 그래서 그 배열의 사이즈를 지정해주기 위해 사전에 조건식을 달아주었다.

 

a : 배열의 사이즈를 알려줄 변수이다.

 int a;      
    if(n % 2 ==0) //n이 짝수면 n/2
    {
     a = n / 2;  
    }
    else if(n % 2 ==1) //n이 홀수면 n/2 + 1
    {
     a = n / 2 + 1; 
    }

왜 n이 짝수인 경우와 홀수인 경우를 나누어주었는가.

n이 10일때 : n은 짝수이고, 10 이하의 홀수의 갯수는 10 / 2개 총 5개이며 이걸 다시 식으로 표현하면 n / 2 개이다.

n이 15일때 : n은 홀수이고, 15이하의 홀수 갯수는 15 / 2개 총 8개이며 이걸 식으로 바꾸어 표현하면 n / 2 + 1개이다.

(규칙성을 더 확인하고 싶다면 n에 다른 수를 대입하여 갯수를 세어보길 바란다. 이런거 평소에 생각 안하고 살았던 사람으로서 신기하긴 하더라) 그래서 저 조건식 안에서 a의 값에 대한 정보를 알려주었고, 그 값을 vector answer의 사이즈로 지정해주었다.

    //배열 갯수 알아내기 위한 변수 a
     vector<int> answer(a);

그 다음 n 이하의 홀수를 찾고 배열을 출력해야했는데, 어떤 값을 i로 잡고, 출력할 값은 어떻게 잡아야하나 고민을 열심히 했다. 코린이는 이렇게 단순하게 보이는 것도 어렵따. 요정님께서 반복문에 값을 하나씩 넣어보라고 하셨다. 역시 일단 주석으로 적어봐야한다. 여러분도 생각이 안나면 일단 적어라.

 //n = 0, n이하, 0 % 2= 0 
    //i = 1, n이하, 1%2= 1, answer[0] = 1
    //i = 2, n이하, 2%2 = 0 
    //i =3, n이하, 3% 2 = 1 answer[1] = 3 answer[2] = 5
    
    for(int i = 0; i <= n; i ++){
        if(i % 2 == 1){
           answer[i / 2] = i;
        }
    }
    return answer;

갯수를 세어주고, 그 값이 문제에서 원하는 값이 맞는지 비교해보려면 무조건 반복문은 사용해줘야하는데.. 일단 홀수를 출력해야하니까 홀수이어야 한다는 조건문은 달아줬는데.. 이게 내가 i로 설정한게 어떠한 값인지.. 그래서 이게 출력하고자 하는 값인건지..

1. 내가 작성한 반복문의 i에 0부터 3까지의 값을 넣어서 계산했다.

2. 좌측의 배열처럼 출력하려면, 몇번째 인덱스에 어떤 값이 들어가야하는지 적어보고, 내가 계산했던 결과 값과 입출력 예와 비교해주었다.

그랬더니 인덱스 값과, result에 적혀있는 값과의 상관관계가 보였다.

배열의 인덱스 값은  i값의 약 절반정도 하였다. 그렇다면 인덱스의 값은 2로 나누어줘야하는데,

i의 자료형은 int로서 소숫점 부분은 빠지고 정수 부분만 출력된다. 그러므로 그냥 2로 나누어주기만 하면, 우리가 도출해내고자 하는 값들을 리턴할 수 있다.

 

이제 점점 풀이가 길어진다..

 

728x90
반응형