문제
https://www.acmicpc.net/problem/1075
오늘은 파이썬을 익히기 위한 브론즈 문제. 그런데 이걸 푸는 과정에서 이상한 일을 겪었다.

창을 양 옆으로 띄워놓고 코테 문제를 풀려고 했는데, for을 입력하자마자 자동 완성이 뜨는 게 아닌가.
range가 정확히 100인 거나, n과 f를 다루는 수식이 %인 게 수상했는데, 완전 자동완성 시킨 후 돌려보니 정확히 저 문제에 대한 정답이었다.

원인은 코파일럿이었는데, ctrl + shift + p -> Copilot: Disable Inline Suggestion으로 비활성화시켜놨다.
사실 가장 궁금한 건 어떻게 코파일럿이 다른 창(크롬)에 띄워둔 문제를 읽고, 해석해서 코드를 추천했는지다. 내가 이런 약관에 동의한 기억은 없는데... 깃허브나 VS Code 설치 시에 안 읽고 넘긴 게 있는 걸까.
크롬 창을 읽어왔어도, 화면 전체를 스크린샷으로 찍었어도, 개인정보 보안이 찜찜한 건 매한가지다.
1. 첫 번째 풀이
사고 과정
여튼, 그건 그거고. 이제 저 코드를 지우고 맨땅에서 다시 시작해보자.
시간 제한도 2초에 메모리도 128MB인 거보면, 단순 노가다로도 금방 풀릴 것 같다.
n의 끝자리에 00부터 99까지 하나씩 대입해보고, f로 나눠보면 되겠지. 그러려면 우선 n의 뒷 두자리를 날려야 한다.
그 후 0부터 1까지 더해보고, 나눠지는 값을 찾으면 종료. 한 자리 수라면 앞에 0을 붙이면 된다.
가장 원시적인 형태로 제출해보자.
코드
n = int(input())
f = int(input())
n -= (n % 100)
for i in range(100):
if ((n + i) % f == 0):
break;
if(i < 10):
i = '0' + str(i)
print(i)
결과

큰 무리없이 성공했다.
아니 잠깐, 지금보니 for문 밖에서 i를 어떻게 쓴 거지?!
2. 마지막 풀이
사고 과정
하지만 파이썬의 장점, 코딩테스트에서 파이썬이 1황인 이유는 수많은 함수들과 간결한 코드 아니겠는가.
이제 코파일럿의 코드를 참고해, 새로운 함수들을 익혀보자.


먼저, 함수와 관련없는 코드 최적화 부분이다.
n의 뒷자리를 미리 날리지 말고, if문 안에서 그때그때 날릴 수 있다. 연산량이 빡빡하면 모를까, 지금처럼 넘쳐날 땐 이편이 코드 적는 시간이 줄어든다.
둘째로, break 후 for문 밖에서 마무리하지 말고, 발견한 즉시 print하고 끝낼 수 있다.
마지막으로, i가 한 자리 수일 때 if문으로 처리하는 대신, {i:02d}로 자릿수를 지정하거나, zfill로 자릿수를 정해줄 수 있다. 후자의 경우는 i값이 직접 변하는 거겠지만.
[파이썬] 문자열 특정 값으로 채우기 - zfill(), rjust(), ljust()
1. zfill ex = "1234" print(ex.zfill(5)) # 결과: 01234 print(ex.zfill(6)) # 결과: 001234 print(ex.zfill(7)) # 결과: 0001234 zfill()은 문자열 형태에서 지정한 길이만큼 0을 채워줍니다. 단, 지정한 길이는 기존 문자열의 길
seokii.tistory.com
위 블로그와 제미나이에서 찾아본 결과, zfill과 rjust, ljust는 각각 다음과 같다.
zfill (Zero fill)
문자열 왼쪽을 0으로 채운다. 문자열이 지정한 값보다 길면 그대로 유지되고, 부호가 있다면 부호 뒤에 채워진다.
int를 다루는 것 같지만 문자열로 다룬다는 점에 유의해야 한다.
변수(a) 뒤에 a.zfill(숫자)로 쓴다.
rjust (Right Justify)
Justify는 컴공에선 정렬로 쓰인다. 우측 정렬.
정렬하고 남은 자리엔, 사용자가 입력한 문자로 채운다. 예를 들어 a.rjust(5, '0')으로 쓰면, 5칸 안에서 a를 우측 정렬하고, 남은 왼쪽 칸엔 0을 채운다.
ljust (Left Justify)
위와 동일. 오른쪽을 채운다.
속도는 당연히 f{i:02d} (이걸 f-string, Formatted String이라고 한단다. 앞에 f가 붙는 게 그 이유)가 빠르다. 원본 값을 바꾸지 않고, 컴파일 시 해석되기에 오버헤드가 없다고. 만약 변수 자체를 바꿔야 한다면 zfill을 사용하거나, f-string을 그대로 대입하면 된다고 한다.
이외에도 f-string에 신기한 기능이 많던데, 자세한 건 아래 블로그들을 참고하자. C#의 $가 여기선 f로 쓰인다.
[Python] f 문자열 포매팅 (f-string formatting)
문자열 포매팅이란, 문자열 안에 어떤 값이나 변수 따위를 삽입하는 방법을 말한다. 그 중에서도 f 문자열 포매팅 (이하 f-sting) 은 파이썬 3.6 버전 이후에 등장한 기능이다. f-string 의 사용 방법을
axis.tistory.com
[WIP]대한민국에서 가장 자세한 f-string 가이드
대한민국에서 가장 자세한 Python의 f-string에 대한 가이드 여러분이 이미 Python의 f-string에 대해 알고 있을지라도, 이 글은 그 기능과 사용법에 대해 최대한 많은 정보를 제공하려고 합니다. f-string
soypablo.tistory.com
코드
n = int(input())
f = int(input())
for i in range(100):
if (n - n % 100 + i) % f == 0:
print(f'{i:02d}')
break
결과

시간이 유의미하게 빨라졌다. 코드를 짧게 쓰는 게 단순 간결해지는 것 말고도, 속도에도 어느정도 영향을 미치나보다. 인터프리터라 그런가?
가장 효율적인 코드
https://www.acmicpc.net/source/84152496
백준 네모 카드 안 나오는 거 좀 불편하네. 여튼 이번엔 yujeong55님의 코드를 참고했다.
내 코드와 비교
여기서 눈여겨볼 코드는
print(str(n)[-2:])
부분이다. []는 배열의 그것과 같으며, 이 안에 들어가는 건 흔히 아는 인덱싱이다.
파이썬은 여기에 슬라이싱을 함께 쓸 수 있다. ':'으로 나눠서, 단순히 배열의 한 값이 아닌 범위를 출력할 수 있다.
더 신기한 건 '-' 연산자인데, 이걸 쓰면 끝에서부터 셀 수 있다. -1은 맨 끝 자리, -2는 맨 끝에서 두번째 자리. 0부터가 아닌 이유는 0이 시작 원소기 때문이겠지.
즉, 위에서 사용한 []를 해석하면
맨 끝에서 2번째 자리부터, 끝까지 잘라라가 된다. (숫자를 생략하면 처음/끝이 된다.)
n이 int기에, 배열로 취급하려 string으로 바꿨다. (0으로 안 채웠는데 왜 통과됐는지는 미스터리)
하나 더
그리고 기술의 발전에 따라, 제미나이에게도 한번 물어봤는데, 반복문을 안 쓰는 방법이 존재한다.
방법은 정말 단순해서, 조금 더 생각해봤다면 쉽게 찾았을 법도 하다. 나머지가 생기는 게 문제라면, 그 수치만큼 빼거나 더하며 ㄴ된다.
- 2자리만 바꿔야 하므로, 기존처럼 n의 뒤쪽 2자리를 00으로 밀어버린다.
- n을 f로 나눠, 나머지를 계산한다.
- (f - 나머지) 만큼 더해서, 즉 나온 나머지에 더하면 f가 되는 수를 찾아서 더한다.
- 그럼 나머지가 f가 되며 사라진다.
아주 심플한 방법이다. 바로 코드로 옮겨보자.
코드
n = int(input())
f = int(input())
n = (n // 100) * 100
mod = n % f
print(f"{((f - mod) % f):02d}")
마지막에 % f를 한 번 더 한 건, 0을 더해야 하는 경우, % f를 안 하면 0이 아닌 f로 나오기 때문이다.
결과

아주 깔끔한 결과가 나왔다.
강평
파이썬에 대해 많이 배울 수 있는 시간이었다. 그리고, 백준 기준 Python3와 PyPy3의 차이도 알 수 있었다.

PyPy3는 초기 준비 시간이 길고, 메모리를 많이 사용하지만, 비용이 큰 연산에 유리하다. 그래서 메모리가 빡빡하거나, 이번 문제처럼 반복문이 없다면 Python3이 속도는 잘 나온다.
근데 PyPy3 쓴다고 정답이 오답이 되는 경우는 없으니 웬만하면 PyPy3로 제출할 듯?
'코딩테스트 > 백준' 카테고리의 다른 글
| [백준/Python3] 1024번. 수열의 합 (0) | 2026.02.02 |
|---|---|
| [백준/Python3] 1018번. 체스판 다시 칠하기 (0) | 2026.01.31 |
| [백준/Python3] 27965번. N결수 (0) | 2026.01.21 |
| [백준/C++] 1081번. 합 (0) | 2024.02.19 |
| [백준/C++] 1793번. 타일링 (1) | 2024.02.15 |