| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 바킹독알고리즘
- c#프로그래머스기초문법
- c#코딩기초트레이닝
- c# c#프로그래머스
- c#코테
- 유니티3dui
- unity3d
- unity3d게임만들기
- Unity
- c#문제
- 유니티공부
- 유니티게임만들기
- c#
- 유니티
- 오블완
- 백준
- 백준코테
- 티스토리챌린지
- unity게임
- 유니티서바이벌게임만들기
- 바킹독
- 백준 C++
- c#기초문법
- 백준코딩테스트
- 백준 구현문제
- unity3dservival
- c#기본문법
- C#문법
- 백준 c++ 공부
- unity게임만들기
- Today
- Total
나 개발자 진짜 되냐?
백준 C++ 1009번 분산처리 ( 일의자리 구하는 법 ) 본문

어제부터 또 흔들리는 나의 마음이었다.
일단 힌트를 사용하는 방식을 바꿔보기로 했다.
고민하는 시간을 늘리고! 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번 해줄 필요 없겠죠!

자잔!!!
진짜 끝났다.
ㅇㅅㅇ
오늘은 어제 문제도 복습해 봤고
오늘 문제도.. 진짜 큰?! 도움 없이 풀어서 괜히 뿌듯하다.
오늘의 나에게 칭찬하며
내일의 나에게 더 나은 모습을 볼 수 있길..
고생했어!!!
'C++을 시작해봐요! > 구현문제를 풀어봤어요!' 카테고리의 다른 글
| 백준 C++ 1032번 명령 프롬프트( fill ) (2) | 2026.01.22 |
|---|---|
| 백준 C++ 15829번 Hashing ( mod M, 시그마란? ) (1) | 2026.01.21 |
| 백준 C++ 9506번 약수들의 합 ( 제곱근, 완전수 ) (2) | 2026.01.19 |
| 백준 C++ 11005번 진법 변환 2 ( reverse, 몫과 나머지 ) (0) | 2026.01.16 |
| 백준 C++ 25305번 커트라인 ( sort, nth_element ) (1) | 2026.01.15 |
