파이썬 알고리즘 096 | [백준 2292번] 벌집
94. 벌집
위의 그림과 같이 육각형으로 이루어진 벌집이 있다. 그림에서 보는 바와 같이 중앙의 방 1부터 시작해서 이웃하는 방에 돌아가면서 1씩 증가하는 번호를 주소로 매길 수 있다. 숫자 N이 주어졌을 때, 벌집의 중앙 1에서 N번 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나가는지(시작과 끝을 포함하여)를 계산하는 프로그램을 작성하시오. 예를 들면, 13까지는 3개, 58까지는 5개를 지난다.
입력
첫째 줄에 N(1 ≤ N ≤ 1,000,000,000)이 주어진다.
출력
입력으로 주어진 방까지 최소 개수의 방을 지나서 갈 때 몇 개의 방을 지나는지 출력한다.
예제 입력 1
13
예제 출력 1
3
<내 풀이>
k = int(input())
n = 1
v = 1
while v < k :
v+= 6*n
n+=1
print(n)
<틀렸다고 뜬 내 풀이> - 논리는 똑같은데 무한루프 사용
k = int(input())
n = 1
v = 1
if k==1 :
print(1)
else :
while v < k :
v+= 6*n
n+=1
print(n)
<반성점>
- 정말 어려운 문제가 아니었고, 그룹을 정하면 되는 문제였는데 너무 꼬아 보아서 오래걸렸다
- 어떤 숫자든 직진루트가 존재하기 때문에 입력받은 숫자가 어떤 그룹에 속하는지만 알면 파악 끝나는 문제였음
이렇게 그룹을 나누고 몇번째 그룹이니!? (1은 1번 그룹) 이것만 알면 되는 거였다..
그룹은 어떻게 나뉘냐면
1 (그룹1) - 1개
2-7 (그룹2) - 6개
8-19 (그룹3) - 12개
20-37 (그룹4) - 18개
이런식으로 6의 배수만큼 그룹원이 늘어나게 된다
이를 누적해나가면서 입력받은 숫자가 어디에 속하는지만 판별해주면 됨
<배운 점>
- while true 의 문법을 쓰면 잘 모르겠지만 튕기는 것 같다, 최대한 무한루프는 사용하지 말자
- 오랜만에 알고리즘 문제를 풀었더니 입력받는 것도 기억이 잘 안나서..
- 입력받고 바로 정수로 변환해버리기
a, b = map(int, input()).split())
map
람다함수
plus_two = lambda x : x+2
print(plus_two(넣을 값))
- 람다함수의 활용
def plus_one(x) :
return x+1
a=[1,2,3]
print(list(map(plus_one, a))
=> a 라는 배열이 plus_one의 영향을 받게 map 화 시켜주고 이를 다시 list 화
=> 람다 활용 시
a=[1,2,3]
print(list(map(lambda x : x+1 , a))
더욱 간결하게 가능
- 파이썬에서 지수는 ** 임
Author And Source
이 문제에 관하여(파이썬 알고리즘 096 | [백준 2292번] 벌집), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/파이썬-알고리즘-094-백준-2292번-벌집저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)