코딩테스트 - 조건 문자열

SSO·2024년 11월 14일

문제 설명

문자열에 따라 다음과 같이 두 수의 크기를 비교하려고 합니다.

두 수가 n과 m이라면
">", "=" : n >= m
"<", "=" : n <= m
">", "!" : n > m
"<", "!" : n < m
두 문자열 ineq와 eq가 주어집니다. ineq는 "<"와 ">"중 하나고, eq는 "="와 "!"중 하나입니다. 그리고 두 정수 n과 m이 주어질 때, n과 m이 ineq와 eq의 조건에 맞으면 1을 아니면 0을 return하도록 solution 함수를 완성해주세요.


제한 사항

1 ≤ n, m ≤ 100


입출력 예

ineq eq n m result
"<" "=" 20 50 1
">" "!" 41 78 0


입출력 예 설명

입출력 예 #1

20 <= 50은 참이기 때문에 1을 return합니다.
입출력 예 #2

41 > 78은 거짓이기 때문에 0을 return합니다.


풀이(개인)

def solution(ineq, eq, n, m):
    answer = 0
    if ineq == ">" and eq =="=":
        if n >= m:
            return 1
        else:
            return 0
    elif ineq == ">" and eq =="!":
        if n > m:
            return 1
        else:
            return 0
    elif ineq == "<" and eq == "=":
        if n <= m:
            return 1
        else:
            return 0
    elif ineq == "<" and eq == "!":
        if n < m:
            return 1
        else:
            return 0

다른 사람들의 풀이

def solution(ineq, eq, n, m):
    answer = 0
    if n > m and ineq ==">":
        answer = 1
    elif n < m and ineq == "<":
        answer = 1
    elif n == m and eq == "=":
        answer = 1
	return answer
def solution(ineq, eq, n, m):
    answer = 0

    if (ineq, eq) == ('<', '='):
        answer = int(n <= m)
    elif (ineq, eq) == ('>', '='):
        answer = int(n >= m)
    elif (ineq, eq) == ('<', '!'):
        answer = int(n < m)
    elif (ineq, eq) == ('>', '!'):
        answer = int(n > m)
    else:
        return 'wrong input'

    return answer
def solution(ineq, eq, n, m):
    if ineq+eq == ">=":
        answer = bool(n >= m)
    elif ineq+eq == "<=":
        answer = bool(n <= m)
    elif ineq+eq == ">!":
        answer = bool(n > m)
    elif ineq+eq == "<!":
        answer = bool(n < m)
    return 1 if answer == True else 0
def solution(ineq, eq, n, m):
    answer = 0;

    if n >= 1 and n <= 100 and m >= 1 and m <= 100:
        compareChars = {
            ">=": n >= m,
            "<=": n <= m,
            ">!": n > m,
            "<!": n < m
        };
        answer = int(compareChars[ineq + eq]);

    return answer;
def solution(ineq, eq, n, m):
    return int(eval(str(n)+ineq+eq.replace('!', '')+str(m)))

eval란?

eval() 함수는 파이썬에서 주어진 문자열을 Python 표현식으로 실행하고 그 결과를 반환하는 내장 함수이다. 예를 들어, eval()을 사용하면 문자열로 표현된 파이썬 코드나 수식을 실행할 수 있다.

기본 문법

eval(expression, globals=None, locals=None)
  • expression: 실행할 파이썬 표현식이 들어있는 문자열이다.
  • globals (선택적): 글로벌 네임스페이스로, 기본값은 현재 네임스페이스이다.
  • locals (선택적): 로컬 네임스페이스로, 기본값은 현재 네임스페이스이다.

예제

  1. 수학식 평가

    expression = "3 + 4 * 2"
    result = eval(expression)
    print(result)  # 출력: 11
  2. 변수 사용

    x = 10
    expression = "x * 2"
    result = eval(expression)
    print(result)  # 출력: 20
  3. 함수 호출

    def add(a, b):
        return a + b
    
    expression = "add(3, 5)"
    result = eval(expression)
    print(result)  # 출력: 8

주의사항

  • eval()은 코드 실행을 다루기 때문에 보안 위험이 있다. 사용자가 입력한 값을 eval()로 실행하면 악의적인 코드가 실행될 수 있다. 예를 들어, 사용자 입력으로 os.system('rm -rf /')와 같은 명령이 전달되면 시스템에 치명적인 영향을 미칠 수 있다.
  • 안전하게 사용하려면 입력값을 엄격히 검증하거나, eval() 대신 다른 방법(예: ast.literal_eval())을 사용하는 것이 좋다.

eval()의 대안

  • ast.literal_eval(): eval()과 비슷하지만, 수학식, 리스트, 튜플, 딕셔너리 등 안전한 리터럴 표현만을 평가한다. 위험한 코드 실행을 방지할 수 있다.

    import ast
    result = ast.literal_eval("[1, 2, 3]")
    print(result)  # 출력: [1, 2, 3]

결론적으로, eval()은 매우 유용하지만, 주의 깊게 사용해야 하며, 가능하면 다른 방법으로 대체할 수 있는지 고려하는 것이 좋다.


다른 사람들의 풀이 방법을 찾아보면서 모르는 함수에 관해, 이에 대한 주의점 및 대안까지 알게되는 시간을 가졌다.
앞으로도 공부를 꾸준히하되, 모르는 부분을 이런 방식으로 채워나가면 될 것 같다는 생각이 들었다.

profile
개발자로 한걸음씩!

0개의 댓글