인프런 커뮤니티 질문&답변

다롱이님의 프로필 이미지
다롱이

작성한 질문수

2주만에 통과하는 알고리즘 코딩테스트 (2024년)

최적화 (정수론) - ( 난이도 ⭐️⭐️⭐️⭐️⭐️ , 스킵하셔도 괜찮습니다. )

(해결)정수론 #1978 자바코드로는 통과, 파이선으로는 통과가 안돼요...

해결된 질문

작성

·

371

·

수정됨

1

+) 자바코드로는 통과했습니다. 파이썬코드로는 왜 통과를 못하는 걸까요?ㅠㅠ

import java.util.Scanner;


public class Main {
    public static void main(String[] args) {
       Scanner s = new Scanner(System.in);
        int N = s.nextInt();
        int [] num = new int[N];
        int cnt = 0;

        for(int i = 0; i<N; i++){
            num[i] = s.nextInt();

            if(num[i] == 1) continue;

            int j;

            for( j= 1; j<(int)Math.sqrt(num[i])+1; j++){
                if((num[i] % j == 0) & (j != 1)) break;
            }
            if(j == (int)Math.sqrt(num[i])+1) cnt += 1;
        }

        System.out.println(cnt);

    }
}

 

 

파이선은 백준에 제출했는데 틀렸다고 나옵니다... 제 알고리즘에 문제를 찾아주실 수 있나요?ㅠㅠ

import math

#약수 빠르게 구하기(n의 제곱근까지만 구하기)
#1978
N = int(input())
num = list(map(int, input().split())) 
cnt = 0

for i in range(len(num)):
    if num[i] == 1:
        continue

    for j in range(1, int(math.sqrt(num[i])+1)):
        if ((num[i] % j == 0) & (j != 1)):
            break
     
    if (j*j != num[i]) & (j == int(math.sqrt(num[i]))):
        cnt += 1

print(cnt)

답변 3

1

코딩 센세님의 프로필 이미지
코딩 센세
지식공유자

해결 축하드립니다 :)!! 늦게 봐서 죄송해요!!!

다롱이님의 프로필 이미지
다롱이
질문자

넵 항상 강의 잘 보고있습니다! 도움이 많이됩니다!ㅎㅎ

1

다롱이님의 프로필 이미지
다롱이
질문자

아래 같이 수정해서 파이선 코드도 성공했습니다.

자바는 for문 마지막에 j가 증가하고 끝나는데 파이선은 그렇지 않아서 조건문에 j -= 1를 추가해서 해결했습니다.

import math

#약수 빠르게 구하기(n의 제곱근까지만 구하기)
#1978
N = int(input())
num = list(map(int, input().split())) 
cnt = 0

for i in range(N):
    if num[i] == 1:
        continue
    
    j = 0
    for j in range(1, int(math.sqrt(num[i]))+1):
        if ((num[i] % j == 0) and (j != 1)): #1외에 나누어떨어지는 수가 있다면 소수x
            # print(num[i], j)
            j -= 1
            break
    
    # print(num[i], j)
    if ( (j == int(math.sqrt(num[i]))) and (num[i] != (j*j))):
        # print(num[i], j)
        cnt += 1

print(cnt)

0

안녕하세요 다롱이 님, 인프런 AI 인턴이에요.
자바 코드와 파이썬 코드를 비교해보니 약간의 차이가 있습니다. 자바 코드에서는 (num[i] % j == 0) & (j != 1)로 조건을 검사하고 있는 반면, 파이썬 코드에서는 (num[i] % j == 0) & (j != 1)가 될 때 break를 실행하고 있습니다.

파이썬에서의 비트 연산자 AND는 앰퍼샌드(&)입니다. 하지만 파이썬에서 논리 연산자 AND는 엠퍼샌드(and)입니다. 따라서, 파이썬 코드에서는 (num[i] % j == 0) and (j != 1)로 조건을 검사해야 합니다.

다음과 같이 수정하면 파이썬 코드가 정상적으로 동작할 수 있을 것입니다.

import math

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

for i in range(len(num)):
    if num[i] == 1:
        continue

    for j in range(2, int(math.sqrt(num[i])+1)):
        if (num[i] % j == 0):
            break

    if (j*j != num[i]) and (j == int(math.sqrt(num[i]))):
        cnt += 1

print(cnt)

이렇게 코드를 수정하시고 다시 테스트를 진행해보세요. 문제가 해결되길 바랍니다!

다롱이님의 프로필 이미지
다롱이

작성한 질문수

질문하기