728x90
소수를 구하는 문제였다.
풀이
def isPrime(data):
cnt = 0
for i in data:
for j in range(2, i + 1):
if i % j == 0:
if j == i:
cnt += 1
break
print(cnt)
n = int(input())
data = list(map(int, input().split()))
isPrime(data)
위에서 사용한 코드의 설명을 들어보겠다. 예를 들어 3이라면 (입력값 = 1 \n 3)
i = 3 j = 2(에서 4까지 증가)
만약 i % j 가 나누어떨어진다면, i 와 j 가 같은지 비교, 같다면 카운트 증가(= 소수이다)
이므로 3일경우 3 % 3이 될 때 3 == 3이므로 카운트는 증가할 것이다.
트러블 슈팅 (해결)
처음에 데이터 입력을
n = int(input())
for i in range(n):
num = int(input())
...
이런식으로 받으려고 했었는데, 저 형태를 유지하면서 space로 하나씩 입력받는 법을 몰라서 다시 list map으로 변경했다.
그리고 소수를 원래는 제곱근을 이용해서 풀려고 했어서 int(math.sqrt(i))
를 시도했는데, 제곱근으로 푸는 것이 더 잘 안돼서 그냥 2 ~ 그수 + 1 까지 for문을 돌렸다. 나누어떨어질때 그 수와 for 문 내 변수(j)가 같으면 소수이다 라는 방법으로 시도하였다. 근데 제곱근을 쓰면 O(n^2)에서 O(√n)까지 줄일 수 있을거 같아서 좀 아쉽다.
이는 이후 푼 문제인 소수 구하기에서 사용한 제곱근 방식을 통해 해결했다!
def isPrime(data):
cnt = 0
for i in data:
if i <= 1:
continue
for j in range(2, int(i ** 0.5) + 1):
if i % j == 0:
break
else:
cnt += 1
print(cnt)
n = int(input())
data = list(map(int, input().split()))
isPrime(data)
최종 코드
최종 코드는 위에 기재한 두가지 모두이다. 왜냐면 결국 시간복잡도는 이중 for문으로 인해 O(n^2)라서, 비슷한 결과를 가져올 것 같다.
'Algorithm > 백준' 카테고리의 다른 글
[백준] 6588: 골드바흐의 추측 (1) | 2023.10.14 |
---|---|
[백준] 1929번: 소수 구하기 (0) | 2023.10.14 |
[백준] 17427: 약수의 합 2 (1) | 2023.10.01 |
댓글