1. 프로그래머스 LV2 - 최댓값과 최솟값
문제점
문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 "(최소값) (최대값)"형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 "1 2 3 4"라면 "1 4"를 리턴하고, "-1 -2 -3 -4"라면 "-4 -1"을 리턴하면 됩니다.
제한 조건
s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.
시도해 본 것들
공백 제거 후 숫자만 추출 <- isdigit()
추출한 숫자 list로 집어넣기 <- append()
max_num을 찾기 위해 sort() 후 pop()
min_num을 찾기 위해 reverse() 후 pop()
def solution(s):
answer = ''
max_num = 0
min_num = 0
num_list = []
for i in s:
print(i)
if not i.isdigit():
# print(i)
num_list.append(i)
# print(dir(i))
num_list.sort()
max_num = num_list.pop()
num_list.reverse()
min_num = num_list.pop()
answer += min_num
answer += ' '
answer += max_num
return answer
print(solution('1 2 3 4'))
print(solution('-1 -2 -3 -4'))
이렇게 했을 때 숫자가 양수만 들어오면 상관없는데 음수가 들어오면 -를 걸러버려서 정답이 안 나온다.
-를 보존하기 위해서 isdigit()을 isspace()로 바꿔서 공백만 찾기, += 으로 문자열 상태로 집어넣기
순서를 세기 위해서 enumerate 사용
def solution(s):
answer = ''
num_list = []
for count, val in enumerate(s):
# i가 space가 아니라면
if not val.isspace():
# 현재 value가 숫자고 이전 value는 숫자가 아니면
if val.isdigit() and not s[count-1].isdigit():
# append(이전 value + 현재 밸류)
num_list.append(s[count-1] + val)
# 현재 밸류가 숫자면
elif val.isdigit():
num_list.append(val)
# 내림차순 정렬
num_list.reverse()
# 가장 작은 수 pop()
min_num = num_list.pop()
answer += min_num
# 오름차순 정렬
num_list.reverse()
# 가장 큰 수 pop()
max_num = num_list.pop()
answer += ' '
answer += max_num
return answer
띄어쓰기가 두 번 적용되는 케이스 발생
if val.isdigit() and not s[count-1].isdigit():
# append(이전 value + 현재 밸류)
num_list.append(s[count-1] + val)
이 코드가 -가 없을 경우 ' '을 하나 추가하고 있었다.
if int(min_num) > int(max_num):
answer += max_num
answer += ' '
answer += min_num
else:
answer += min_num
answer += ' '
answer += max_num
reverse()가 절댓값을 기준으로 정렬하고 있었다.
테스트는 통과했는데 제출했을 때 다 틀린 걸 보면 뭔가 간과한 게 있는 것 같다. <- 두 자리를 넘어가는 숫자를 다 잘라서 인식해 버린 게 문제 같다. 그렇다는 건 공백을 기준으로 앞뒤로 잘라야 하는데 방법이 뭐가 있을까
split()으로 공백을 기준으로 나눈 리스트를 만들었다.
int()로 감싸서 리스트에 집어넣으면서 sort()와 reverse()가 -를 반영할 수 있도록 만듦
해결 방법
def solution(s):
answer = ''
# 공백을 기준으로 숫자 나누기
s_list = s.split(' ')
int_list = []
# int형으로 집어 넣음
for n in s_list:
int_list.append(int(n))
# 최댓값 추출
int_list.sort()
max_num = int_list.pop()
# 최솟값 추출
int_list.reverse()
min_num = int_list.pop()
# answer에 집어 넣기
answer += str(min_num)
answer += ' '
answer += str(max_num)
return answer
알게 된 점
sort()로 했을 때 숫자 하나씩 이상하게 밀리는데 원인이 뭔지 잘 모르겠다.
[' 2', ' 3', ' 4', '1']
[' 4', '-1', '-2', '-3']
LV2라고 해서 처음부터 복잡하고 오래 걸리는 코드가 나오는 건 아닌 것 같다.
문제에서 내가 알아차리지 못할 뿐 힌트를 제공해 주는 것 같다. 늦게나마 공백의 의미를 깨달았다.
'개발일지 > TIL' 카테고리의 다른 글
TIL 23-04-03 (2) | 2023.04.03 |
---|---|
TIL 23-04-02 (0) | 2023.04.02 |
TIL 23-03-31 (0) | 2023.04.01 |
TIL 23-03-30 (0) | 2023.03.30 |
TIL 23-03-29 (0) | 2023.03.29 |