ValueError: max() arg is an empty sequence

정화·2024년 4월 2일

TIL

목록 보기
6/11
1	def solution(number, k):
2	    #숫자가 문자열로 주어진다(굉장히 큰 수 일수있어서)
3	    #몇개를 제거할지 준다.
4	    #1. 앞에서부터 number-k개 중에서 가장 큰 숫자를 찾는다.
5	    #2. 그럼 그 앞에 있는 작은 숫자는 다 뺀다.
6	    #3. 그 숫자 뒤에 남은 숫자가 k개라면 ? -> 그 숫자가 제일 큰수
7	    #4. 아니라면? -> 남은 문자열개수 a개 a-k개만큼 숫자를 빼줘야 함. 제일 작은수부터 a-k개 빼주기
8	    l = len(number)
9	    a= list(map(int,number))
10	    for i in range(l-k):
11	        if max(a[:i]) == a[i]:
12	            a = a[i:]
13	    
14	    last = len(a)
15	    for j in range(last-k):
16	        a.remove(min(a))
17	    
18	    return ''.join(a)
19	print(solution("4177252841",4))

max에 제공되는 것이 빈 리스트라는 것...후우 그렇지 i는 0 이니까ㅠㅠ

여기서 내가 잘못한 것은 max내부에 a의 범위를 잘 못 잡은것이다.
따라서 a의 맨 앞과 맨 뒤에 0을 하나씩 넣어줄 것이다.
그러면 range도 수정해 주어야 한다.
그리고 굳이 for문을 쓸 필요가 없었다.. 그냥 1번부터 l-k번까지 중에 가장 큰 숫자를 찾고 인덱스를 반환하면 되기 때문...

def solution(number, k):
    #숫자가 문자열로 주어진다(굉장히 큰 수 일수있어서)
    #몇개를 제거할지 준다.
    #1. 앞에서부터 number-k개 중에서 가장 큰 숫자를 찾는다.
    #2. 그럼 그 앞에 있는 작은 숫자는 다 뺀다.
    #3. 그 숫자 뒤에 남은 숫자가 k개라면 ? -> 그 숫자가 제일 큰수
    #4. 아니라면? -> 남은 문자열개수 a개 a-k개만큼 숫자를 빼줘야 함. 제일 작은수부터 a-k개 빼주기
    l = len(number)
    last_number = l-k
    a = [0]
    a += list(map(int,number))
    a.append(0)
    
    MAX = a.index(max(a[1:last_number+1]))
    a= a[MAX:-1]
    
    while len(a) > last_number:
        a.remove(min(a))
    
    return ''.join(a)
print(solution("4177252841",4))

그래서 코드를 이렇게 고쳤더니...

TypeError: sequence item 0: expected str instance, int found
뭐지
심지어 리스트 그대로 출력해도 리스트 안의 값도 틀렸다.
[7, 7, 5, 2, 8, 4]

ㅎ..답은 "775841"
내가 알고리즘을 잘 못 짰다.

4177252841
77252841 (2개 빠짐)
!! 앞에서부터 뒤 숫자보다 작은걸 빼줘야 하는 것이다!!!
후아
그럼
for i in range(len(a)):
if a[i] < a[i+1]:
a.remove(a[i])
if len(a) == last_number :
break
이렇게 바꿔보겠다!

를 시도했으나, 자꾸 오류가 났고,
이 a도 맨 마지막에 0을 하나 더 넣어주고 다시 코드를 짰다.
그랬더니 작동이 됐다.
근데 생각해보니 0 보단 아예 쓰이지 않는 -1 이 나을거같아서 맨 앞, 뒤에 -1을 넣는것으로도 수정했다.

그렇게 완성한 함수!

def solution(number, k):
    #숫자가 문자열로 주어진다(굉장히 큰 수 일수있어서)
    #몇개를 제거할지 준다.
    #1. 앞에서부터 number-k개 중에서 가장 큰 숫자를 찾는다.
    #2. 그럼 그 앞에 있는 작은 숫자는 다 뺀다.
    #3. 그 숫자 뒤에 남은 숫자가 k개라면 ? -> 그 숫자가 제일 큰수
    #4. 아니라면? -> 남은 문자열개수 a개 a-k개만큼 숫자를 빼줘야 함.
    #앞에서부터 뒤 숫자보다 작은 수 제거.
    l = len(number)
    last_number = l-k
    a = [-1]
    a += list(map(int,number))
    a.append(-1)
    
    MAX = a.index(max(a[1:last_number+1]))
    a= a[MAX:]
    a_len = len(a)-1
    for i in range(1,a_len):
        if a[i] < a[i+1]:
            a.remove(a[i])
        if len(a)-1 == last_number :
            break
    return a[:-1]

아 근데 처음에 join 함수도 잘못 썼었다.
join(이 안에 리스트를 for이나 map을 통해 str로 만들어 주어야 한다)

그렇게 완성된 코드

def solution(number, k):
    #숫자가 문자열로 주어진다(굉장히 큰 수 일수있어서)
    #몇개를 제거할지 준다.
    #1. 앞에서부터 number-k개 중에서 가장 큰 숫자를 찾는다.
    #2. 그럼 그 앞에 있는 작은 숫자는 다 뺀다.
    #3. 그 숫자 뒤에 남은 숫자가 k개라면 ? -> 그 숫자가 제일 큰수
    #4. 아니라면? -> 남은 문자열개수 a개 a-k개만큼 숫자를 빼줘야 함.
    #앞에서부터 뒤 숫자보다 작은 수 제거.
    l = len(number)
    last_number = l-k
    a = [-1]
    a += list(map(int,number))
    a.append(-1)
    
    MAX = a.index(max(a[1:last_number+1]))
    a= a[MAX:]
    a_len = len(a)-1
    for i in range(1,a_len):
        if a[i] < a[i+1]:
            a.remove(a[i])
        if len(a)-1 == last_number :
            break
    return ' '.join(map(str, a[:-1]))

근데..안된다..
그래서 강의를 들었다.

profile
개발자를 꿈꾸는..

0개의 댓글