관리 메뉴

솜씨좋은장씨

[BaekJoon] 5656번 : 비교 연산자 (Python) 본문

Programming/코딩 1일 1문제

[BaekJoon] 5656번 : 비교 연산자 (Python)

솜씨좋은장씨 2021. 9. 1. 00:38
728x90
반응형

코딩 1일 1문제 470일차! 오늘의 문제는 백준 5656번 비교 연산자입니다.

백준의 비교 연산자 문제를 파이썬으로 풀이하였습니다.

 

5656번: 비교 연산자

입력은 최대 12000줄로 이루어져 있다. 각 줄은 두 정수 a, b가 주어지며, 정수 사이에는 연산자 ">", ">=", "<", "<=", "==", "!="중 하나가 주어진다. 연산자와 피연산자 사이에는 공백이 하나 있으며, 연

www.acmicpc.net

👨🏻‍💻 문제 풀이

백준 비교 연산자 문제는 숫자와 연산자 그리고 숫자가 공백으로 이어진 문자열을 받으면

문자열을 보고 가운데에 있는 연산자에 따라 이 문자열이 나타내는 의미가 맞는지 틀리는지를 판단하고

맞으면 true, 틀리면 false를 출력하는 문제입니다. ( true, false 부분에서 삽질을 조금 했습니다 )

입력되는 문자열의 형태는 다음과 같습니다.

3 != 3
4 < 4
4 <= 5
3 E 3

공백으로 숫자와 연산자가 이어져있는 형태입니다.

연산에 필요한 숫자와 어떤 연산자인지 파악할때 활용할 가운데의 문자열로 나누기 위해 split을 활용하여 

공백을 기준으로 문자열을 나누어줍니다.

exp_split = exp.split()

exp가 "3 != 3" 의 경우 exp_split에는 [ '3', '!=', '3' ] 의 결과가 들어가게 됩니다.

num1, operator, num2 = int(exp_split[0]), exp_split[1], int(exp_split[2])

여기서 맨 앞과 맨 뒤의 값은 정수형으로 변환하여 각각 num1과 num2로 가운데의 문자열은 그대로 operator에 넣어

숫자와 연산자를 구분해줍니다.

answer = False

if operator == "E":
    answer = -1
elif operator == "!=":
    answer = (num1 != num2)
elif operator == "<":
    answer = (num1 < num2)
elif operator == ">":
    answer = (num1 > num2)
elif operator == "<=":
    answer = (num1 <= num2)
elif operator == ">=":
    answer = (num1 >= num2)
elif operator == "==":
    answer = (num1 == num2)

그 후 가운데 문자열의 연산자로 연산한 결과를 answer에 넣을 수 있도록 if 조건문을 활용하여 가운데 문자열을 확인하고

각각 가운데 문자열과 같은 모양의 진짜 비교 연산자와 num1, num2를 활용하여 구한 값을 answer에 넣도록 합니다.

 

이때 가운데 문자열의 값이 E 일 경우는 반복문을 종료해야하는데

이를 파악하기 위해 이때는 answer 에 -1을 넣어주도록 합니다.

def compare_operator(exp):
    answer = False
    exp_split = exp.split()
    
    num1, operator, num2 = int(exp_split[0]), exp_split[1], int(exp_split[2])
    
    if operator == "E":
        answer = -1
    elif operator == "!=":
        answer = (num1 != num2)
    elif operator == "<":
        answer = (num1 < num2)
    elif operator == ">":
        answer = (num1 > num2)
    elif operator == "<=":
        answer = (num1 <= num2)
    elif operator == ">=":
        answer = (num1 >= num2)
    elif operator == "==":
        answer = (num1 == num2)
        
    return answer

이를 모아서 위처럼 하나의 함수로 만들어줍니다.

 

이제 이 함수를 통해 결과를 받아와 원하는 출력 모양대로 만들어주는 부분을 구현해보겠습니다.

if __name__ == "__main__":
    case_num = 1
    while True:
        exp = input()
        result = compare_operator(exp)
        
        if result == -1:
            break
        else:
            print(f"Case {case_num}: {str(result).lower()}")
            case_num += 1

먼저 문제에서 몇 개를 입력받는지는 알려주지 않고 숫자 사이에 E 가들어간 경우

즉, 연산자로 E가 들어올 경우에 더이상 입력을 받지 않는다고 했습니다.

이에 for 반복문을 활용하지 않고 while 반복문을 활용합니다.

while 반복문을 활용하여 문자열을 한번에 한줄씩 입력 받고 이 입력받은 문자열을 위에서 만들어둔

compare_opeartor 함수에 넣어 결과를 받아와 result에 넣어줍니다.

 

여기서 나온 값이 -1일 경우 while 반복문 break로 종료

그렇지 않을 경우에는 결과를 출력할때 입력 받은 순서대로 1부터 번호를 붙여 출력합니다.

 

저는 f-string을 활용하여 결과를 만들었습니다.

여기서 주의할 점은 문제에서 최종 출력 모양이

Case 1: false
Case 2: false
Case 3: true

위와 같이 true와 false의 맨 앞 글자가 소문자인 것을 주의해야합니다.

저는 평소처럼 그냥 True, False로 나오는 result를 그대로 f-string에 넣고 제출을 눌렀다가 계속 틀렸습니다 결과가 나와

이상했었는데

 

Boolean 값을 그대로 출력했을때 각 값의 맨 앞글자가 대문자로 표기되어 틀리는 것이었습니다.

이에 result값을 string 형식으로 변경 후 이를 lower() 를 활용해 소문자로 만들고나서 출력하면 정답으로 인정되었습니다.

print(f"Case {case_num}: {str(result).lower()}")

여기까지하면 끝입니다.

전체 코드는 아래를 참고해주세요.

👨🏻‍💻 코드 ( Solution )

def compare_operator(exp):
    answer = False
    exp_split = exp.split()
    
    num1, operator, num2 = int(exp_split[0]), exp_split[1], int(exp_split[2])
    
    if operator == "E":
        answer = -1
    elif operator == "!=":
        answer = (num1 != num2)
    elif operator == "<":
        answer = (num1 < num2)
    elif operator == ">":
        answer = (num1 > num2)
    elif operator == "<=":
        answer = (num1 <= num2)
    elif operator == ">=":
        answer = (num1 >= num2)
    elif operator == "==":
        answer = (num1 == num2)
        
    return answer


if __name__ == "__main__":
    case_num = 1
    while True:
        exp = input()
        result = compare_operator(exp)
        
        if result == -1:
            break
        else:
            print(f"Case {case_num}: {str(result).lower()}")
            case_num += 1
 

GitHub - SOMJANG/CODINGTEST_PRACTICE: 1일 1문제 since 2020.02.07

1일 1문제 since 2020.02.07. Contribute to SOMJANG/CODINGTEST_PRACTICE development by creating an account on GitHub.

github.com

Comments