inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

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

해결된 질문

467

다롱이

작성한 질문수 3

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)

python 코딩-테스트 알고리즘

답변 3

1

코딩 센세

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

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 인턴

안녕하세요 다롱이 님, 인프런 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)

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

dp[x]가 최대값이라고 확신할수 있는 이유

0

45

1

1090번 문제 질문

0

150

1

유니온파인드

0

112

1

투포인터 25:15 질문

1

128

1

#1090번 문제 반례가 궁금합니다.

0

148

1

예제코드 자바입니다

1

186

1

정수론 파트 #2247 문제에 대한 질문입니다!

0

102

0

코드 오류

0

185

1

2강 정수론 문제3 #1407 질문

0

127

0

이차원 배열 (int형)dp로 0 혹은 -1로 체크하는 방법 말고 boolean형 배열로 체크해서 바로 리턴해줄 수 없나요?

0

154

0

1717번 최적화

0

112

0

백준 22988 문제 질문

1

193

2

[Python] 백준 1090번 문제

1

226

3

강의자료에서

1

162

2

2503 문제 제한 조건 질문!

1

249

2

백준 22988 번 문제

1

193

1

추가 강의 순서

1

180

2

(*문제 풀이)1090 테스트케이스 1번 C++

1

221

2

7강 RGB 색칠하기 질문 있습니다.

1

160

2

정수론 약수 빠르게 구하기 질문

1

257

1

1090 문제의 2, 3번째 아이디어는 결국 같은거 아닌가요?

1

373

2

1090 문제 관련하여 맨해튼 거리 최솟값에 대해 질문 있습니다.

1

223

2

누적합 문제 3번 질문

1

216

2

기억 ( 누적합 ) 강의 11660 문제

1

163

2