Python/online judge

백준 [1978.소수 찾기] | Python

구름솜:D 2024. 1. 4. 18:26
728x90

✏️ 문제

https://www.acmicpc.net/problem/1978

 

1978번: 소수 찾기

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

www.acmicpc.net

 

✏️ 풀이방법

1. 리스트(num)에 소수인지 확인할 수를 입력 

2. 1은 소수가 아니기 때문에 pass

3. 리스트(prime)를 선언하여 소수인지 판별하는 수의 약수를 추가

4. 소수는 1과 자기자신만을 약수로 가지는 수이기 때문에 리스트(prime)의 길이가 2이면 소수

 

 

📌 코드

n = int(input())
num = list(map(int,input().split()))
cnt = 0
for i in range(n):
    prime = []
    if num[i] == 1:
        pass
    else:
        for j in range(1,num[i]+1):
            if num[i]%j==0:
                prime.append(j)
    if len(prime) ==2:
        cnt +=1
print(cnt)
n = int(input())
num = list(map(int,input().split()))
cnt = 0
for i in num:
    prime = []
    if i == 1:
        pass
    else:
        for j in range(1,i+1):
            if i % j ==0:
                prime.append(j)
    if len(prime) ==2:
        cnt +=1
print(cnt)

 

 

📌 결과

# 입력
4
1 3 5 7

# 출력
3

 

 

🤔 시행착오.1

n = int(input())
num = []
for i in range(n):
    num.append(int(input()))
print(num)
    num.append(int(input()))
               ^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: '1 3 5 7'

- 데이터 형변환 시 값을 잘못 넣었을 때 발생하는 에러로 int()로 형변환을 하려면 input()으로 받은 값이 숫자여야하는데 '1 3 5 7'로 유효하지 않은 값이 들어가서 발생했다.

 

 

🤔 시행착오.2

n = int(input())
num = []
for i in range(n):
    num.append(input().split())
print(num)
[['1', '3', '5', '7'], [], [], []]

-  시행착오1과 같은 에러를 수정하려고 input값을 split하면 하나씩 받을 수 있을거라 생각했던 것 같다. split()메소드는 리스트를 반환하기 때문에 1번째 원소에 리스트형태로 들어간 것이다.

 

 

🤔 시행착오.3

n = int(input())
num = []
for i in range(n):
    num.append(int(input().split()))
print(num)
    num.append(int(input().split()))
               ^^^^^^^^^^^^^^^^^^^^
TypeError: int() argument must be a string, a bytes-like object or a real number, not 'list'

- int()형으로 형변환을 하려면 문자열이 인자로 들어가야 숫자형타입으로 형변환을 할 수 있는데 split()메소드로 반환된 리스트가 인자로 들어가서 에러가 발생했다.

 

 

🤔 시행착오.4

n = int(input())
num = []
for i in range(n):
    num.append(map(int,input().split()))
print(num)
[<map object at 0x000001B8DAE4BCA0>, <map object at 0x000001B8DAE6D0F0>, <map object at 0x000001B8DAE6D150>, <map object at 0x000001B8DAE6D1E0>]

- 시행착오3을 해결하기 위해서 map함수를 사용했는데 map함수는 이터레이터로 주소값을 가지고 있기 때문에 값을 반환하기 위한 자료형이 필요하다.

 

 

🤔 시행착오.5

n = int(input())
num = []
for i in range(n):
    num.append(list(map(int,input().split())))
print(num)
[[1, 3, 5, 7], [], [], []]

- 시행착오4를 해결하려고 list자료형에 담았는데 다음과 같이 담겼다. append는 입력된 값을 하나의 원소로 추가하기 때문에 첫번째 원소에 한 번에 다 들어간 것이다. 우선 입력값에서 계속 잘못된건 1차원리스트로 [1,3,5,7]을 입력받으려고 하는건데 이미 리스트안의 리스트로 추가하는 2차원리스트형태로 만들어놓고 값을 넣으려고 했기에 제대로 실행되지 않은 것이다.

 

 

🔎 다른풀이.1

n = int(input())
num = list(map(int, input().split()))
cnt = 0

for i in num:
  for j in range(2, i+1):
    if i % j == 0:
      if i == j:
        cnt += 1 
      break

print(cnt)

-  1은 소수에 해당하지 않기 때문에 2부터 나누었을 때 나누어 떨어지는 수가 있다면 반복문을 break 하고 break없이 마지막 자기 자신까지 반복문이 실행 된다면 그 수는 소수에 해당된다.

 

 

🔎 다른풀이.2

https://kevinitcoding.tistory.com/entry/%EB%B0%B1%EC%A4%80Python-1978%EB%B2%88-%EC%86%8C%EC%88%98-%EC%B0%BE%EA%B8%B0-%EB%AC%B8%EC%A0%9C

 

 

 

📝 메모

- 내 코드는 소수를 구별하는데 있어서 리스트를 사용해서 1과 자기자신만을 약수로 갖을 경우 리스트의 길이가 2인 것을 활용

- 찾아본 코드는 소수를 구별하는데 있어서 소수는 1에 해당하지 않아서 제외하고 2부터 연산하며 break를 활용

 

 

📒 다시보기

 

[Python] 02. 파이썬의 2차원리스트(list)

파이썬의 내장된 라이브러리에서는 크기를 정하여 생성하는 배열의 개념이 없어 리스트가 이를 대체한다. 파이썬에서 배열을 사용하기 위해서는 array module또는 Numby package등 외부 라이브러리를

somin0416.tistory.com