세준이는 오랜 연구기간 끝에 신상품을 내놓았다. 세준이는 오랜 시간이 걸린 만큼 이 상품을 최대 이익에 팔려고 한다.
세준이는 이 상품을 사려고 하는 사람들이 총 몇 명이나 되는지 알아봤다. 무려 N명이나 살 의향을 보였다. 각각의 사람은 자기가 지불할 생각이 있는 최대 한도가 있다. 따라서, 어떤 사람이 20원까지 지불할 생각이 있는데, 세준이가 가격을 30원으로 책정하면 이 사람은 절대 안 살 것이고, 15원으로 책정하면 이 사람은 이 상품을 15원에 살 것이다. (단, 세준이가 안 팔수도 있다.)
그리고, 세준이는 각각의 사람에게 배달하는 비용이 얼마나 걸리는 지 알고 있다.
N명의 사람과, 각각의 사람이 지불할 용의가 있는 최대 금액과 배송비가 주어졌을 때, 세준이의 이익을 최대로 하는 가격을 출력하는 프로그램을 작성하시오.
첫째 줄에 세준이의 물건을 구매할 의향이 있는 사람의 수 N이 주어진다. 이 값은 50보다 작거나 같다. 둘째 줄부터 각 사람이 지불할 최대 금액과 배송비가 공백을 사이에 두고 주어진다. 두 값은 모두 106보다 작거나 같은 음이 아닌 정수이고, 배송비는 0이 될 수도 있다.
첫째 줄에 최대 이익을 만들어주는 가격을 출력한다. 이익이 최대인 가격이 여러개라면, 가장 낮은 가격을 출력한다. 또, 어떤 가격으로 팔아도 이익을 남길 수 없다면 0을 출력한다.

N = int(input())
L = []
for i in range(N):
L.append(list(map(int, input().split())))
num = 0
res = 0
for i in L:
money = 0
for j in L:
if i[0] > j[0]:
continue
money += i[0] - j[1] if i[0] > j[1] else 0
if num < money:
num = money
res = i[0]
elif num == money:
res = min(res, i[0])
print(res)
사람의 최대 인원이 50명이기 때문에 2중 for문을 돌려도 큰 문제가 없다.
제시한 가격 (i[0]) 이 사고자 하는 가격 (j[0]) 보다 낮거나 같을 경우에만 팔아서 돈을 남겨야 한다.
if i[0] > j[0]:
continue
단, 배송비 때문에 팔아도 적자라면 팔지 않는다.
money += i[0] - j[1] if i[0] > j[1] else 0
이 경우만 잘 계산해서
첫째 줄에 최대 이익을 만들어주는 가격을 출력한다. 이익이 최대인 가격이 여러개라면, 가장 낮은 가격을 출력한다.
res와 num에 변수관리를 해서 최대 이익 중 가장 낮은 가격을 출력하도록 한다.
문제 조건 중 (단, 세준이가 안 팔수도 있다.) 를 미처 생각하지 못해 조금 시간이 걸렸다.
세준이는 1부터 N까지 모든 수를 차례대로 공백없이 한 줄에 다 썼다. 그리고 나서, 세준이가 저녁을 먹으러 나간 사이에 다솜이는 세준이가 쓴 수에서 마음에 드는 몇 개의 숫자를 지웠다.
세준이는 저녁을 먹으러 갔다 와서, 자기가 쓴 수의 일부가 지워져있는 모습을 보고 충격받았다.
세준이는 수를 방금 전과 똑같이 쓰려고 한다. 하지만, N이 기억이 나지 않는다.
남은 수를 이어 붙인 수가 주어질 때, N의 최솟값을 구하는 프로그램을 작성하시오. 아무것도 지우지 않을 수도 있다.)
첫째 줄에 지우고 남은 수를 한 줄로 이어 붙인 수가 주어진다. 이 수는 최대 3,000자리다.
가능한 N 중에 최솟값을 출력한다.

N = input().rstrip()
num = 0; idx = 0
while len(N) != idx:
num += 1
for s in str(num):
if idx < len(N) and s == N[idx]:
idx += 1
print(num)
진짜 코드만 보면 간단할 것 같지만 중간에 한 번 길을 잘못 들어서 시간을 많이 소모했다.
예제 입력 2 에서 234 다음에 0이 나오는데 이건 10에서 0이 포함되기에 10으로 없앨 수 있다.
9110의 경우, 9를 포함하고, 10의 1을 포함하고 11의 1을 포함하고 20의 0을 포함하므로 20이 답이다.
이처럼 2자리수부터는 그 숫자의 앞에 숫자가 해당될지, 뒤에 숫자가 해당될지, 전체가 해당될지 모르기 때문에 이 부분을 잘 구현해야 한다.
처음엔 인덱스 슬라이싱을 써서 했기 때문에 위에서 설명한 부분을 구현하기 힘들었다.
그래서 찾아보니 그저 숫자의 각 자리수를 왼쪽부터 하나하나 대조해주면 될 일이었다.
다음과 같은 규칙에 따라 수들을 만들려고 한다.
1. 첫 번째 수로 양의 정수가 주어진다.
2. 두 번째 수는 양의 정수 중에서 하나를 선택한다.
3. 세 번째부터 이후에 나오는 모든 수는 앞의 앞의 수에서 앞의 수를 빼서 만든다. 예를 들어, 세 번째 수는 첫 번째 수에서 두 번째 수를 뺀 것이고, 네 번째 수는 두 번째 수에서 세 번째 수를 뺀 것이다.
4. 음의 정수가 만들어지면, 이 음의 정수를 버리고 더 이상 수를 만들지 않는다.
입력으로 첫 번째 수가 주어질 때, 이 수에서 시작하여 위의 규칙으로 만들어지는 최대 개수의 수들을 구하는 프로그램을 작성하시오. 최대 개수의 수들이 여러 개일 때, 그중 하나의 수들만 출력하면 된다.
첫 번째 수가 주어진다. 이 수는 30,000 보다 같거나 작은 양의 정수이다.
첫 번째 줄에는 입력된 첫 번째 수로 시작하여 위의 규칙에 따라 만들 수 있는 수들의 최대 개수를 출력한다.
둘째 줄에 그 최대 개수의 수들을 차례대로 출력한다. 이들 수 사이에는 빈칸을 하나씩 둔다.

N = int(input())
cnt = 0; m = 0; m_num = 0
for i in range(N, N//2 - 1, -1):
cnt = 0
pre = N; num = i
while pre >= num:
cnt += 1
pre, num = num, pre - num
if m < cnt:
m = cnt
m_num = i
print(m+2)
print(N, m_num, end=" ")
while N >= m_num:
print(N - m_num, end=" ")
N, m_num = m_num, N - m_num
그냥 N부터 N의 절반까지 하나하나 이어가는 수의 개수를 세면 되는 간단한 문제이다.
하지만 숫자 개수와 출력부분에서는 조금 신경을 써야한다.