[백준] 1193번 - 분수찾기 (파이썬)

2022. 8. 4. 22:22·🎲 알고리즘 공부/백준

> 

[문제]

무한히 큰 배열에 다음과 같이 분수들이 적혀있다.

이와 같이 나열된 분수들을 1/1 → 1/2 → 2/1 → 3/1 → 2/2 → … 과 같은 지그재그 순서로 차례대로 1번, 2번, 3번, 4번, 5번, … 분수라고 하자.

X가 주어졌을 때, X번째 분수를 구하는 프로그램을 작성하시오.

 

[설명]

순서를 쭉 써보면 그림과 같이 나온다. 여기서 쭉 보다보면, 몇 개의 규칙을 발견할 수 있다.

설명을 위한 그림

규칙

1. 합이 같은 친구들끼리 그룹으로 묶을 수 있다.

 - 1/2와 2/1은 합이 3이기 때문에 같은 그룹으로 묶을 수 있다. 

 - 그림에는 색깔로 구분을 해두었다.

2. 그 합은 하나씩 증가한다.

 - 노란 그룹은 합이 4였는데, 초록 그룹은 합이 5다. 

3. 그룹에 있는 분수의 개수도 하나씩 증가한다.

 - 초록 그룹은 개수가 4개였는데, 파란 그룹은 개수가 5개다.

4. 각 그룹의 첫번째 분수는 1 또는 합-1의 숫자로 시작한다. (번갈아가며 그렇게 나온다)

 - 2는 1/2 , 4는 3/1, 7은 1/4, 11은 5/1 이다.

5. 그룹 안에서는 내림차순 혹은 오름차순이다. (일정한 순서 有)

 

 

입출력 예시

 

https://www.acmicpc.net/problem/1193

 

1193번: 분수찾기

첫째 줄에 X(1 ≤ X ≤ 10,000,000)가 주어진다.

www.acmicpc.net


🎨 풀이

💡 전체 코드

X = int(input())
count = 1
total = 2
odd_or_even = False # 1로 시작하는게 True, 아닌게 False 혼자 정한거.

while(True):
    if X-count <= 0:
        break
    else :
        X -= count
        total += 1
        count += 1
        odd_or_even = not odd_or_even

if odd_or_even == True :
    print(str(X)+"/"+str(total-X))
else :
    print(str(total-X)+"/"+str(X))

> 핵심 : 어느 그룹에 속하는 지 찾고, 그 그룹에서 합이랑 순서 이용해서 해당 분수 구하면 된다.

(이해 안되면 위에 규칙 잘 살펴보면 됨)  

           

🍦 코드 설명 (실행 순서대로 나열)

# main

X = int(input())
count = 1
total = 2
odd_or_even = False # 1로 시작하는게 True, 아닌게 False 혼자 정한거.

1. X를 입력받는다.

 - X : 구해야할 분수의 위치 (= X번째 분수)

2. count, total, odd_or_even을 각각 초기화해준다. (1/1 기준)

 - count : 그룹 안에 있는 분수의 개수

 - total : 분자+분모

 - odd_or_even : 1로 시작하는지, 다른 숫자로 시작하는 지 체크해주기 위함.

   - 그 다음이 1/2이기도 하고, 어짜피 1/1이라서 아무거나 해도 상관없기 때문에 복합적인 이유로 False로 적어둠.

 

@ while 무한 반복문 (3번 ~ 8번)

while(True):
    if X-count <= 0:
        break
    else :
        X -= count
        total += 1
        count += 1
        odd_or_even = not odd_or_even

3. while 무한 반복문을 실행한다.

4. 만약 X-count가 0과 같거나, 그것보다 작으면 무한 반복문을 종료한다.

 

5. 아니라면, X - count 를 해준다.

6. total에 1을 더해준다.

 - 그룹이 늘어나면 합도 1 증가하기 때문임.

7. count에도 1을 더해준다.

8. odd_or_even을 바꿔준다.

 - not 을 앞에 붙이면 True -> False  /  False -> True로 바뀜.

 

# main

if odd_or_even == True :
    print(str(X)+"/"+str(total-X))
else :
    print(str(total-X)+"/"+str(X))

9. 만약 odd_or_even이 True라면, str(X) + "/" + str(total-X) 를 출력해준다.

 - True라는 건 해당 그룹의 첫 분수가 1로 시작했다는 뜻이기 때문에 그렇게 해주는 거다. (오름차순임)

10. 아니라면, str(total-X)+"/"+str(X)를 출력해준다.

 - 내림차순으로 진행되기 때문.


​끝~

 

⭐ 느낀점

> 그냥 규칙 찾기 문제인데, 뭔가 설명을 잘 한 기분은 아니다. 설명이 어렵네. ㅠㅠ 잘 들여다보고 있으면 규칙이 나온다. 그거 이용해서 풀면 되는 문제다. 나는 이 규칙 찾기 너무 어려워서..? 아니다 그 규칙 찾긴 했는데 긴가민가하기도 했고, 또 중간에 부등호때문에 틀렸는데 다 잘못된 줄 알고 갈아엎기도 했었고 여튼 우여곡절이 좀 많았다. 내 생각에 자신감을 좀 가져야겠다는 생각이 들었다. 그래도 오래 잡고 있던 문제였는데, 풀려서 기분이 좋다. 고생많았다. 

'🎲 알고리즘 공부 > 백준' 카테고리의 다른 글

[백준] 15881번 - Pen Pineapple Apple Pen (파이썬)  (0) 2022.08.06
[백준] 2720번 - 세탁소 사장 동혁 (파이썬)  (0) 2022.08.05
[백준] 18310번 - 안테나 (파이썬)  (0) 2022.08.04
[백준] 14720번 - 우유 축제 (파이썬)  (0) 2022.08.03
[백준] 10250번 - ACM 호텔 (파이썬)  (0) 2022.08.01
'🎲 알고리즘 공부/백준' 카테고리의 다른 글
  • [백준] 15881번 - Pen Pineapple Apple Pen (파이썬)
  • [백준] 2720번 - 세탁소 사장 동혁 (파이썬)
  • [백준] 18310번 - 안테나 (파이썬)
  • [백준] 14720번 - 우유 축제 (파이썬)
듬듬
듬듬
  • 듬듬
    두드림
    듬듬
  • 전체
    오늘
    어제
    • 분류 전체보기 (280)
      • 📑 신입일기 (35)
      • 🍪 Web (1)
        • angular (1)
        • JavaScript (0)
      • 🧩 Node.js 공부 (2)
      • 🎲 알고리즘 공부 (192)
        • 프로그래머스 (76)
        • 백준 (96)
        • 코드업 (19)
      • 🎨 Tistory Customizing (1)
      • 💌 일상 (12)
        • 일상 (5)
        • 기록 (7)
      • 📜 자격증 (2)
        • 정보처리기사 (2)
      • 📗 spring boot 공부 (9)
      • 학교 공부 (20)
        • ICT 개론 (14)
        • 리눅스 (6)
      • ChatGPT 랑 놀기 (0)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 글쓰기
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    오버워치
    프로그래머스
    연습문제
    신입일기
    티스토리챌린지
    codeup
    행렬덧셈
    충무로
    til
    폰켓몬
    찬양추천
    코테
    BOJ
    정보처리기사
    50문답
    코린이
    코드업
    코민이
    스프링부트
    백준
    카카오
    6월 목표
    nodejs
    스프링 부트
    일기
    파이썬
    오블완
    정처기
    컨텐더스
    피보나치수
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
듬듬
[백준] 1193번 - 분수찾기 (파이썬)
상단으로

티스토리툴바