나 개발자 진짜 되냐?

백준 C++ 1009번 분산처리 ( 일의자리 구하는 법 ) 본문

C++을 시작해봐요!/구현문제를 풀어봤어요!

백준 C++ 1009번 분산처리 ( 일의자리 구하는 법 )

Snow Rabbit 2026. 1. 20. 20:06

 

어제부터 또 흔들리는 나의 마음이었다.

 

일단 힌트를 사용하는 방식을 바꿔보기로 했다.

고민하는 시간을 늘리고! 30분!

메모장에 로직을 한글로 적든, 주석으로 쓰든 하기!

첫 10분은 문제 요구사항 이해하기 + 입출력 예제를 써보기

나머지 20분은 순서대로 처리하는 과정을 머릿속으로 정리하고 주석으로 남기기

 

그리고 제씨에게는

내 생각을 설명하고, 내가 부족한 부분만 부탁하기..ㅎ

코드 상단에 주석으로 설계도를 그리는 연습을 꼭 하라고 하셨다.

그리고 내일 공부 시작 전에 10분동안 아무 도움 없이 다시 풀어보기

근데 못푼다? 그러면 아직 모르는 것이라 다시 풀어봐야 한다.

 

오케이

 

 

오늘 복습 완

 

문제를 풀어볼까요오!!


 

주석까지 생각하며 문제를 풀어봤다.

#include <bits/stdc++.h>
using namespace std;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    // 1. 입력
    int T;
    cin >> T;
   
    for (int i = 0; i < T; i++)
    {
        // 2. 데이터의 개수는 a 의 b 승.. 그러면 int로 해결이 안되나?
        int a, b;
        cin >> a >> b;
        long long ab = 1;
        for (int j = 0; j < b; j++)
        {
            ab *= a;
        }
       
        // 3. 어차피 숫자에서 가장 마지막 번호가 답이 되긴하니까..
        cout << (ab % 10 == 0 ? 10 : ab % 10) << "\n";
    }
}

 

자잔..!

 

근데 이제 보니 그 예제 입력 마지막이 9의 635승이다..

말이 안 되긴 하는데..

 

이게 long long도 안되는 것.. 같은데 흠..

 

근데 곰곰쓰 생각해 보면

9는 뒷자리가 1 아님 9다..

7은 7 9 3 1 순서이다.

흠... 이런 패턴을 활용할 수 있을까?

그래서 생각해 봤다.

1은 무조건 1

2는 2 4 8 6

3은 3 9 7 1

4는 4 6 4 6

5는 무조건 5

6은 무조건 6

7은 7 9 3 1

8은 8 4 2 6

9는 9 1 9 1

10은 무조건 10

 

흠.. 분명 패턴이 있는데.. 말이다..

이거보다 더 효율적인려나?

 

#include <bits/stdc++.h>
using namespace std;

int main(void)
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    // 1. 입력
    int T;
    cin >> T;

    for (int i = 0; i < T; i++)
    {
        // 2. 데이터의 개수는 a 의 b 승.. 그러면 int로 해결이 안되나?
        int a, b;
        cin >> a >> b;
        // 3 - 1. 패턴으로 써보기
        if (a == 4 || a == 9)
        {
            if (b % 2 == 1)
                cout << a << "\n";
            else
            {
                if (a == 4)
                    cout << 6 << "\n";
                else
                    cout << 1 << "\n";
            }
        }
        else if (a == 2 || a == 8)
        {
            if (b % 4 == 2)
                cout << 4 << "\n";
            else if (b % 4 == 3)
            {
                if (a == 2)
                    cout << 8 << "\n";
                else
                    cout << 2 << "\n";
            }
            else if (b % 4 == 0)
                cout << 6 << "\n";
            else
                cout << a << "\n";
        }
        else if (a == 3 || a == 7)
        {
            if (b % 4 == 2)
                cout << 9 << "\n";
            else if (b % 4 == 3)
            {
                if (a == 3)
                    cout << 7 << "\n";
                else
                    cout << 3 << "\n";
            }
            else if (b % 4 == 0)
                cout << 1 << "\n";
            else
                cout << a << "\n";
        }
        else
            cout << a << "\n";
    }
}

 

패턴을 주야장천 써봤다..

답은 분명 나오는데 틀렸단다..

 

두 가지 방법으로 풀었는데도.. 안된다고 해서

결국 제씨를 찾아갔다.

 

음 제씨는 나에게 첫 번째 답과 두 번째 답의 문제점을 하나씩 알려주었다.

 

첫 번째 식의 문제점은 오버플로우

너무 숫자가 큰데 우리는 마지막 숫자만 필요하니까 곱해줄 때마다 10을 나눠주라고 한다.

 

두 번째식의 문제점은 지금 1부터 9일 때까지만 해주고

12일 때? 14일 때? 69일 때? 는?

그래서 이것 또한 10을 나눠줘야 한다.ㅋㅋ

근데 두 번째는 너무 계산식이 복잡하니까 첫 번째로 해주라고 조언받았다.

 

그래도 두 번째식부터 고쳐봤다.

a % 10을 해주고 제출했더니 틀렸단다.

또 왜 그러나 봤더니.. 그거 해줘서 답 0 나오면 어쩔래? 였다.

그래서 또 0일 때는 cout << 10이 되도록 해주었더니..! 성공했다..ㅋㅋㅋ

 

 

저 a % 10은 필수!!

 

 

4랑 9일 때

 

 

2랑 8일 때

 

 

3이랑 7일 때

 

 

나머지 1, 5, 6,10

 

그대로 해주면 되는데 우리는 위에서 10으로 나눠줘서

사실 10은 곧 0이어서

따로 또 추가해 주었다.

 

완성!!

 


 

자 이제 첫 번째로 다시 돌아가볼까!!

 

여전히 % 10만 해주면 된다는 걸?

 

 

이렇게 간단하다고??

 

여전히 틀렸단다.

이만큼 풀어도 아직까지 간과하는 한 가지..

나눴을 때 0이면 어쩔 거냐고!!!!!!

 

아차차!

어제 배운 삼항연산자를 써보겠습니다.

 

바로바로 정답!!


 

여전히 궁금한 질문

과연 내가 푼 방식이 최적의 식일까?!

 

이 친구가 말해주길 진짜 최적의 식이 있다고 한다.

 

무엇인가!!!!!

그것은 바로 첫 번째 식과 두 번째식을 더해준 이 식이요

 

헉!!!!

 

우리는 아까 

1 / 5 / 6 / 10 그대로

4 / 9는 두 번씩

2 / 3 / 7 / 8 은 네 번씩

사실 그럼 이거 굳이 2 8 / 3 7로 안 나눠도 됐겠다..ㅋㅋ

 

그래서 결국 4번씩 반복하면 다 만들 수 있다 이 말..!!

 

자 그러면

먼저 바꿔주는 친구를 만든다

int power = ( b % 4 == 0? 4 : b % 4)

이게 왜 필요하냐! 우리는 for문으로 최대 4번까지 돌릴 건데,

0이면.. 사실 우리는 나누기 0이니까 뭐 맨 끝이겠거니 하지만

컴퓨터에서 0까지는 돌릴 수가 없으니 0일 경우 4라고 해줄 것이다.라는 

삼항연산자를 꼭 넣어줘야 한다.

 

그리고 계산은 같다.

이러면 최대 4번만 하니까? 뭐 600번 해줄 필요 없겠죠!

 

 

자잔!!!

 


 

진짜 끝났다.

ㅇㅅㅇ

오늘은 어제 문제도 복습해 봤고

오늘 문제도.. 진짜 큰?! 도움 없이 풀어서 괜히 뿌듯하다.

 

오늘의 나에게 칭찬하며

내일의 나에게 더 나은 모습을 볼 수 있길..

고생했어!!!