프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드
import math
def solution(n,a,b):
answer = 1
while True:
if b-a==1 and a%2==1:
break
a = math.ceil(a/2)
b = math.ceil(b/2)
answer += 1
return answer
처음에는 이렇게 해봤는데 역시나 테스트 케이스에서 시간 초과가 많이 떠서 정확성 44.1점 나왔다...
생각해보니 라운드는 사람의 수의 2의 제곱근만큼만 진행된다는 사실을 알고 for문을 그만큼만 돌려줬다. 그랬더니 시간 초과는 안 나는데 실패를 하길래 뭔가 했더니 항상 a가 b보다 작다는 건 아니라는 사실을 간과했다는걸 알았다....
import math
def next_num(n):
if n % 2 == 1:
return (n+1) // 2
else:
return n // 2
def solution(n,a,b):
answer = 1
if a > b:
a,b = b, a
for _ in range(int(math.sqrt(n))):
if a % 2 == 1 and b - a == 1:
break
a = next_num(a)
b = next_num(b)
answer += 1
return answer
- 처음에 a가 b보다 큰 번호를 가졌을 경우 둘을 바꿔준다.
- a와 b의 번호 차이가 1이고, a가 홀수 번호를 가질 때 둘은 만나게 된다. 그때까지 for문을 돌려준다.
- 다음 라운드의 번호는 지금 번호가 홀수라면 1을 더하여 2로 나눈 몫이고 짝수라면 바로 2로 나눈 몫이다.
아래 코드처럼 따로 함수를 만들지 않고 위의 코드처럼 math 라이브러리의 ceil을 이용하여도 통과된다.
import math
def solution(n,a,b):
answer = 1
if a > b:
a,b = b, a
for _ in range(int(math.sqrt(n))):
if b-a==1 and a%2==1:
break
a = math.ceil(a/2)
b = math.ceil(b/2)
answer += 1
return answer
'문제풀이 > 기타' 카테고리의 다른 글
[Python/파이썬] 프로그래머스 행렬의 곱셈 (0) | 2022.11.09 |
---|---|
[Python/파이썬] 프로그래머스 H-Index (0) | 2022.11.08 |
[Python/파이썬] 프로그래머스 N개의 최소공배수 (0) | 2022.10.29 |
[Python/파이썬] 프로그래머스 짝지어 제거하기 (0) | 2022.10.22 |
[Python/파이썬] 프로그래머스 다음 큰 숫자 (0) | 2022.10.21 |