본문 바로가기

개발일지/TIL

TIL 23-04-01

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