본문 바로가기
  • 머킹이의 머신로그
오늘부터 코딩테스트

[오늘부터 코딩테스트]파이썬으로 프로그래머스 코딩 입문 프로그램 풀기

by 머킹 2023. 12. 15.
728x90

[파이썬] 프로그래머스  Lv0. OX퀴즈

안녕하세요 머킹입니다.

드디어 이사가 끝났습니다!!!! 야호!!!!!!!!!

 


OX퀴즈

 

 

def solution(quiz):
    answer = []

    for i in quiz:
        div = i.split(' ')
        if div[1] == '-':
            a = int(div[0]) - int(div[2])
            answer.append("O" if a == int(div[4]) else "X")
        elif div[1] == '+':
            a = int(div[0]) + int(div[2])
            answer.append("O" if a == int(div[4]) else "X")

    return answer

이렇게 풀었습니다!

 

은근 생각을 많이 했던 문제였습니다

 

[풀이 설명]

  1. solution 함수는 quiz라는 이름의 매개변수를 받습니다. 이 quiz는 문자열로 된 퀴즈들의 리스트입니다.
  2. answer라는 빈 리스트를 초기화합니다. 이 리스트는 퀴즈 결과를 저장할 것입니다.
  3. for i in quiz: 루프를 사용하여 각각의 퀴즈에 대해 아래의 작업을 반복합니다.
  4. i.split(' ')를 사용하여 현재 퀴즈를 공백을 기준으로 나눕니다. 이렇게 나눈 결과는 div 리스트에 저장됩니다.
  5. div [1]이 연산자를 나타냅니다. 만약 연산자가 '-'이면, int(div [0]) - int(div [2])를 계산하여 a에 저장합니다. 그리고 a가 int(div [4])와 같다면 "O"를, 다르다면 "X"를 answer 리스트에 추가합니다.
  6. 만약 연산자가 '+'이면, int(div[0]) + int(div[2])를 계산하여 a에 저장합니다. 그리고 a가 int(div[4])와 같다면 "O"를, 다르다면 "X"를 answer 리스트에 추가합니다.
  7. 모든 퀴즈에 대한 평가가 끝나면 최종적인 answer 리스트를 반환합니다.

 

이런 논쟁(?)이 있었는데요.

되게 흥미로운 주제였습니다.

궁금해서 한 번 찾아봤어요.

 

 

파이썬 문서에는 이렇게 설명이 되어있습니다.

왜 보안이슈가 있을까에 대해서 더 찾아보니 아래와 같다고 합니다.

 

 

  1. 보안 취약점과 악용 가능성: eval()은 임의의 코드를 실행할 수 있기 때문에, 사용자 입력이나 외부 소스로부터의 데이터를 포함하는 문자열을 평가하는 것은 매우 위험합니다. 사용자가 제어할 수 없는 데이터가 평가될 경우, 악의적인 코드가 실행될 가능성이 있습니다.
  2. 명령어 주입 (Code Injection): 사용자가 입력한 문자열이 그대로 eval()에 전달되면, 사용자가 의도하지 않은 코드가 실행될 수 있습니다. 이는 보안 취약점으로 이어질 수 있습니다.
  3. 보안 정책 회피: eval()을 사용하면 보안 정책을 우회하거나 우회할 수 있는 시도가 발생할 수 있습니다. 이는 코드의 의도치 않은 동작을 초래할 수 있습니다.
  4. 약한 예외 처리: eval()은 구문 오류가 발생하면 예외를 발생시키지만, 런타임 오류는 잡지 않습니다. 따라서 잘못된 코드가 프로그램을 중단시킬 수 있습니다.
  5. 비용이 높은 동적 코드 실행: eval()은 실행 시간에 코드를 동적으로 컴파일하고 실행하므로, 코드 실행에 비용이 발생합니다. 무분별한 사용은 성능에 영향을 미칠 수 있습니다.

안전성과 보안을 고려할 때, eval()을 사용하는 것은 피하는 것이 좋습니다. 대신에 안전한 방법으로 사용자 입력을 처리하거나, 더 안전한 대안을 사용하는 것이 권장됩니다. 안전한 대안으로는 ast.literal_eval() 함수나 필요한 작업에 따라 특정한 파싱 또는 검증 방법을 사용하는 것이 있습니다.

 

 


 

흥미로운 코테였습니다~!