정글에서 온 개발자

알고리즘, 코드로 반례 찾기 본문

알고리즘

알고리즘, 코드로 반례 찾기

dev-diver 2024. 5. 10. 02:31

코드

import random
A = 0 # 구간의 최소값
B = 1000 # 구간의 최대값
L = 100 # 배열 최대 크기

def correct_solution(numbers):
  answer = numbers
  # 정답 코드
  return answer

def my_solution(numbers):
  answer = numbers
	# 내 풀이 코드
  return answer
                   
def generate_random_numbers(a,b,n):
  return [random.randint(a,b) for _ in range(n)]

def compare_solution(numbers, i=0):
  result1 = correct_solution(numbers)
  result2 = my_solution(numbers)
  if result1 != result2:
    print(f"Test {i} failed")
    print(f"Input: {numbers}")
    print(f"correct: {result1}")
    print(f"mine: {result2}")
  else:
    print(f"Test {i} passed")

def compare_solutions(test_count):
  for i in range(1,test_count+1):
    numbers = generate_random_numbers(A,B,L)
    compare_solution(numbers, i)
  print("Comparison completed.")

compare_solution([0,0]) # 엣지 케이스 테스트
compare_solutions(100) # 무작위 숫자를 생성하여 비교 테스트
  • 코드에 나와있듯이 무작위로 배열을 만들어서 정답을 비교하고 맞으면 pass, 틀리면 자세한 로그를 출력한다.

사용 후기

  • A~B의 범위, 배열의 최대 크기가 작으면 반례를 찾을 확률이 늘어났다.
  • 테스트 횟수는 100~200 정도로 맞추고 범위를 줄이는 게 좋다.
  • 엣지 케이스는 따로 돌려보면 좋다.

번외

  • 프로그래머스나 leetCode, Codility 등은 다음과 같이 solution 함수로 정답을 제출한다.
def solution(numbers):
    return answer
  • 위와 같은 구조는 프로그래머스의 IDE 상에서도 아래 간단한 코드를 더해서 간단한 엣지 케이스 테스트를 해보기 편하다.
print(solution([0,0])
  • 해당 IDE는 solution의 입출력만 검사하기 때문에, 테스트시에 정답 여부에 영향을 미치지 않는다

코드

import random
A = 0 # 구간의 최소값
B = 1000 # 구간의 최대값
L = 100 # 배열 최대 크기

def correct_solution(numbers):
  answer = numbers
  # 정답 코드
  return answer

def my_solution(numbers):
  answer = numbers
	# 내 풀이 코드
  return answer
                   
def generate_random_numbers(a,b,n):
  return [random.randint(a,b) for _ in range(n)]

def compare_solution(numbers, i=0):
  result1 = correct_solution(numbers)
  result2 = my_solution(numbers)
  if result1 != result2:
    print(f"Test {i} failed")
    print(f"Input: {numbers}")
    print(f"correct: {result1}")
    print(f"mine: {result2}")
  else:
    print(f"Test {i} passed")

def compare_solutions(test_count):
  for i in range(1,test_count+1):
    numbers = generate_random_numbers(A,B,L)
    compare_solution(numbers, i)
  print("Comparison completed.")

compare_solution([0,0]) # 엣지 케이스 테스트
compare_solutions(100) # 무작위 숫자를 생성하여 비교 테스트
  • 코드에 나와있듯이 무작위로 배열을 만들어서 정답을 비교하고 맞으면 pass, 틀리면 자세한 로그를 출력한다.

사용 후기

  • A~B의 범위, 배열의 최대 크기가 작으면 반례를 찾을 확률이 늘어났다.
  • 테스트 횟수는 100~200 정도로 맞추고 범위를 줄이는 게 좋다.
  • 엣지 케이스는 따로 돌려보면 좋다.

번외

  • 프로그래머스나 leetCode, Codility 등은 다음과 같이 solution 함수로 정답을 제출한다.
def solution(numbers):
    return answer
  • 위와 같은 구조는 프로그래머스의 IDE 상에서도 아래의 간단한 코드를 더해서 간단한 엣지 케이스 테스트를 해보기 편하다.
print(solution([0,0])
  • 해당 IDE는 solution의 입출력만 검사하기 때문에, 테스트시에 정답 여부에 영향을 미치지 않는다.

아래 출력이 테스트한 결과다.

백준 코드도 이런식으로 입,출력을 함수로 감싸는 습관을 들이면 테스트에 도움이 될 것 같다.