본문 바로가기
Coding Test (코딩 테스트)

코딩테스트 4일차(1)(2024.10.22) - 2문제

by BioLearner 2024. 10. 23.
반응형

여기서의 해답은 ChatGpt에게 물어본 내용이다.

1. 백준 - 1330 문제 (두 수 비교하기)

처음 제출한 내용

A, B = map(int, input().split())

if A > B:
  print(">")
elif A < B:
  print("<")
elif A == B:
  print("==")

 

정답:

# 두 정수를 입력받음 (공백으로 구분된 입력)
A, B = map(int, input().split())

# 비교 조건을 확인하고 결과를 출력
if A > B:
    print('>')
elif A < B:
    print('<')
else:
    print('==')

 

정답과 해답 모두 얼추 같다. 그러나 공부할 떄는 그 계산을 잘하게 하기 위해 주석을 달아서 공부하는 것은 나쁘지 않다고 생각하기에 그렇게 하도록 해야겠다.

 

기존에 알았던 내용

print(): 값을 출력하는 함수

map(): 연속가능한 값에 연산처리 하는 함수

split(): 공백을 찾아 나누어 리스트화 하는 함수

if, elif, else: 조건문

 

새롭게 알게 된 내용

없음

 

궁금한점

위의 코드를 더욱 더 효과적이고 효율적으로 코딩하는 방법은 없을까?

 

1. 삼항 연산자 활용

삼항 연산자를 사용하면 조건문을 한 줄로 표현할 수 있다.

A, B = map(int, input().split())
print('>' if A > B else '<' if A < B else '==')

 

2. 사전(dictionary)를 활용한 매핑

비교 연산의 결과를 미리 사전에 저장해두고, 조건에 따라 결과를 꺼내는 방법도 있다.

A, B = map(int, input().split())
result = {True: '>', False: '<', A == B: '=='}
print(result[A > B])

 

3. 파이썬 3.10 이상: match-case 구문 사용

파이썬 3.10부터 도입된 match-case 구문을 이용해 보다 직관적으로 코드를 작성할 수도 있다.

A, B = map(int, input().split())

match (A > B, A < B):
    case (True, False):
        print('>')
    case (False, True):
        print('<')
    case _:
        print('==')

 

성능 최적화 방법도 생각해봤는데 성능 최적화를 염두에 둔다면, 현재 작성한 코드에서 크게 개선할 부분이 많지 않다. 

그래도 이와 비슷한 방법을 소개하도록 하겠다.

 

4. 성능 최적화

입력 방식 최적화

input() 함수는 표준 입력에서 데이터를 받아오는 방식인데, 이는 I/O 연산이므로 성능의 병목이 될 수 있다. 대규모 데이터를 입력받는 경우라면 sys.stdin.read를 사용하는 것이 더 빠를 수 있다.

import sys
A, B = map(int, sys.stdin.read().split())
if A > B:
    print('>')
elif A < B:
    print('<')
else:
    print('==')

 

출력 최적화

출력 또한 성능에 영향을 줄 수 있다. 많은 양의 출력을 처리해야 할 경우에는 sys.stdout.write를 사용하는 것이 좋습니다. 다만, 이 문제처럼 간단한 출력을 하는 경우에는 큰 차이가 없지만 대규모 데이터를 출력해야 한다면 효율성을 높일 수 있다.

import sys
A, B = map(int, input().split())
if A > B:
    sys.stdout.write('>\n')
elif A < B:
    sys.stdout.write('<\n')
else:
    sys.stdout.write('==\n')

 

이외에도 메모리 최적화, 타 언어로 성능 극대화, PyPy 사용등의 방식으로 성능을 높이는 방법이 있지만 짧은 코드 같은 경우 필요가 없다. 

 

2. 백준 - 9498 문제 (시험 성적)

처음 제출한 내용

# 시험점수 입력받기
x = int(input())

# 90 ~ 100은 A, 80 ~ 89는 B, 70 ~ 79는 C, 60 ~ 69는 D, 나머지 점수는 F
match (x <= 100, x < 90, x < 80, x < 60):
  case(True, False, False, False):
    print("A")
  case(False, True, False, False):
    print("B")
  case(False, False, True, False):
    print("C")
  case(False, False, False, True):
    print("D")
  case _:
    print("F")

 

 

  • match는 일반적으로 값 매칭에 사용되며, 여러 논리 조건을 동시에 비교하는 데 적합하지 않다.
  • match 문에서의 조건 자체가 잘못된 방식으로 전달되고 있다. 논리 조건을 비교하려면 if-else 구문을 사용하는 것이 더 적합하다.

배운 것을 어설프게 공부해서 잘 못풀게 된 것 같다. 그래도 틀리면서 배우는 것이기에 다른 시도를 안하지는 않도록 할 예정이다.

 

정답:

# 시험점수 입력받기
x = int(input())

# 90 ~ 100은 A, 80 ~ 89는 B, 70 ~ 79는 C, 60 ~ 69는 D, 나머지 점수는 F
if 90 <= x <= 100:
    print("A")
elif 80 <= x < 90:
    print("B")
elif 70 <= x < 80:
    print("C")
elif 60 <= x < 70:
    print("D")
else:
    print("F")

 

기존에 알았던 내용

위와 내용이 같음

 

새롭게 알게 된 내용

없음

 

궁금한점

없음


자기 평가

  1. 문제 이해: 두 문제 모두 문제의 요구 사항을 정확히 이해하고, 적절한 조건문을 사용하여 해결하려고 했다는 점은 긍정적이다. 특히, 다양한 접근 방법을 제시한 것은 좋은 시도다.
  2. 코드의 효율성: 삼항 연산자, 사전 매핑, match-case 구문 등을 활용한 다양한 코드 최적화 방법을 생각한 점은 매우 인상적이다. 성능 최적화 부분도 잘 고려했다. 특히 I/O 성능을 개선할 수 있는 방법을 제시한 것은 좋은 인사이트다.
  3. 실수와 학습: 시험 성적 문제에서 match-case 구문을 부적절하게 사용한 점은 아쉬운 부분이지만, 이를 통해 올바른 조건문 사용에 대해 다시 생각해보게 된 점은 긍정적인 학습 경험으로 볼 수 있다.

앞으로의 개선 방향

  1. 코드 주석 활용: 코드에 대한 주석을 더 적극적으로 활용하여, 각 부분이 어떤 역할을 하는지 명확히 설명하는 습관을 기르면 좋겠다. 이는 나중에 코드를 다시 읽을 때 유용하다.
  2. 에러 핸들링: 입력 값에 대한 유효성 검사를 추가하는 것도 좋은 연습이 될 것이다. 예를 들어, 시험 성적 입력 시 범위 검사 등을 통해 잘못된 입력에 대한 처리를 추가하면 코드의 안정성이 높아진다.
  3. 다양한 알고리즘 연습: 조건문 외에도 다른 알고리즘이나 자료 구조를 활용한 문제 해결 방법에 대해 더 깊이 공부하면 좋겠다. 다양한 문제를 풀어보는 경험이 실력을 향상시키는 데 큰 도움이 될 것이다.
  4. 리뷰 및 피드백 받기: 다른 사람에게 코드를 보여주고 피드백을 받는 것도 매우 유익할 것이다. 다양한 시각에서의 의견은 새로운 아이디어나 개선점을 발견하는 데 도움이 된다.
반응형