파이썬 알고리즘 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))

더욱 간결하게 가능

  • 파이썬에서 지수는 ** 임

좋은 웹페이지 즐겨찾기