본문 바로가기

알고리즘 공부/연습 문제

SW Expert Academy) 17299. 최소 덧셈-파이썬

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AYe7x0DKBJADFARP 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

입력

3
1743
123
3141592

출력

#1 60
#2 15
#3 1906

 

내 코드

T = int(input()) # 테스트 케이스의 갯수
for t in range(1, T + 1): # 테스트 케이스의 수만큼 반복, 1부터 시작
    s=list(input()) # 숫자를 문자의 형태로 입력 받고 각각 리스트에 대입
    result=list() # 각각 덧셈을 수행했을 때 결과값을 저장할 리스트
    temp=''
    temp2=''
    for i in range(1,len(s)):
        data1=s[0:i] # 처음부터 1개씩 슬라이싱해서 리스트에 넣음
        data2=s[i:len(s)] # 잘린 앞쪽을 제외한 나머지 부분을 리스트로 저장
        for j in data1: # s를 문자로 취급했기에 문자를 이어주는 역할 수행
            temp+=j
        for k in data2: # 위와 동일
            temp2+=k
        S=int(temp)+int(temp2) # 문자를 int로 형 변환해서 결과값을 도출
        result.append(S) # 도출한 결과값 저장
        temp='' #매개 변수의 초기화
        temp2=''
    print("#{} {}".format(t,min(result))) #결과 리스트에서 최솟값 출력

처음에 숫자를 문자열의 형태로 받는다고 하길래 리스트를 이용해서 하나씩 끊어서 저장하게 했다.

temp의 경우 슬라이싱을 이용해 나눈 문자열의 리스트 내부 요소를 합치기 위해 사용한 String 변수이다.

ex) data1=['1','2','3']인 경우 temp='123'

매개 변수를 초기화 하는 과정을 해주지 않을 경우 기존에 있던 값에서 계속해서 이어 붙이기 때문에 result 리스트에 추가한 후 초기화 하는 과정을 거쳤다.

다른 풀이

T = int(input())
for test_case in range(1, T + 1):
    s = input()
    minnum = 100000
    slen = len(s)
    for i in range(1, slen):
        minnum = min(minnum, int(s[0:i]) + int(s[i:slen]))
    print(f"#{test_case} {minnum}")

훨씬 더 간단하게 구현한 다른 풀이이다.

수학적인 사고 방식이 필요하다.

minnum을 이용해서 비교해서 출력하는 방식이다.

문제에서 요구하는 조건으로는 결과값의 경우 100,000을 넘을 수가 없다. 따라서 minnum을 처음에 100,000으로 설정해둔다. (다른 숫자를 사용해도 상관없다. 다만 int(s[0:i]) + int(s[i:slen])이 실험 결과 10,000은 넘는 경우가 있기 때문에 적당히 큰 수로 설정해둘 필요가 있다.)

그리고 반복문을 통해서 int(s[0:i]) + int(s[i:slen])과 minnum을 비교, 최솟값을 찾아서 출력하는 형태이다.

느낀 점 

슬라이싱의 개념이 부족했다.

슬라이싱의 경우 입력에 대해서 끊어서 출력하게 만들 수 있다.

s=input()으로 받고, 입력값을 123을 넣을 시 s를 출력하면 123이 출력된다.

여기서 s[0:1]과 같이 슬라이싱을 사용한 경우 슬라이싱한 값을 출력하면 1이 출력된다.

즉 굳이 리스트로 하나하나 끊을 필요 없이 한번에 입력 받고 끊어서 사용할 수 있는 것이다.

리스트로 하나하나 끊어서 입력받는 조건 때문에 비어있는 경우와 temp 매개 변수를 이용해서 이어주는 반복 과정을 더 수행했다.

개선 코드

T = int(input())
for t in range(1, T + 1):
    s=input()
    result=list()
    for i in range(1,len(s)):
        result.append(int(s[0:i])+int(s[i:len(s)]))
    print("#{} {}".format(t,min(result)))

느낀 점을 통한 개선 코드이다. 슬라이싱을 이용해서 더한 값들을 바로 result 리스트에 넣었고, 출력시 result에서 최솟값을 출력하도록 개선하였다.

 

 

 

'알고리즘 공부 > 연습 문제' 카테고리의 다른 글

백준) 11723 - 파이썬  (0) 2023.09.06
백준) 2635 - 파이썬  (0) 2023.09.06
백준) 2559 - 파이썬  (0) 2023.09.04
백준) 1920 - 파이썬  (0) 2023.08.08
백준) 11399 - 파이썬  (0) 2023.07.27