https://www.acmicpc.net/problem/6064
6064번: 카잉 달력
입력 데이터는 표준 입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 한 줄로 구성된다.
www.acmicpc.net
제일 처음엔 1씩 증가하면서 값을 바꿔주는 식으로 접근을 했었는데, 당연히 시간초과로 틀렸고
그 다음엔 루프를 줄이는 즉 생략할 수 있는 부분에 관하여 고민하기 시작했다.
import sys
T = int(sys.stdin.readline())
for _ in range (T):
M, N, x, y = map(int, sys.stdin.readline().split())
yIncrease= x
find = False
while(yIncrease<=M*N):
if(yIncrease%N == y%N):
print(yMove)
find = True
break
yIncrease +=M
if(not find):
print(-1)
먼저 M, N = 10, 12 이고 x, y = 3, 9라고 가정을 한 다음 접근해보도록 하자.
사실 M과 N은 각각 10진수 12진수의 개념이고 x와y는 각각 10과 12진수로 나눈 나머지가 되는 상태라는 점을 파악해야 한다.
그리고 나면 M(10)에 따른 x(3)이 정해지고 나면, y에 나올 수 있는 그 숫자가 제한된다는 사실을 알 수 있는데, 아래 내용을 통해서 알아보도록 하자
먼저 초기값으로 y =3 이 주어졌다고 가정하자. 그리고 x(3)에 10진법의10을 아무리 더한다고 해도 x는 3으로 계속 일정하다는 사실을 이해해야 한다.
x+10 = 3이고, y + 10(10진법) = 13 (%12) ---1
x+10 = 3이고, y + 10(10진법) = 23 (%12) ---11
x+10 = 3이고, y + 10(10진법) = 33 (%12) ---9
x+10 = 3이고, y + 10(10진법) = 43 (%12) ---7
x+10 = 3이고, y + 10(10진법) = 53 (%12) ---5
x+10 = 3이고, y + 10(10진법) = 63 (%12) ---3
이 과정은 x에 10을 더하는 과정으로 계속 진행했을 때, y에 나올 수 있는 값은 1, 3, 5, 7, 9, 11으로 고정되어 있다는 사실을 받아 들일 수 있다.
이 과정에서 y가 증가하는 최대값은 사실 M과 N의 최소공배수까지만 연산으로도 충분하지만 편의상 M*N까지만 하였다.
그리고 여기서
1748번: 수 이어 쓰기 1
첫째 줄에 N(1 ≤ N ≤ 100,000,000)이 주어진다.
www.acmicpc.net
N = int(input())
str = str(N)
strLen = len(str)
count = 0
count += (N-pow(10,strLen-1)+1)*strLen
for i in range(1,strLen):
count += (9*pow(10,i-1)*i)
print(count)
먼저 N = 2329라고 가정을 해보자,
계산은 다음과 같이 4단계로 나뉜다.
- 1000~2329 까지의 숫자는 4를 더하고
- 100~999 까지의 숫자는 3을 더하고
- 10 ~ 99 까지의 숫자는 2를 더하고
- 1~9 까지는 숫자 1을 더하게 된다
그리고 위의 각 경우는 다음과 같이 일반식으로 나타낼 수 있게 된다.
- (2329-10^3+1) * 4
- ( 9 * 10^2) * 3
- ( 9 * 10^1) * 2
- ( 9 * 10^0) * 1
이 일반식을 코드로 구현만 하면 통과할 수 있다.
'CodingTest_python' 카테고리의 다른 글
[코드스테이츠] 데이터 기초반_파이썬 입문(과제 :1-2basic) (0) | 2022.10.26 |
---|---|
[코드스테이츠] 데이터 기초반_파이썬 입문(과제 :1-1basic) (0) | 2022.10.25 |