• TOC {:toc}

이 글은 백준 온라인 저지의 1978번 문제를 파이썬(Python)으로 풀이한 것을 모아놓은 글입니다.

일종의 연습 기록이며 제가 정답을 받은 코드와 참고할만한 다른 코드를 같이 기록합니다. 필요한 경우 코드에 대한 해설을 기록합니다만 코드는 통과했어도 해설은 틀릴 수 있기 때문에 가볍게 참고해주시길 부탁드립니다. 피드백은 편하신 방법으로 자유롭게 주시면 감사하겠습니다.

2021.04.13

메모리 시간 코드 길이
28776 KB 72 ms 289 B
N = int(input())
A = list(map(int, input().split()))
P = 0

# 입력받은 수에 대해서 각 수의 소수 여부를 조사한다.
for a in A:
    # 1은 예외 처리한다.
    if a == 1:
        continue

    r = int(a ** 0.5)
    is_prime = True
    # 2부터 현재 값의 제곱근까지의 수를 순회하면서
    for i in range(2, r + 1):
        # 현재 값을 나눴을 때 나누어떨어지는 경우가 있으면
        if a % i == 0:
            # is_prime을 False로 바꾸고
            is_prime = False
            # 반복이 중단된다.
            break
    # 반복이 끝났을 때 is_prime이 계속 True이면
    if is_prime:
        # 소수의 개수(`P`)를 1 증가시킨다.
        P += 1

print(P)

아이디어 & 풀이

입력받은 수에 대해서 각 수의 소수 여부를 조사한다.

  • 2부터 현재 값의 제곱근까지의 수를 순회한다.
  • range()를 사용해 a가 2나 3일 경우 for 문에 진입하지 못하지만, 이 경우는 소수 여부만 판단하는 거고 2와 3은 소수이기 때문에 굳이 진입하지 않아도 괜찮다.

디버그

  • is_primeif_prime으로 오타 내서 틀렸다.

피드백

  • 판단 기준(True or False)을 변수로 결정하지 않고 함수를 작성해서 return 값으로 결정하는 게 더 깔끔한 것 같다.
  • 입력되는 수가 크지 않으면 굳이 제곱근으로 range를 잡아도 되지 않는 것 같다.
    • 제곱근을 사용하면 int로 변환하면서 버려지는 값 때문에 경우가 조금 복잡해져서 번거롭다.
  • 다른 답안에 a가 2인 경우를 따로 True를 반환하도록 예외 처리를 한 경우가 많은데 range를 사용하는 경우에는 a가 2여도 range(2, 2)가 되어 반복문이 실행되지 않기 때문에 문제 되지 않는다.
    • 범위를 잘못 설정하면 a % j == 0에서 2를 2로 나누게 되어 앞의 조건을 만족시킬 수도 있기 때문에 주의하는 게 좋을 것 같다.

참고 답안

# 풀이 1-1
case = int(input())
nums = list(map(int, input().split()))
count = 0


def prime(a):
    if a < 2:
        return False

    for j in range(2, a):
        if a % j == 0:
            return False

    return True


for i in nums:
    if prime_test(i):
        count += 1

print(count)

# 풀이 2
# 한 줄로 코딩한 게 궁금해서 가져왔다.
input()
# print(len([
    ## 입력받은 값 중에서 (정수로 매핑)
    # p for p in map(int, input().split())
    ## 1이 아니고 
    # if p != 1
    ## 2부터 해당 값까지 순회한 모든 값에 대해
    ## 해당 값을 나눈 나머지가 0이 아닐 경우에만 원소로 반환한
    # and all(p % i for i in range(2, p))
# ])) ## 리스트의 원소 개수를 출력
print(len([ p for p in map(int, input().split()) if p != 1 and all(p % i for i in range(2, p))