1. 벌집
#벌집
n = int(input())
i = 1
x = 2
y = 8
while True:
if n == 1:
cnt = 1
break
if n in range(x, y):
cnt = i + 1
break
i += 1
x = y
y = (6 * i) + x
print(cnt)
최소 개수의 방을 지나서 갈 때,
1개) 1
2개) 2~7 (6개)
3개) 8~19 (6x2개)
4개) 20~37 (6x3개 = 37 - 20 + 1)
...
처럼 차례로 수가 증가하는데, range(n1,n2)는 n1부터 n2-1까지 이므로,
ex) 20~37 → range(20, 38)로 표현되며, 38 = 6 x 3 + 20이 된다.
따라서, 위 코드처럼 6x1, 6x2, 6x3처럼 증가하고 그에 따라 범위도 같이 이동하며 방 개수를 증가해주었다.
그치만 뭔가 x=2, y=8이라고 선언해주면서 진행한 부분이 아쉬워 다른 코드들을 찾아보고 다시 해보았다.
#벌집_2
n = int(input())
x = 1
y = 1
cnt = 1
while n > y:
y += cnt*6
cnt += 1
print(cnt)
이렇게 while문에 조건을 걸어주고, 한 번에 6x1, 6x2, 6x3처럼 증가시켜주며 주어진 수가 y보다 클 때마다 반복한다.
x라는 변수는 필요하지 않지만, 이전에 range(x,y)로 해주어서 범위에 끝부분에 해당함을 나타내려고 넣어주었다.
2. 분수찾기
1단계 ) 1/1
2단계 ) 1/2, 2/1
3단계) 3/1, 2/2, 1/3
4단계) 1/4, 2/3, 3/2, 4/1
짝수 단계일 때에는 분자가 1씩 증가하고, 분모가 1씩 감소, 홀수 단계는 그 반대이다.
#분수 찾기
n = int(input())
arr = []
num = 1
while (len(arr) != n):
if num % 2 == 0:
x = 1
y = num
for j in range(num):
arr.append((x, y))
x += 1
y -= 1
if len(arr) == n:
break
else:
x = num
y = 1
for j in range(num):
arr.append((x, y))
x -= 1
y += 1
if len(arr) == n:
break
num += 1
print("%d/%d" %(arr[-1][0], arr[-1][1]))
arr에 주어진 수 n만큼의 값이 들어갈 때까지 분수를 넣어주고, 마지막 값이 해당하는 수의 분수이므로 출력해주었다. 결과는 다행히도 잘 나온다.
그치만 while문과 for문의 반복이 계속 되기도 하여서 메모리 초과라는 결과가 발생했다.
(항상 주절주절 조건 때려박아서 코드가 깔끔하지 못하는 게 문제다,,,ㅠㅠㅠㅠ)
따라서, 다시,,, 다른 분들의 코드를 보았다..
X = int(input())
line = num = 1
while X > num: #주어진 수가 어느 줄에 해당하는 지(num은 해당 줄에서 가장 끝 수(큰 수))
line += 1
num += line
gap = num - X
if line % 2 == 0: #짝수 번째 줄일 경우
a = line - gap
b = gap + 1
else:
a = gap + 1
b = line - gap
print(f'{a}/{b}')
일단 먼저 주어진 수가 어느 줄에 있는 지 파악하고 그 해당 줄에서 가장 큰 값과 차이를 비교하여
분자와 분모를 구해주었다.
마지막 포맷팅은 f-string 인데,, 아직 자세하게는 어떻게 사용하는 지 모르겠다
다음에 풀어볼 때엔 내 힘으로 진짜 풀어낼테다 ㅠ.ㅠ
참고) ooyoung.tistory.com/84