오늘은 2292번 문제를 풀어보겠습니다. 

 

 

1. 중앙의 방 1부터 시작함 

2. 숫자 N이 주어졌을 때 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지 

3. ex) 13까지는 3개. 58은 5개를 지난다.

 

 

문제 풀이 및 소스코드

1. 규칙을 보면 각 0층일 때는 1

2. 1층일 때는 6

3. 2층일 때는 12 

4. 3층일 때는 18 이런 식으로 쭉쭉 증가합니다.  이런 것이 제일 힌트네요?  

 

바로 소스코드를 보시겠습니다. 부족한 부분을 소스를 보면서 채워보도록 하죠.

#include <iostream>

using namespace std;

int main()
{
	int n; 
	cin >> n; // ex) 13입력 

	int sum = 2; 
	int layer = 0; // 층 
	
	if (n == 1) // n이 1이면 layer는 1
		layer = 1;
	while (n >= sum) //  13 >= 2  --- 1,  13 >= 8 
	{
		sum += 6 * (layer++); // 2 = 6 * 0(layer)(후위 layer1), 
        					// 2(sum) = 6 *1(layer)(후위2), 8(sum) = 6 * 2(layer)(g후이 = 20 
        					//  후위 연산자 이기 때문에 while에 들어갔기 때문에 layer은 3이 됩니다. 
	}
	cout << layer << endl;
    
    return 0; 
}

 

 

전위 후위는 위에 사진을 보시면 될 것 같네요. 감사합니다 

안녕하세요 1712 백준알고리즘 문제를 풀어보도록 하겠습니다.

 

문제는 위와 같습니다.

 

매년 임대료, 재산세, 보험료, 급여 등은  = A만원(고정 비용)

재료비, 인건비  = B만원(가변 비용)

 

ex) A = 1000, B = 70이면

노트북 한 대는 총 1070만원

열 대는 1700만원입니다.또한, 손익분기점이 존재하지 않으면 -1을 출력합니다.

 

문제풀이는 다음과 같습니다.

1. 입력을 3개를 받습니다 A>>B>>C를 받고

2. sum = C(170) - B(70)를 뺍니다.  = 100

3. 만약 sum이 0보다 작으면 -1을 출력하고

4. 그렇지 않으면 (A(1000)/sum) + 1 을 출력합니다.

 

소스코드는 다음과 같습니다.

 

#include <iostream>


using namespace std;

int main()
{
    int A, B, C;
    cin >> A >> B >>C;
    int sum;

    sum = C - B; 
    if ( sum <= 0)
    {
        cout<<"-1"<<endl;
    }
    else
    {
        cout<<(A/sum)+1<<endl;

    }
    
}

 

 

안녕하세요 오늘은 백준알고리즘의 10870번을 풀어보도록 하겠습니다.

 

문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.

이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n>=2)가 된다.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

 

 

음,

즉 10을 입력했을 시 55가 출력이 되어야 합니다.

 

소스코드 보시죠

#include <iostream>

using namespace std;

int fib(int num)
{
    if (num == 0 ) 

    {
        return 0;
    }
    else if(num == 1)
    {
         return 1;
    }
    else
    {
        
        return fib(num - 1) + fib(num -2);
    }
    
    
    
}

int main()
{   
    int num;
    cin >> num;
    cout<<fib(num)<<endl;
    return 0;

}

 

풀이

여기서 중요하게 생각할 것이

elese { return fib(num -1 ) + fib(num - 2) } 이 부분입니다.

0이면 0

1이면 1

2 이면  =  그전 숫자와 더해서  1+1 = 2 // 이제 그전숫자와 더해야 된다.

 2 + 3 = 5

5 + 3 = 8

5 + 8 = 13

8 + 13 = 21

21 + 13 = 34

21 + 34 = 55

34 + 55 = 89

 

즉,, fib(3)를 구할 때는

fib(3-2) + fib(3-1) 인데  fib(1) + fib(2) 이다.

 

fib(5)를 구할 떄는

fib(2) + fib(3) 이다.

 

 

안녕하세요 오늘은 나머지 연산에 대해 말씀드리겠습니다. 백준 알고리즘을 참고했습니다.

 

나머지연산

1. 나머지로 출력하라는 문제가 등장할 때

2. (A+B) % M = ((A%M) + (B%M)) % M 

3. (A * B) mod M = ((A mod M) * (B mod M)) mod M

4. 나누기의 경우에는 성립하지 않음(Modular Inverse를 구해야 함)

5. 뺄셈의 경우에는 먼저 mod연산을 한 결과가 음수가 나올 수 있기 때문에 6번과 같이 해야함

6. (A - B) Mod M = ((A mod M) - (B mod M) + M) mod M

ex) (5+2) % 3 = 7 % 3 = 1 , (5 % 3 + 2 % 3) % 3 = 1, (2 + 2) % 3 = 4 % 3 = 1

 

그러면 

(6 % 3 - 5 % 3 ) % 3 = ( 0 - 2 ) % 3 = -2 % 3 = ? 

답이 무엇일까요??? -2 일까요 1 일까요 ?? 

 

 

답 : 프로그램마다 다릅니다. 자바 ,C는 -2가 나오지만 파이썬은 1이 나옵니다.

 

그러면 똑같이 나오게 할려면? 

 

 -> (a - b) % c -> (a % c - b % c + c) % c를 해주면 됩니다. 그러면 똑같은 답이 나옵니다. 

 

 

소수 

소수 : 약수가 1과 자신 밖에 없는 수

 

1.N이 소수가 되려면, 2보다 크거나 같고, 루트N 보다 작거나 같은 자연수로 나누어 떨어지면 안 된다.

이유는? N이 소수가 아니라면, N = a X b로 나타낼 수 있다(a <= b)

 

2. a > b라면 두 수를 바꿔서 항상 a <= b로 만들 수 있다.

3. 두 수 a와 b의 차이가 가장 작은 경우는 루트 N이다.

5. 즉, 루트 N까지만 검사를 해본다. 

 

 

관련 문제 : 소수찾기, 에라토스테네스의 체, 골드바흐의 추측, 팩토리얼 0의 개수 

 

 

이상 포스터를 맞치겠습니다. 

안녕하세요~~ 코딩을 하면서 어떻게 하면 더 재밌 게 할 수 있을까? 라는 생각을 했다가 야구게임을 만들면 재밌을 것 같다는 생각을 해서 야구게임을 만들게 되었습니다.

 

소스코드입니다.

 

#include <iostream>

#include <time.h>  // 랜덤 함수  사용

 

using namespace std;

 

int main(void)

{

int baseball[10] = { };

 

 

 

}#include 
#include  // 랜덤함수 사용
using namespace std;

int main()
{
int baseball[10] = {};

for(int i=0; i<9; i++)
{
baseball[i] = i+1;
}

srand((unsigned int) time(0));
int itemp, idx1, idx2;
for(int i=0; i<100; i++)
{
idx1[i] = rand %9;
idx2[i] = rand % 9;
itemp = basball[idx1];
baseball[idx1] = baseball[idx2];
baseball[idx2] = itemp;
}
int istrlike = 0;
int count = 0;
int iBall = 0;
in iplayer[3] = {};
while(true) 
{
cout<<"3개의 숫자를 입력하시오 <<endl;
cin >> iplayer[0] >> iplayer[1] >> iplayer[2];
if(iplayer[0] < 1 || iplayer[0] > 9 || iplayer[1] < 1 || iplayer[1] > 9 || iplayer[2] < 1 || iplayer[2] > 9)
{ break; }
for(int i=0; i<3; i++) {
for(int j=0; j<3; j++) {
if(baseball[i] == iplayer[j]){
if( i == j) { stlike++; }
else { iBall++; } 


} // end i 
} // end j 
}
count++;
if(istrlike == 3) { cout<<count<<"번 만에 맞췄씁니다"<<endl;  
else{cout << "strlike : "<<istrlike<<"ball : "<<iBall<<endl;  }

istlike = 0; iBall =0; 
}
return 0;

}

 

이상포스터를 마치겠습니다.

+ Recent posts