【Python】ceil(A)-1 == floor(A-1)이 성립하는 조건 【AtCoder】

절상과 자르기 이야기.
여기 최근 쭉 머리 속에 있던 모야모야가 드디어 잡혔다! ! !
그래서 기사로 해보자.

결론


ceil(A)-1 == floor(A-1)가 성립하는 조건은,
  • A가 정수인 경우

  • 입니다.
    그렇다고해도 뭐야 몰라! 된다고 생각하기 때문에 예제.

    예제


    1:2.8~4.2で整数は何個あるでしょう?
    2:2.0~4.2で整数は何個あるでしょう?
    3:14~21で5の倍数は何個あるでしょう?
    4:10~21で5の倍数は何個あるでしょう?
    5:9mの丸太を3mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    6:9mの丸太を2mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    7:9mの丸太を1mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    

    해설 1


    1:2.8~4.2で整数は何個あるでしょう?
    



    이 문제는
    '2.8'을 올리고 '3'
    '4.2'를 자르고 '4'
    그렇게함으로써
  • 3~4로 정수는 몇개인가요?

  • 라는 문제에 귀착할 수 있습니다.
    よって、4 - 3 + 1(調整) = 2個  が答えとなります。
    

    해설 2


    2:2.0~4.2で整数は何個あるでしょう?
    

    이것은 왼쪽의 절상 부분이 「2」라고 정수이므로 간단하네요!
    よって、4 - 2 + 1(調整) = 3個  が答えとなります。
    

    해설 3


    3:14~21で5の倍数は何個あるでしょう?
    

    이 문제는 크게 두 가지 해법이 있다고 생각합니다.

    해법 1(1을 당겨 절단)



    누적 합시의 생각과 비슷하지만,
    "21"의 5의 배수 개수 - "13"(=14-1)의 5의 배수의 개수

    라고 생각함으로써,
  • 21/5 절단 = 4
  • 13/5 절단 = 2
  • よって、4 - 2 = 2個  が答えとなります。
    

    해법 2



    14~21을 5로 나누어 정수의 수를 세는 문제에 귀착시키는 방법입니다.
    그러면
    1:2.8~4.2에서 정수는 몇개 있나요?
    같은 문제가됩니다.
    よって、4 - 3 + 1(調整) = 2個  が答えとなります。
    

    해설 4


    4:10~21で5の倍数は何個あるでしょう?
    

    해법 1(1을 당겨 절단)


  • 9/5 절단 = 1
  • よって、4 - 1 = 3個  が答えとなります。
    

    해법 2



    10~21을 5로 나누어 정수의 수를 세는 문제에 귀착시키면,
    2:2.0~4.2에서 정수는 몇개 있나요?
    같은 문제가됩니다.
    よって、4 - 2 + 1(調整) = 3個  が答えとなります。
    

    여기까지 요약


    1:2.8~4.2で整数は何個あるでしょう?
    2:2.0~4.2で整数は何個あるでしょう?
    3:14~21で5の倍数は何個あるでしょう?
    4:10~21で5の倍数は何個あるでしょう?
    

    3이나 4와 같은 문제를 잡는 경우는, 해법 1을 사용하면 모두 잘라내기만으로 생각할 수 있습니다.
    또, 절상은 조정분의 고려가 필요하고,
    프로그램적으로도 python에서는 잘라내기를 // 로만 표현할 수 있으므로, 가능하면 모두 해법 1의 「1을 당겨 자르기」로 처리하고 싶습니다.

    test.py
    #3:14~21で5の倍数は何個あるでしょう?
    #解法1(1を引いて切捨)
    ans = 21//5
    ans -= 13//5
    print(ans) #2
    
    #解法2(切上-1)
    import math
    ans = 21//5
    ans -= math.ceil(13/5)-1 #ans -= -(-13//5)-1とするのも一つ。
    print(ans) #2
    


    그러나...

    소수의 경우는, 「1을 당겨 절단」을 사용할 수 없다! ! !

    입니다.
    실제로 시도해 봅시다.
    대답 '2'
    해야 할 1문제의 문제를 해법 1, 2로 각각 풀어봅니다.

    test.py
    #1:2.8~4.2で整数は何個あるでしょう?
    #解法1(1を引いて切捨)
    ans = 4.2//1
    ans -= 1.8//1
    print(ans) #3.0 →本当は2が正しい!!!!!!!!!!!
    
    #解法2(切上-1)
    import math
    ans = 4.2//1
    ans -= math.ceil(2.8/1)-1
    print(ans) #2.0 →正しい結果となった。
    

    다시 결론


    ceil(A)-1 == floor(A-1)가 성립하는 조건은,
  • A가 정수인 경우

  • 입니다.
    1:2.8~4.2で整数は何個あるでしょう?
    2:2.0~4.2で整数は何個あるでしょう?
    3:14~21で5の倍数は何個あるでしょう?
    4:10~21で5の倍数は何個あるでしょう?
    

    1→「2.8」이 소수이므로 ceil(A)-1 == floor(A-1) 는 성립되지 않습니다.
    따라서 절상을 솔직하게 사용합시다.
    소수의 세계에 「1」이라고 하는(차원이 다른) 정수를 마음대로 당기거나 하면 그것은 이상하게 될 거야!

    2,3,4→「2.0」「14」「10」이 정수이므로 ceil(A)-1 == floor(A-1) 가 성립합니다.
    따라서 "1을 당겨 자르기"의 생각이 가능합니다! ! !
    ※ 물론, 절상을 사용해도 풀 수 있습니다.

    설명5,6,7


    5:9mの丸太を3mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    6:9mの丸太を2mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    7:9mの丸太を1mずつ切り続けられるまで切る時、切れ目は何個あるでしょう?
    



    고찰하면, 틈의 개수는 「절상-1(조정)」로 구할 수 있다는 것을 알 수 있습니다.
    그리고, 「절상-1」이라고 하면 「1을 당겨 절단」입니다!
    이번에는 '9'가 정수이므로 '1을 당겨 자르기'로 대답을 구할 수 있습니다! ! !
    よってそれぞれ5,6,7の答えは、
    #5
    8//3 = 2
    #6
    8//2 = 4
    #7
    8//1 = 8
    となります!!!
    

    대단해! ! !
    이 굉장함, 감동! ! ! 전해질까・・・전해 주었으면 한다! ! !

    덤 (연습 문제)



    꼭 풀어 봅시다!
    ABC131 C - Anti-Division (Diff:518)
    ABC174 E - E - Logs (Diff:1227)

    끝!

    좋은 웹페이지 즐겨찾기