여태 수학 문제들을 미뤄뒀었다
하지만 쌓이는 문제들을보니 .. 더 이상 미뤄둘 수는 없다 생각
그래서 하나하나 풀기 시작했다
수학1에 들어가 보니...
그래도 단계별 문제를 보지 않고 무작정 풀었던 문제들 중에 수학 문제가 끼어있었나 보다
안 풀린 문제가 이 문제와 설탕 배달, 알파센츄리 문제였다..
일단 이게 제일 쉬워 보였으니 이문제부터 풀려했다
-
문제부터 보자
정말 거짓말 하나 안 보태고 보자마자 숨이 턱 막혔다
정말 한 10분은 저 예제 표만 본 것 같다
그러던 도중에 규칙을 발견했다
대각선을 잘 보면
두 번째 대각선은 1/2~2/1
세 번째 대각선은 3/1~1/3
즉
"대각선" 은 분모 혹은 분자의 최댓값
방향은 홀수 혹은 짝수에 따라 결정된다는 걸 알 수 있다
그럼 이 문제에서 알야 할 2가지 조건은 알아냈고..
나머지 문제인
대체 주어진 수는 어느 줄에서 나오는가?이다
요것도 머리를 조금 굴렸다
이런 문제로 머리를 굴려야 한다니 나이를 통감한다..
생각해보는 것보단 그냥 쓰면서 하는 게 나아 보여 한 번 써서 찾아보기로 했다
# 1>1
# 2
# 2>3
# 3
# 3>6
# 4
# 4>10
# 5
# 5>15
# 6
# 6>21
..
매우 익숙하다
두 변수를 잡았을 때
1번 줄은 1개
2번 줄은 1번줄총합과 2번줄 총합
3번 줄은 1,2,3 총합..
결국 찾고자 하는 수는
어느 줄의 총합의 아래에 있을터
그럼 간단하다
0부터 시작해서
0일 때 총합 (0)(이하 tempnum) 그리고
다음 줄이라는 걸 알려줄 변수에 +1(이하 tmp)
1일 때 총합 tempnum + tmp
그리고 안 넘으면 다시 tmp에 +1..
이걸 반복하다 보면
우리가 입력받은 수를 넘는 tempnum값을 찾을 수가 있다
그럼 넘는 순간 멈추면 tmp 값은 그 수의 대각선의 값이다
바로 값으로 옮겨보자
num = int(input())
tempnum = 0
tmp=0
while(1):
tempnum = tmp+tempnum
if tempnum>=num:
break
tmp+=1
where = tempnum - num
if tmp %2 !=0:
print(str(1+where)+"/"+str(tmp-where))
else:
print(str(tmp-where)+"/"+str(1+where))
|
매우 적절한 코드가 나왔다
수를 받아와 num으로 선언
받은 수가 들어갈 그 대각선 줄의 최댓값 = tempnum
받은 수가 들어갈 그 대각선의 값 = tmp
먼저 앞에서 언급한 대로 tempnum과 tmp를 구한다
백준에 올라가 있는 마지막 예시 기준으로 14인 경우에는
tempnum, tmp, num = 15, 5, 14이다
그럼 이 수를 가져와서
where이라는 변수를 만들 텐데
말 그대로 입력받은 num은 몇 번째에 있는지 알아내는 변수이다
간단하다 그냥 최댓값에 입력받은 num값을 빼면 몇 번째 수인지 알 수 있다
그렇게 뺀 수를 가져와서 앞서 언급한 방향을 알아내야 한다
짝수일 때는 tmp값이 분모로 시작해서 1씩 줄어들고 결국 분자가 될 것이고
홀수일 때는 그 반대일 것이다
간단하게 출력을 위해 where을 str로 만들어 슬래쉬와 붙여준다
아, 그전에 뺀 수는 0부터 센 수이므로 +1을 해준다
그럼 답이 톡 하고 튀어나오는 걸 볼 수가 있다
-
역시 시간이 지나니 무쇠덩이 던 게 약간 무른 쇠로 변했나 보다
단계별 올라갈 때는 눈길조차 안 가던 문제인데..
결국 풀리는 거 보니 그래도 시간이 약인가 보다
'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬] 2992 크면서 작은 수 (0) | 2022.01.28 |
---|---|
[파이썬] 재귀함수를 이해해보자 feat 10829, 1769, 10872, 2447 (0) | 2022.01.27 |
[파이썬] 1541 잃어버린 괄호 (0) | 2022.01.26 |
[파이썬] 4158 - CD (0) | 2022.01.23 |
[파이썬] 11866, 1158 요세푸스 문제 (0) | 2022.01.22 |