본문 바로가기
코딩테스트

[Python, C] 백준 1789 풀이

by CuckooBird 2023. 1. 2.

문제

서로 다른 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분이면 다 쓸 걸 지금 몇 십분 더 들여서 쓰고 있습니다. 효율적이지 않은 걸 알지만 끊을 수 없는 제 코드랑 똑같네요. 코드는 쓰는 사람 성격을 보여주나봐요. 손글씨로 사람 성격 어림짐작 하듯이.. 변수명만 봐도 누가 쓴건지 대략 짐작이 갈 때도 있습니다. 그래서 저는 리팩토링 책을 하나 사서 아무도 모르게 할 생각입니다.

 

민첩한 하루 보내세요.