문제
서로 다른 N개의 자연수의 합이 S라고 한다. S를 알 때, 자연수 N의 최댓값은 얼마일까?
입력
첫째 줄에 자연수 S(1 ≤ S ≤ 4,294,967,295)가 주어진다.
출력
첫째 줄에 자연수 N의 최댓값을 출력한다.
코드
파이썬
import sys
N = int(sys.stdin.readline().strip())
i = 2
max_n = 1
while 1:
if N == max_n:
break
elif N < max_n:
i -= 1
break
elif N > max_n:
max_n += i
i += 1
print(i-1)
max_n은 1, 2, 3 ... 을 순서대로 더한 값을 저장해놓습니다. 왜냐하면 그 값을 경계로 서로 다른 정수의 개수가 달라지기 때문입니다. 규칙은 간단하게 사진을 첨부하겠습니다.
입력 받은 N이 유동적인 수인 max_n 보다 크다면 max_n에 2부터 시작하는 i를 더하여 max_n이 N 보다 같거나 작을 때 까지 계속 이 과정을 진행합니다.
C언어
#include <stdio.h>
int main() {
long long int input_num = 0;
long long int n = 0;
scanf("%d", &input_num);
while (input_num >= n * (n + 1) / 2) {
n += 1;
}
printf("%u", n - 1);
return 0;
}
위와 비슷한 논리지만, 공차가 1인 등차수열의 합을 이용하여 해결했습니다.
후기
이 문제는 2학기 C언어 과제로 했던 문제이긴 하지만, 다시 한 번 더 풀어보았습니다. 밑에 올린 코드가 전에 한겁니다. 이전에 풀었던 쪽이 더 효율적이어 보이는건 기분탓입니다 ㅋㅋ..
import sys
N = int(sys.stdin.readline().strip())
i = 1
while N >= i*(i+1)/2:
i += 1
print(i-1)
민첩하게 오늘 짠 코드를 고쳐봤습니다. 노래 들으면서 하니까 집중은 안 되는데 신나네요 30분이면 다 쓸 걸 지금 몇 십분 더 들여서 쓰고 있습니다. 효율적이지 않은 걸 알지만 끊을 수 없는 제 코드랑 똑같네요. 코드는 쓰는 사람 성격을 보여주나봐요. 손글씨로 사람 성격 어림짐작 하듯이.. 변수명만 봐도 누가 쓴건지 대략 짐작이 갈 때도 있습니다. 그래서 저는 리팩토링 책을 하나 사서 아무도 모르게 할 생각입니다.
민첩한 하루 보내세요.
'코딩테스트' 카테고리의 다른 글
[Python] 백준 1181번 : 단어정렬 풀이 (0) | 2023.01.04 |
---|---|
[Python] 백준 1312번 풀이 (0) | 2023.01.03 |
[Python] 백준 2023 풀이 (0) | 2023.01.01 |
[Python] 백준 2751번 풀이 + input() 과 sys.stdin.readline() 차이 (0) | 2022.12.31 |
[Python] 백준 4344 풀이 (0) | 2022.12.30 |