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]))
근데..안된다..
그래서 강의를 들었다.