다음 큰 숫자

https://school.programmers.co.kr/learn/courses/30/lessons/12909

문제 설명

_자연수 n이 주어졌을 때, n의 다음 큰 숫자는 다음과 같이 정의 합니다.

  • 조건 1. n의 다음 큰 숫자는 n보다 큰 자연수 입니다.
  • 조건 2. n의 다음 큰 숫자와 n은 2진수로 변환했을 때 1의 갯수가 같습니다.
  • 조건 3. n의 다음 큰 숫자는 조건 1, 2를 만족하는 수 중 가장 작은 수 입니다.
    예를 들어서 78(1001110)의 다음 큰 숫자는 83(1010011)입니다.

자연수 n이 매개변수로 주어질 때, n의 다음 큰 숫자를 return 하는 solution 함수를 완성해주세요._

제한 사항

  • n은 1,000,000 이하의 자연수 입니다.

입출력 예

n return
78 83
15 23

풀이

def solution(n):
    tmp=0
    answer=0
    check_num=str(format(n,'b')).count("1") # 2진법, 1의 갯수  >> 2진법은 str 타입 변환없이 바로 사용이 가능하다.
     
    while True:
        n += 1 
        tmp = str(format(n,'b')).count("1")
        print(tmp)
        if check_num == tmp:
            answer = n
            break

    return answer

다른 풀이

def nextBigNumber(n):
    num1 = bin(n).count('1')
    while True:
        n = n + 1
        if num1 == bin(n).count('1'):
            break
    return n

카펫

https://school.programmers.co.kr/learn/courses/30/lessons/42842

문제 설명

Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다. python_venv

Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.

Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.

제한 조건

  • 갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.
  • 노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.
  • 카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.

입출력 예

brown | yellow | return ——————— | ——————— | ———————
10 | 2 | [4, 3] 8 | 1 | [3, 3] 24 | 24 | [8, 6]

풀이

def solution(brown, yellow):
    answer = []
    # b = a(2x+2y) + 4    
    for y in range (1, yellow+1): # y : 세로
        val_y = yellow // y # val_y : 가로
        print(y)
        if yellow % y == 0: # y가 yellow 의 약수일 때

            if brown == val_y*2 + y*2 + 4:
                answer.append(val_y+2)
                answer.append(y+2)
                break
                
    return answer

다른 풀이

#1. 가로 * 세로 = 격자 합, 둘레의 합(가로*2 + 세로*2 - 겹치는부분4) = 갈색 둘레
def solution(brown, red):
    for i in range(1, int(red**(1/2))+1):
        if red % i == 0:
            if 2*(i + red//i) == brown-4:
                return [red//i+2, i+2]


#2. 근의 공식 활용
import math
def solution(brown, yellow):
    w = ((brown+4)/2 + math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    h = ((brown+4)/2 - math.sqrt(((brown+4)/2)**2-4*(brown+yellow)))/2
    return [w,h]