티스토리 뷰

정말 어이없는 착각을 하면서 이 단계별로 풀어보기를 하고 있었습니다,,

입력 관련 내용인데요, 아래 10952번 문제에서 말씀드릴게요.

 

제 깃허브에서도 아래 코드를 확인하실 수 있으세요!

 

https://github.com/kmi0817/coding_test_practice/tree/main/baekjoon_step/step4

 

GitHub - kmi0817/coding_test_practice: 백준 홈페이지의 단계별로 풀어보기 코드입니다.https://www.acmicpc.net/

백준 홈페이지의 단계별로 풀어보기 코드입니다.https://www.acmicpc.net/step - GitHub - kmi0817/coding_test_practice: 백준 홈페이지의 단계별로 풀어보기 코드입니다.https://www.acmicpc.net/step

github.com


1. A+B - 5 (10952번)

반복문으로 입력받기 때문에 input() 대신 속도가 더 빠른 sys.stdin.readline()으로 입력을 받아보았습니다.

import sys

try :
    result_list = list()
    while True :
        a, b = sys.stdin.readline().rstrip().split()
        A = int(a)
        B = int(b)

        if A == 0 and B == 0 :
            break
        elif A > 0 and B < 10 :
            result_list.append(A+B)
        else :
            print("A와 B의 범위가 맞지 않습니다.")

    for result in result_list :
        print(result)
except :
    print("문제가 발생했습니다.")

위 코드로는 입력과 출력이 아래 캡처처럼 나옵니다. 입력 a, b의 결과를 쭉 리스트에 담고난 후, 리스트의 내용을 또 다른 for문으로 출력하는 방법입니다.

코드1 입력과 출력

2번째 방식의 코드는 아래와 같습니다.

위 코드와 차이점은 try except문을 사용하지 않은 것, a와 b의 입력 방법을 바꾼 것, 그리고 a와 b를 입력받자마자 둘을 더한 결과를 출력하는 것입니다. 맨 마지막 차이점을 제외하곤 무시해도 되는 차이점입니다!

여기선 리스트에 덧셈 결과를 담지 않고, 그냥 바로바로 입력된 a, b의 합을 출력합니다.

while True :
    a, b = map(int, input().split())
    
    if a == 0 and b == 0 :
        break
    elif a > 0 and b < 10 :
        print(a+b)
    else :
        print("A, B 범위 확인하세요.")

그럼 입력과 출력이 이렇게 바뀝니다.

코드2 입력과 출력

제가 말하고자 하는 차이점이 보이시나요? 입력과 출력의 생김새가 어떠하든 그냥 입력받고 그 둘을 더한 출력 값이 올바르면 정답으로 처리되나 봅니다.

백준 문제의 예제 입력과 예제 출력이 이렇게 생겨서,,, 당연히 첫 번째 코드처럼 짜야 한다고 생각했거든요.

제가 너무 융통성이 없었나? 그런 생각도 듭니당.

 

 

 

2. A+B - 4 (10951번)

  • map(function, iterable) : 리스트나 튜플 등 반복 가능한 자료형 내 모든 원소에 어떠한 함수를 적용합니다.
    • input().split() - 입력 내용을 split()하면 리스트가 반환됩니다. ex) 입력: 10 2 -> 반환: ["10", "2"]
    • int()는 문자형 숫자를 int 형으로 변환하는 함수입니다.
  • EOFError : 예상하지 못한 파일의 끝 (End Of File)을 마주칠 때 발생하는 예외입니다.
while True :
    try :
        A, B = map(int, input().split())
        print(A+B)
    except EOFError :
        break

 

 

3. 더하기 사이클 (1110번)

주석은 26을 기준으로 하였을 때 첫 번째로 초기화되는 변수 값들입니다!

종이에 적으면서 귀여운 수준의 알고리즘을 고민하면서 작성한 코드인데요, 이것보다 더 깔끔하고 간결한 코드가 있을 텐데 쪼오금 아쉽습니다. int(), str()이 너무 왔다갔다 하는 듯해요,,

 

가장 처음 입력은 while문 바깥에 두었습니다. 이것만 예외로 어떤 수의 십의 자리 수와 일의 자리 수가 모두 사용되기 때문입니다.

target_N = int(input()) # 26

if target_N < 10 :
    left = 0
    right = target_N
else :
    left = int(str(target_N)[0]) # int 2
    right = int(str(target_N)[1]) # int 6
result = left + right # int 8

temp_N = int(str(right) + str(result)) # int 68

cnt = 1
while temp_N != target_N :
    saved_result = result # becomes 'right' soon 8
    result = right + result # int 14
    
    if result > 9 :
        result = int(str(result)[1]) # int 4
    right = saved_result # int 8

    temp_N = int(str(right) + str(result)) # int 84
    cnt += 1
print(cnt)

 


백준 단계별로 풀어보기 3단계 파이썬 정답코드는 아래 링크에서 확인하실 수 있으세요 :)
https://thisismi.tistory.com/9

 

백준 단계별로 풀어보기 3단계 for문 파이썬 정답

제 깃허브에서도 동일한 코드를 찾으실 수 있습니다. :) https://github.com/kmi0817/baekjoon_step/tree/main/step3 GitHub - kmi0817/baekjoon_step: 백준 홈페이지의 단계별로 풀어보기 코드입니다.https://www..

thisismi.tistory.com

 

🌟 느낀점

4단계를 풀면서 느낀점은 '무분별한 try except문 사용은 좋지 않다'였습니다.

예외 처리를 위해 필요하다고 생각해서 계속 사용했는데, 코드를 작성하면서 발생하는 오류를 터미널에 출력하지 않고 바로 except문의 내용을 출력하니 어떤 곳에서 틀렸는지 확인이 어렵더라고요. 물론 제가 except문에서 적절한 예외처리를 하지 않고 그냥 except : 만 하긴 했지만요 ㅎㅎ

그리고 10951번에서 정말로 필요한 try except문을 보면서, 제가 지금까지 작성한 try except문은 사용의 나쁜 예가 아니었나 싶었습니다.

앞으로는 적절한 위치에서 try except문을 사용하고자 노력할 것입니다!

728x90