1) 사이트
2) 문제
처음엔 잘 이해가 가지 않는 문제였다. 지그재그가 어떤 의미인지 해석하느라 말이다.
대략 문제의 지그재그는 이런 패턴이다.
*1회* - 홀수
1 -> 1/1 (회수(1회), 1)
*2회* - 짝수
2 -> 1/2 (1, 회수(2회))
3 -> 2/1 (+1, -1)
*3회* - 홀수
4 -> 3/1 (회수(3회), 1)
5 -> 2/2 (-1, +1)
6 -> 1/3 (-1, +1)
*4회* - 짝수
7 -> 1/4 (1, 회수(4회))
8 -> 2/3 (+1, -1)
9 -> 3/2 (+1, -1)
10 -> 4/1 (+1, -1)
*5회* - 홀수
11 -> 5/1 (회수(5회), 1)
12 -> 4/2 (-1, +1)
13 -> 3/3 (-1, +1)
14 -> 2/4 (-1, +1)
15 -> 1/5 (-1, +1)
즉, 내가 사용한 패턴은 짝수와 홀수에 따라 다르게 계산된다는 점을 이용했다.
짝수는 시작되는 회차 첫 수의 분수에서 +1, -1로 계산되고,
홀수는 시작되는 회차 첫 수의 붅수에서 -1, +1로 계산된다.
즉, 회차 첫 수와의 차이만큼 해당 수의 분수가 계산된다.
3) 파이썬 코드
do=1 #1+2+3+4+5... 1씩 증가하면 더해주는 걸 저장하는 변수
row=0
col=0
number=int(input())
for first in range(0,10000):
do=do+first #first는 1,2,3,4...1씩 증가
#앞의 첫수보다는 크거나 같아야하며 뒤의 첫수보다는 작아야한다. (뒤의 첫수라는 제어값 없으면 다 들어와서 돌아가기 때문에 시간 오래 걸린다.)
if((number>=do) and (number<do+first+1)):
#첫수보다 얼마나 큰가?
gap=number-do
#짝수일 경우 (+gap -gap)
if((first+1)%2==0):
row=1+gap
col=(first+1)-gap
break
#홀수일 경우 (-gap +gap)
else:
row=(first+1)-gap
col=1+gap
break
print(f'{row}/{col}')
3-1) 선수 지식
파이썬 코드를 이해하기 위해 알아야 할 선수 지식이 없습니다.
3-2) 설명
1. 사용할 변수를 선언 및 초기화해줍니다.
do=1 #1+2+3+4+5... 1씩 증가하면 더해주는 걸 저장하는 변수
row=0
col=0
do : 1 , 1+2, 1+2+3 ... 1씩 증가하는 등차수열의 합을 저장하는 변수이다.
row : 일정 수에 해당하는 변수의 분모를 뜻한다.
col : 일정 수에 해당하는 변수의 분자를 뜻한다
row / col
2. 분수 알아볼 수를 입력받는다.
number=int(input())
3. 앞서 설명한 것처럼 각 회차의 첫번째에 오는 (빨간 동그라미)를 계산한다.
for first in range(0,10000):
do=do+first #first는 1,2,3,4...1씩 증가
do=1+0
do=1+0+1
do=1+0+1+2 ...
4. 3번에서 계산한 do(각 회차의 첫 수)보다 크거나 같고, 다음 회차수의 첫 수보다 작다면 현재 회차에 속한다.
for first in range(0,10000):
do=do+first #first는 1,2,3,4...1씩 증가
#앞의 첫수보다는 크거나 같아야하며 뒤의 첫수보다는 작아야한다. (뒤의 첫수라는 제어값 없으면 다 들어와서 돌아가기 때문에 시간 오래 걸린다.)
if((number>=do) and (number<do+first+1)):
#첫수보다 얼마나 큰가?
gap=number-do
만약 그 회차수에 속한다면, 입력받은 수와 회차 수의 첫 수의 차를 구해준다.
ex) 입력받은 수 (14) - 회차 수의 첫 수(11) = 3
단, first에 1을 더해주는 이유는 반복문이 0부터 시작되기 때문이다. 즉, 3회차면 first는 2이기 때문이다.
5. 회차가 짝수일 경우 row=1/col=회차이고, 첫수와의 차만큼 row=1+gap/col=회차-gqp을 해준다.
회차가 홀수일 경우 row=회차/col=1이고, 첫수와의 차만큼 row=회차-gap/col=1+gqp을 해준다. (서로 반대인 셈)
for first in range(0,10000):
do=do+first #first는 1,2,3,4...1씩 증가
#앞의 첫수보다는 크거나 같아야하며 뒤의 첫수보다는 작아야한다. (뒤의 첫수라는 제어값 없으면 다 들어와서 돌아가기 때문에 시간 오래 걸린다.)
if((number>=do) and (number<do+first+1)):
#첫수보다 얼마나 큰가?
gap=number-do
#짝수일 경우 (+gap -gap)
if((first+1)%2==0):
row=1+gap
col=(first+1)-gap
break
#홀수일 경우 (-gap +gap)
else:
row=(first+1)-gap
col=1+gap
break
6. 결과값을 출력한다.
print(f'{row}/{col}')
4) c언어
아직~
수학문제라 그런지 어려운 라이브러리가 필요 없어서 좋다.
끝!
'알고리즘 > 백준' 카테고리의 다른 글
10250번 ACM 호텔 (0) | 2021.06.02 |
---|---|
2869번 달팽이는 올라가고 싶다 (0) | 2021.05.31 |
2292번 벌집 (0) | 2021.05.30 |
1712번 손익분기점 (0) | 2021.05.29 |
1316번 그룹 단어 체커 (0) | 2021.05.23 |