1) 사이트
2) 문제
이 문제는 약간 이해가 필요하고 수식을 생각할 시간이 필요했던 문제이다.
내가 이해한 바를 적도록 하겠다.
문제는 같은 육각형에 속해있으면 같은 방을 이룬다고 생각하면 된다.
예시로
1 -> 1번방
2~7 -> 2번방
8~19 -> 3번방
20~37 -> 4번방
38~61 -> 5번방
.
.
.
각 방 숫자들을 따라가보면 작은 육각형을 이루고 있다. 이렇게 1~최대 1억까지의 숫자를 입력받았을 때 그 숫자가 몇 번방에 속해있는지 출력하면 된다.
나는 개인적으로 저렇게 써넣고 고민해봤을 때 각 방의 마지막으로 들어가는 숫자에 집중했다.
1 -> 7 -> 19 -> 37 -> 61
한 방씩 높아질수록 +6 / +12 / +18 / +24 씩 늘어나는 것을 확인할 수 있었다.
즉, 전 방의 마지막수 + x * 6라는 수식을 얻을 수 있었다.
전 방의 마지막수라는 변수를 first_number=1 이라고 초기값을 둔다면,
x=0일 때, 1+0*6 = 1 이라는 1번방의 마지막 수가 나온다.
x=1일 때, 1+1*6 = 7 이라는 2번방의 마지막 수가 나온다.
x=2일 때, 7+2*6 = 19 이라는 3번방의 마지막 수가 나온다.
x=3일 때, 19+3*6 = 37 이라는 4번방의 마지막 수가 나온다.
이러한 규칙을 찾아내고 난 후 코드를 짜기 시작했다.
3) 파이썬 코드
result=0
first_number=1
number=int(input())
for x in range(0,17000000):
last=first_number+x*6
if(number<=last):
result=x+1
break
first_number=last
print(result)
3-1) 선수 지식
파이썬 코드를 이해하기 위해 알아야 할 선수 지식이 없다.
3-2) 설명
1. 사용할 변수를 초기화 한다.
result=0
first_number=1
- result : 결과 값을 저장하는 변수
- first_number : 앞서 말했던 것 처럼 전 단계 마지막 방의 수를 저장하는 변수이다.
예를 들어 3번째 방을 검토할 땐 여기에 2번째 방의 마지막 수가 들어간다.
1로 초기값을 설정한 이유는 1번방의 마지막 숫자는 1개인 1이기 때문이다.
2. 검사할 숫자를 입력받는다.
number=int(input())
뒤의 계산을 위해 숫자로 변환해준다.
3. 몇 번방의 숫자인지 검토한다.
for x in range(0,17000000):
last=first_number+x*6
if(number<=last):
result=x+1
break
first_number=last
- 앞서 말했던 것처럼 전 방의 마지막수 + x * 6 이라는 수식을 적용시킨다.
- 그리고 만약 입력받은 수가 특정 마지막 방의 수 안에 들어간다면 결과값을 해당 방으로 설정한 후 종료한다.
- 아니라면 다음 방을 체크한다.
- 17000000이라고 설정한 이유는 1억을 넣었을 때 결과값이 나오는 단위이기 때문이다. 사실 break넣어서 2천만개로 넣어도 상관 없었을 것 같다.
4. 결과값을 출력한다.
print(result)
4) c언어 코드
아직
수학 카테고리 초반이라 그런지 술술 풀린다.
나누고 싶은 의견이 있다면 댓글로 달아주세요 ^_^
끝!
'알고리즘 > 백준' 카테고리의 다른 글
2869번 달팽이는 올라가고 싶다 (0) | 2021.05.31 |
---|---|
1193번 분수찾기 (0) | 2021.05.30 |
1712번 손익분기점 (0) | 2021.05.29 |
1316번 그룹 단어 체커 (0) | 2021.05.23 |
2941번 크로아티아 알파벳 (0) | 2021.05.23 |