Skip to content
This repository was archived by the owner on Mar 18, 2024. It is now read-only.

[2023-08-21] sumin #137 #149

Merged
merged 5 commits into from
Aug 22, 2023
Merged

[2023-08-21] sumin #137 #149

merged 5 commits into from
Aug 22, 2023

Conversation

ksumini
Copy link
Contributor

@ksumini ksumini commented Aug 21, 2023

PR Summary

풀이시간: 20분

<input>

  • 1 ≤ n ≤ 1,000,000
  • 3 ≤ k ≤ 10

<solution>

  1. n을 k진수로 변환
  2. 소수 판별

<시간복잡도>
O(log_k*n * √n)

@ksumini ksumini self-assigned this Aug 21, 2023
@ksumini ksumini requested a review from Woo-Yeol as a code owner August 21, 2023 04:00
@ksumini ksumini linked an issue Aug 21, 2023 that may be closed by this pull request
result += str(remainder)
return result[::-1]

# 소수 판별(에라토스테네스의 체)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

여기서 고인물 냄새가 나부렀어요 ㅋㅋㅋㅋ
풀이를 위해서 고민한 자와 풀이는 아는데 어떤걸로 할지 고민하신자가 이번 풀이에 너무 눈에 보였습니다 ㅋㅋㅋㅋ

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅋㅋㅋㅋㅋㅋ 고인물냄새
에라토스테네스 체 알고리즘의 시간복잡도가 O(N log log N) 이라고하는데 그럼 그냥 처음부터 끝까지 다 나누는게 더 빠른거 아닌가 생각이 드는데 이 방식이 더 빠르다고 해서요 ㅠㅠ
제가 잘못 이해한걸까요?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 방법은 제가 알고있는 에라토스테네스의 체 알고리즘이 아니라 일반적인 소수 판별 알고리즘같은데, 혹시 주석을 작성하시고 풀이를 바꾼 것이 맞으실까요? 저는 이번 문제에서 에라토스테네스의 체 방식은 굳이 필요 없다고 생각했습니다!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@limstonestone 처음부터 끝까지 다 나누는게 무슨 뜻일까요?? 정확히 질문을 이해를 못 했어요 ㅠㅠㅠ

대충 제 뇌피셜로 도현님의 질문이,
"에라토스테네스의 체는 O(N log log N) 이니까 처음부터 끝까지 다 나누는 O(N)이 더 빠른거 아님?"
라고 생각하고 답을 써보자면..!

소수 판별을 할 때, 도현님이 작성하신 어떤 수 n이 소수인지 확인하는 방법은 2~√n까지 수로 나눴을 때 나눠지는 수가 있는지 확인하는 방식으로 시간복잡도가 O(√n)이 걸리죠? 그건 말 그대로 어떤 수 n 하나에 대해 소수인지 판별하는거죠!!
근데 여기서 문제는 n만 소수인지 확인하는 건 상관없지만, 1부터 n까지 중 소수가 몇 개인지를 구하는데 시간복잡도가 얼마나 걸릴까요? O(n * √n)이 걸리겠죠? 모든 수에 대해 소수인지 판별해야 하니까!!!

그럼 n이 1,000,000이면 O(n * √n)에 대해 연산횟수는 1,000,000 * 1,000 = 1,000,000,000 = 10억번 연산이니까 당연히 시간초과가 나겠죠?

그래서 나온게 에라토스테네스의체이고, 에라토스테네스의 체는 도현님이 알고 계신것처럼 O(N log log N) 의 시간복잡도를 가져요. 그럼 n이 1,000,000이라해도 약 4,316,983 정도의 연산횟수를 갖게되니 시간초과도 안나죠! (대신 메모리는 훨씬 많이 먹음)

결론은 제가 저기 주석을 안지워서 헷갈리셨을 것 같은데..😭(이 문제는 에라토스테네스의 체를 안써도됨)

1. 어떤 수 N이 소수인지 아닌지 판별할 때: 2~√n까지의 수로 나눠보는 방법 -> O(√n)
2. 여러 개의 수가 소수인지 아닌지를 판별할 때: 에라토스테네스의 체 -> O(N log log N)

이렇게 생각하시면 될 것 같습니다!

<추천문제>
image

+그래도 이해가 안되면 소수판별 방법이랑 에라토스테네스의 체 개념을 다시 공부하길..!
https://www.youtube.com/watch?v=9rLFFKmKzno

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@zsmalla 엥 그러네용 ;; 처음에 문제를 대충 읽고 해당 수까지 소수의 개수가 몇 개인지 다 구하는 건줄 알고 에라토스테네스의 체로 코드를 짰다가 지웠는데 저 부분 주석이 안지웠네요 ㅠㅠ 시간복잡도에 작성된 것처럼 O(√n)의 시간복잡도로 해결 가능하고 지수님 말씀처럼 에라토스테네스의 체는 사용하지 않아도 됩니다!!!

converted_num = convert_to_base(n, k) # n을 k진수로 변환
cnt = 0 # 조건에 맞는 소수의 개수
for segment in converted_num.split('0'):
if not segment: # 빈 문자열
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

역시 빈문자열을 제외할 방법이 condition문을 제외하고는 어렵네요 ㅠ

result += str(remainder)
return result[::-1]

# 소수 판별(에라토스테네스의 체)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ㅋㅋㅋㅋㅋㅋ 고인물냄새
에라토스테네스 체 알고리즘의 시간복잡도가 O(N log log N) 이라고하는데 그럼 그냥 처음부터 끝까지 다 나누는게 더 빠른거 아닌가 생각이 드는데 이 방식이 더 빠르다고 해서요 ㅠㅠ
제가 잘못 이해한걸까요?

Copy link
Contributor

@zsmalla zsmalla left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

수민님 다운 깔끔한 풀이 잘 봤습니다! 혹시 다만 이 문제의 로직이 0으로 분할 후 소수 개수를 구한다는 로직에 달한다는 과정이 주석에 설명되어있다면 혹 처음 이 문제를 보는 사람에게 설명하기에 조금 더 좋을 것 같습니다! 고생 많으셨습니다 수민님! 시간 되실 때 코멘트 답변도 부탁드립니다~

result += str(remainder)
return result[::-1]

# 소수 판별(에라토스테네스의 체)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

해당 방법은 제가 알고있는 에라토스테네스의 체 알고리즘이 아니라 일반적인 소수 판별 알고리즘같은데, 혹시 주석을 작성하시고 풀이를 바꾼 것이 맞으실까요? 저는 이번 문제에서 에라토스테네스의 체 방식은 굳이 필요 없다고 생각했습니다!

@ksumini
Copy link
Contributor Author

ksumini commented Aug 21, 2023

수민님 다운 깔끔한 풀이 잘 봤습니다! 혹시 다만 이 문제의 로직이 0으로 분할 후 소수 개수를 구한다는 로직에 달한다는 과정이 주석에 설명되어있다면 혹 처음 이 문제를 보는 사람에게 설명하기에 조금 더 좋을 것 같습니다! 고생 많으셨습니다 수민님! 시간 되실 때 코멘트 답변도 부탁드립니다~

@zsmalla님이 발견해주신 부분 반영해서 코드 다시 커밋해놨습니다 ~! 항상 꼼꼼한 리뷰 감사합니다 지수님!!!
PR하기 전에 좀 더 꼼꼼하게 주석을 다는 연습을 하겠습니다 😭

@ksumini ksumini merged commit a974fae into main Aug 22, 2023
@ksumini ksumini deleted the sumin-#137 branch August 22, 2023 01:23
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

[Programmers] k진수에서 소수 개수 구하기
4 participants