[プログラマー][Python]カーペット


📃 問題の説明


Leoはじゅうたんを買いに行きました.格子じゅうたんの列が見えました.真ん中は黄色で、一列は茶色で、下図のように見えます.

Leoは家に帰ってから、さっき見たじゅうたんの黄色と茶色の格子数を覚えたが、じゅうたん全体の大きさは覚えていない.
Leoがこのカーペットに茶色の格子の数茶色、黄色の格子の数黄色をパラメータとして与えた場合、カーペットの横方向と縦方向の寸法を順番に並べて返します.
せいげんじょうけん
  • 茶色の格子の水茶色は8以上5000以下の自然水です.
  • 黄色のメッシュの数は、1以上200000以下の自然数です.
  • カーペットの横方向の長さは、縦方向の長さ以上である.
  • I/O例
    brownyellowreturn102[4, 3]81[3, 3]2424[8, 6]

    💻 問題を解く

    def solution(brown, yellow):                   
        for i in range(1, int(yellow**0.5)+1):      # 약수를 구하기 위해 sqrt(yellow) 값을 해준다.
            if yellow % i == 0:                     # 해당 값이 약수라면
                row, col = i, yellow//i             # row 에는 약수를 col 에는 곱했을 때 yellow값이 나오는 수를 넣어준다.
                if ((row+2)*2) + (col*2) == brown:  # 갈색은 노란색의 테두리이기 때문에 테두리 개수를 구하는 식이 brown 개수와 같다면
                    return [col+2, row+2]           # row,col에 +2 해준 후 리턴 (col >= row)
    
    
    print(solution(10,2))      # result : [4,3]
    print(solution(8,1))       # result : [3,3]
    print(solution(24,24))     # result : [8,6]

    キー(Key)

  • 薬水を得た場合、int(yellow**0.5))+1まで送水する.
  • これは比較的簡単な問題です.

    関数コード


    最初は関数で区切ってコードを書きましたが、関数で区切ってやる必要はないと思います.
    def get_divisor(num):                           # 약수 구하는 함수 list를 리턴
        divisor = []
        for i in range(1, int(num**0.5)+1):         
            if num % i == 0:
                divisor.append([i, num//i])
        return divisor
    
    def solution(brown, yellow):
        yellow_list = get_divisor(yellow)           # yellow_list = 약수로 이루어진 2차배열
    
        for row, col in yellow_list:
            if ((row+2)*2) + (col*2) == brown:      # 갈색은 노란색의 테두리이기 때문에 테두리 개수를 구하는 식이 brown 개수와 같다면
                return [col+2, row+2]               # row,col에 +2 해준 후 리턴 (col >= row)