안녕하세요.

BlockDMask 입니다.


오랜만에..

(새 환경에 적응하느라..

블로그를 하네요.

다시 꾸준히 시작해보겠습니다.

프로그래머스 알고리즘 문제 입니다.

171110 문제 빼먹음 -> 171226 완료


0. 제목


프로그래머스 Level 2 콜라즈 추측

Programmers Level 2 Collatz

C++ 알고리즘 문제



1. 문제 설명


1937년 Collatz란 사람에 의해 제기된 이 추측은, 

입력된 수가 짝수 라면 2로 나누고,

홀수라면 3을 곱하고 1을 더한 다음,

결과로 나온 수에 같은 작업을 1이 될 때까지 반복할 경우 모든 수가 1이 된다는 추측입니다.


예를 들어, 입력된 수가 6 이라면 

6 -> 3 -> 10 -> 5 -> 16 -> 8 -> 4 -> 2 -> 1 이 되어

총 8번 만에 1이 됩니다.

collatz 함수를 만들어 입력된 수가 몇 번 만에 1 이 되는지 반환하면 됩니다.


단, 500번을 반복해도 1이 되지 않는다면 -1 을 반환하면 됩니다.



2. 풀이 과정


parameter로 받은 num을 1이 될때까지 반복문(while)을 돌립니다.

반복문(while)안에서 

조건1 -> 짝수라면 2로 나누고

조건2 -> 홀수라면 3을 곱하고 1을 더하고

조건3 -> 횟수가 500을 반복해도 1이 되지 않은다면 -1 반환.


각 조건을 작성해 주면서

answer(횟수)를 하나씩 더해줍니다.



3. 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
//https://programmers.co.kr/learn/challenge_codes/150
//LEVEL2_collatz
 
#include<iostream>
using namespace std;
 
int collatz(int num)
{
    int answer = 0;
 
    while(num != 1){
        if(answer>=500){
            return -1//조건
        }
 
        if(num%2 == 0//even
        {
            num = num >> 1;   //num /= 2;
        }
        else //odd
        {
            num = (num*3+ 1;
        }
        answer += 1;
 
    }
    return answer;
}
cs



4. 인증



<문제 출처>

https://programmers.co.kr/learn/challenge_codes/150


감사합니다.

'<문제풀이&연습> > [C++] Programmers' 카테고리의 다른 글

[Level 2] 콜라즈 추측  (0) 2017.12.26
[Level 1] 피보나치 수 (반복문)  (3) 2017.12.15
[Level 1] 최대공약수와 최소공배수  (0) 2017.12.14
[Level 1] 행렬의 덧셈  (0) 2017.12.13
[Level 1] 약수의 합  (0) 2017.12.12

안녕하세요

BlockDMask 입니다.

프로그래머스 알고리즘 문제 

C++ 로 풀었습니다.

171109 문제 빼먹음 -> 171215 완료


0. 제목


프로그래머스 Level 1 피보나치 수

Programmers Level 1 Fibonacci

programmers C++ fibonacci



1. 문제 설명


피보나치 수는 

F(0) = 0, F(1) = 1 일때,

2 이상의 n에 대하여

F(n) = F(n-1) + F(n-2) 가 적용되는 점화식 입니다.


2 이상의 n이 입력되었을 때,

fibonacci 함수를 제작하여 n번째 피보나치 수를 반환하면 됩니다.


F(3) = 2

F(15) = 610

을 출력하면 됩니다.



2. 풀이 과정


제가 아는 피보나치 수를 구하는 방법은 

recursive 를 이용한 방법과 반복문을 이용하는 방법 이 있고,

반복문을 이용할때도 앞에 있는 숫자를 저장 하느냐 안하느냐 등등


여러 방법이 있지만


저는 배열을 선언해서 앞에 있는 숫자들을 저장하는 방법으로 문제를 풀었습니다.




3. 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//https://programmers.co.kr/learn/challenge_codes/147
//LEVEL1_fibonacci
 
#include<iostream>
using namespace std;
 
long long fibonacci(int n)
{
    long long * arr = new long long[n+1]; //메모리 할당.
    arr[0= 0;
    arr[1= 1;
    
    for(int i=2; i<=n; i++){    // n번째 피보나치 수를 구해야 하므로 n까지.
        arr[i] = arr[i-1+ arr[i-2];
    }
    
    long long result = arr[n];
    delete []arr;   //메모리 해제
    return result;
}
cs



4. 인증



<문제 출처>

https://programmers.co.kr/learn/challenge_codes/147



한 걸음 한 걸음 꾸준히 공부하겠습니다.

감사합니다.

'<문제풀이&연습> > [C++] Programmers' 카테고리의 다른 글

[Level 2] 콜라즈 추측  (0) 2017.12.26
[Level 1] 피보나치 수 (반복문)  (3) 2017.12.15
[Level 1] 최대공약수와 최소공배수  (0) 2017.12.14
[Level 1] 행렬의 덧셈  (0) 2017.12.13
[Level 1] 약수의 합  (0) 2017.12.12
  1. 2017.12.19 14:02

    비밀댓글입니다

  2. 2017.12.23 13:16

    비밀댓글입니다

  3. 2017.12.25 14:47

    비밀댓글입니다

안녕하세요.

BlockDMask 입니다.

프로그래머스 알고리즘 문제 C++ 언어로 풀어보겠습니다.

171108 문제 빼먹음 -> 171214 완료


0. 제목


프로그래머스 Level 1 최대공약수와 최소공배수

Programmers Level1 GCD & LCM

C++ gcd, lcm



1. 문제 설명


두 수를 입력받아 두 수의 최대공약수(gcd)와 최소공배수(lcm)를 반환해주는

gcdlcm 함수를 완성해 보세요.


배열의 맨 앞에 최대공약수, 그 다음 최소 공배수를 넣어 반환하면 됩니다.


예를 들어 gcdlem(12, 54)가 입력되면, [6, 108]를 반환하면 됩니다.



2. 풀이 과정


swap 함수를 통해서 

항상 파라미터로 받은 a가 큰수가 되도록 하였습니다.


최대공약수(gcd)는 유클리드 알고리즘을 통해서 구하였습니다.

유클리드 알고리즘에 대한 자세한 설명은 [바로가기]에 있습니다.


최소공배수(lcm)은 두 수의 배수중에 가장 작은 값 이므로, 

두 수를 곱한 부분에서 최대 공약수를 나누어 준 값이 최소공배수가 됩니다.

(공통 부분을 없앴으므로)



3. 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//https://programmers.co.kr/learn/challenge_codes/149
//LEVEL1_GCDLCM
 
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
 
void swap(int &a, int &b){
    int tmp = a;
    a = b;
    b = tmp;
}
 
//최대 공약수(유클리드 알고리즘)
//a가 큰 수로.
int gcd(int a, int b){
    if(a<b) swap(a, b);
    while(b!=0){
        int tmp = a%b;
        a = b;
        b = tmp;
    }
    return a;
}
//최소 공배수
int lcm(int &a, int &b){
    return (a*b)/gcd(a, b);
}
 
vector<int> gcdlcm(int a,int b)
{
    vector<int> answer;
    answer.push_back(gcd(a, b));
    answer.push_back(lcm(a, b));
    return answer;
}
cs



4. 인증



<문제출처>

https://programmers.co.kr/learn/challenge_codes/149


감사합니다.

'<문제풀이&연습> > [C++] Programmers' 카테고리의 다른 글

[Level 2] 콜라즈 추측  (0) 2017.12.26
[Level 1] 피보나치 수 (반복문)  (3) 2017.12.15
[Level 1] 최대공약수와 최소공배수  (0) 2017.12.14
[Level 1] 행렬의 덧셈  (0) 2017.12.13
[Level 1] 약수의 합  (0) 2017.12.12

+ Recent posts