C++ 알고리즘 기초18 - 반복문 심화2(10의 자리와 1의 자리 구하는 방법 복기)-

1. 조건문 안에 for문 사용

 

두 개의 정수a, b를 입력받아 큰 수부터 작은 수까지 차례대로 출력하는 프로그램을 작성해보세요.

 

a,b를 입력 받은 다음에, a >= b이면, a부터 b까지 for문으로 1을 감소시키면서 출력하고

 

a < b이면, b부터 a까지 for문으로 1을 감소시키면서 출력하고,

 

#include <iostream>
using namespace std;

int main() {
    
    int a,b;

    cin >> a >> b;

    if (a >= b){
        for(int i = a; i >= b; i--){

            cout << i << " ";
        }
    } else {
        for(int i = b; i >= a; i--){
            cout << i << " ";
        }
    }
    return 0;
}

 

 

2. 10의 자리와 1의 자리를 나머지 연산으로 구하기

 

자연수 n을 입력받아 1부터 n까지 369 게임을 진행했을 때의 결과를 출력하는 프로그램을 작성해보세요. 369 게임에서는 숫자가 3의 배수이거나 숫자에 3, 6, 9 중 하나라도 들어가있는 경우에는 0을 출력하고, 그렇지 않다면 해당 숫자를 그대로 출력합니다.

 

1부터 n까지 3으로 나눠봐서 3으로 나누어 떨어지는가? 그러면 0을 출력하고

 

아니라면, 숫자에 3,6,9중 하나라도 들어갔는지 체크

 

일의 자리를 아는 방법은? 10으로 나눈 나머지라는건 알고 있는데..

 

아니 10의 자리를 어떻게 구하지??? 이게 생각이 안나네

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    for(int i = 1; i <= n; i++){

        if(i % 3 == 0){
            cout << 0 << " ";
        } else {
            int r = i % 10;
            if (r == 3 || r == 6 || r == 9){
                cout << 0 << " ";
            } else {
                if(i >= 10){
                    int j = i - r;
                    if (j == 30 || j == 60 || j == 90){
                        cout << 0 << " ";
                    } else {
                        cout << i << " ";
                    }
                } else {
                    cout << i << " ";
                }
            }
        }
    }
    return 0;
}

 

10의 자리는 n을 10으로 나눈 몫으로 구할 수 있다.

 

n을 10으로 나눈 몫에 10을 곱하고, n을 10으로 나눈 나머지를 더하면 n이 되잖아

 

예를 들어 n이 23이라면 n을 10으로 나눈 몫은 2이고 나머지는 3이며

 

3은 n의 일의자리이고 2는 n의 10의 자리이다.

 

n이 두자리 자연수라면 10으로 나눈 몫이 n의 10의 자리인데...

 

두자리가 아니라면, 1의 자리, 10의 자리, 100의자리,... 구하는 방법이..

 

n을 10으로 나눈 몫 q 나머지 r을 구하고

 

r이 n의 1의 자리이며 q를 n으로 갱신

 

위 과정을 반복

 

다시 n을 10으로 나눈 몫이 q2, 나머지가 r2이면.. 

 

r2가 10의자리이고, q2를 n으로 갱신

 

....

 

현재 이 문제는 n이 1이상 100이하니까, n을 10으로 나눈 나머지가 1의 자리이고, 10으로 나눈 몫이 10의 자리가 된다.

 

물론 10으로 나눈 몫이 0이라면 한자리 자연수라는걸 알수 있는거

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    for(int i = 1; i <= n; i++){
        if (i % 3 == 0 || i % 10 == 3 || i % 10 == 6 || i % 10 == 9 || i / 10 == 3 || i / 10 == 6 || i / 10 == 9){
            cout << 0 << " ";
        } else {
            cout << i << " ";
        }
    }
    return 0;
}

 

3. 배수 개수 계산하기

 

0일을 기점으로 2일마다 교실 청소를, 3일마다 복도 청소를, 12일마다 화장실 청소를 합니다. 날짜가 겹치는 날에는 주기가 더 긴 것을 하기로 했습니다. n일간 진행했을 때 각 장소의 청소 횟수를 차례로 출력하는 프로그램을 작성해주세요. 단, 시작 날인 0일에는 청소를 진행하지 않습니다.

 

1부터 n까지 2의 배수의 개수와 3의 배수의 개수, 12의 배수의 개수를 세는 문제인데..

 

여기서 중요한 점은 날짜가 겹치는 날에주는 주기가 더 긴 것을 하기로 한다고 함

 

2의 배수이면서 3의 배수인 6의 경우는 3의 배수에 포함시키고, 2의 배수에는 포함시키지 마라는 말

 

2의 배수이면서 3의 배수이고, 12의 배수인 12는 12의 배수에만 포함시키라는 말..

 

이걸 어떻게 처리해야할까?

 

12의 배수인지 먼저 검사하고, 그렇다면 count하고 끝

 

12의 배수가 아니라면, 3의 배수인지 검사하고, 그렇다면 count하고 끝

 

3의 배수도 아니라면, 2의 배수인지 검사하고 그렇다면 count하고 끝

 

2의 배수도 아니라면 그냥 넘기고

 

#include <iostream>
using namespace std;

int main() {
    // 여기에 코드를 작성해주세요.

    int n;
    cin >> n;

    int count1 = 0;
    int count2 = 0;
    int count3 = 0;

    for(int i = 1; i <= n; i++){
        if (i % 12 == 0){
            count3 += 1;
        } else if (i % 3 == 0){
            count2 += 1;
        } else if (i % 2 == 0){
            count1 += 1;
        }
    }
    cout << count1 << " " << count2 << " " << count3;
    return 0;
}
TAGS.

Comments