Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TONY] WEEK 01 solutions #299

Merged
merged 5 commits into from
Aug 16, 2024
Merged

[TONY] WEEK 01 solutions #299

merged 5 commits into from
Aug 16, 2024

Conversation

@dev-jonghoonpark
Copy link
Contributor

PR 제목을 이름과 주차 내용이 나오게 해주시면 좋을 것 같습니다.

e.g.

  • [박종훈] 1주차 답안 제출
  • [SAM] WEEK 1 solutions

@dev-jonghoonpark
Copy link
Contributor

image

파일 마지막줄에 개행문자를 포함시켜주시는게 좋습니다.

intellij 를 사용중이시라면 https://stackoverflow.com/a/16761228 를 참고해보시면 좋을 것 같습니다.

@dev-jonghoonpark
Copy link
Contributor

PR 만드시고 나면 project 와 iterator 설정까지 부탁드립니다 : )
이번꺼는 제가 해두었습니다.

@dev-jonghoonpark
Copy link
Contributor

봤을 때 시간 복잡도만 정리해주신것 같은데
공간 복잡도도 정리해봐주시면 좋을 것 같네요~

@TonyKim9401 TonyKim9401 force-pushed the main branch 2 times, most recently from 95b2f16 to 5bd8c0e Compare August 11, 2024 10:21
@TonyKim9401 TonyKim9401 changed the title Comment: containsDuplicate [TONY] WEEK 01 solutions Aug 11, 2024
@BEMELON
Copy link
Contributor

BEMELON commented Aug 11, 2024

안녕하세요! 처음 인사드립니다 😀
내용에 중복된 문항이 있는 것 같아요 ㅎㅎ
#237 이 두번 들어갔네요! (변경되어야 하는 내용은 #252 입니다 🙏)

@jdalma jdalma self-requested a review August 13, 2024 11:59
@TonyKim9401
Copy link
Contributor Author

PR 만드시고 나면 project 와 iterator 설정까지 부탁드립니다 : ) 이번꺼는 제가 해두었습니다.

감사합니다! 2주차 부터는 잊지않고 추가하겠습니다!

visitTreeNode(node.right);
}
// time complexity: O(n), visit all nodes once
// space complexity: O(1), used an array list
Copy link
Member

Choose a reason for hiding this comment

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

nums 리스트에 트리들의 값을 누적하면 최악의 경우에는 O(n)을 차지할 것 같습니다 ㅎㅎ

Copy link
Contributor Author

Choose a reason for hiding this comment

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

감사합니다! 잘못 생각했네요ㅜ

@@ -0,0 +1,21 @@
class Solution {
public int hammingWeight(int n) {
Copy link
Member

Choose a reason for hiding this comment

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

주석으로 처리하신 while문으로 입력을 나누어 해결하는 방법의 시간복잡도는 O(log n)이 걸릴 것 같은데, Integer.bitCountO(1)이라고 봐야할까요??

  public static int bitCount(int i) {
      // HD, Figure 5-2
      i = i - ((i >>> 1) & 0x55555555);
      i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
      i = (i + (i >>> 4)) & 0x0f0f0f0f;
      i = i + (i >>> 8);
      i = i + (i >>> 16);
      return i & 0x3f;
  }

단순 연산으로 처리하고 있어서 O(log n)이라고 보기 힘들지 않을까 싶은데, 토니님은 어떻게 생각하시나요??

Copy link
Contributor Author

Choose a reason for hiding this comment

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

리뷰 주셔서 감사합니다!
확인해본 결과는 다음과 같습니다.

Integer.bitCount(n) : 시간 복잡도 O(1), 공간 복잡도 O(1)

  • Integer.bitCount의 경우 내부 함수가 O(1)의 시간 복잡도로 만들어져 있다고 합니다!

while 반복문: 시간 복잡도 O(log n), 공간 복잡도 O(1)

Copy link
Member

Choose a reason for hiding this comment

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

Integer.bitCount의 경우 내부 함수가 O(1)의 시간 복잡도로 만들어져 있다고 합니다!

오 그렇군요 ㅎㅎ 확인해주셔서 감사합니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

@TonyKim9401 Integer.bitCount(n)의 시간 복잡도가 O(1)이라는 것에 대한 레퍼런스 좀 공유해주실 수 있으실까요? 내부적으로 도대체 어떤 알고리즘을 썼길래 입력 값에 무관하게 일정한 시간이 걸리는지 궁금합니다.

Copy link
Contributor

Choose a reason for hiding this comment

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

@DaleSeo 위에 jdalma 님께서 올려주신 코드가 내부적으로 사용하는 코드이네요.

Copy link
Contributor

Choose a reason for hiding this comment

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

네네, 덕분에 저도 배웠네요! 이런 코드가 실제 코딩 테스트에서 유리할 지 불리할 지에 대해서 모임 때 같이 얘기해보면 좋을 것 같습니다.

@TonyKim9401 TonyKim9401 requested a review from jdalma August 14, 2024 19:59
@TonyKim9401 TonyKim9401 changed the title [TONY] WEEK 01 solutions [JAVA][TONY] WEEK 01 solutions Aug 14, 2024
@TonyKim9401 TonyKim9401 requested a review from DaleSeo August 14, 2024 20:09
@TonyKim9401 TonyKim9401 reopened this Aug 14, 2024
@TonyKim9401 TonyKim9401 marked this pull request as ready for review August 14, 2024 20:09
Copy link
Contributor

@DaleSeo DaleSeo left a comment

Choose a reason for hiding this comment

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

몇 가지 질문이랑 제안을 남겼지만, 전반적으로 문제를 잘 푸신 것 같습니다. 수고 많으셨습니다.

#299 (comment) 피드백 참고하셔서 PR 병합 전에 각 파일에 마지막 줄에 ⛔ 표시 없애주시길 부탁드립니다.

contains-duplicate/TonyKim9401.java Show resolved Hide resolved
@@ -0,0 +1,21 @@
class Solution {
public int hammingWeight(int n) {
Copy link
Contributor

Choose a reason for hiding this comment

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

@TonyKim9401 Integer.bitCount(n)의 시간 복잡도가 O(1)이라는 것에 대한 레퍼런스 좀 공유해주실 수 있으실까요? 내부적으로 도대체 어떤 알고리즘을 썼길래 입력 값에 무관하게 일정한 시간이 걸리는지 궁금합니다.

Comment on lines +18 to +21
// keyList only has key values of the hashmap
// using their value count sort keys by descending order
List<Integer> keyList = new ArrayList<>(map.keySet());
Collections.sort(keyList, (o1, o2) -> map.get(o2).compareTo(map.get(o1)));
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

@TonyKim9401 TonyKim9401 Aug 15, 2024

Choose a reason for hiding this comment

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

@DaleSeo 이 부분은... GPT에 물어 본 결과였구요 ㅜ 답변 공유해드리는걸로 대체해도 괜찮을까요?

Integer.bitCount(n)의 시간 복잡도가 O(1)이라는 이유는 내부적으로 사용하는 알고리즘과 CPU의 하드웨어 명령어 덕분입니다. 이 함수는 주어진 정수 n의 이진 표현에서 1의 개수를 세는 작업을 수행합니다. 상세한 설명은 다음과 같습니다.

1. 내부 구현
Integer.bitCount(n) 메서드는 비트 연산을 기반으로 구현된 알고리즘을 사용하여 1의 개수를 셉니다. Java의 Integer 클래스는 하드웨어 수준에서 효율적인 비트 조작을 수행하는 메서드로 최적화되어 있습니다. 이는 비트 연산이 정수의 비트를 직접 다루기 때문에 매우 빠르게 실행됩니다.

Java에서 Integer.bitCount(n)는 하드웨어 명령어에 의존하거나, 하드웨어 명령어가 없는 경우 소프트웨어적으로 최적화된 알고리즘을 사용합니다. 이 알고리즘은 일정한 수의 연산 단계만을 수행하기 때문에 입력 크기에 관계없이 항상 일정한 시간 안에 결과를 도출할 수 있습니다.

2. 알고리즘
Integer.bitCount(n)는 일반적으로 "SWAR (SIMD Within A Register)" 알고리즘을 사용합니다. 이 알고리즘은 비트들을 그룹화하여 병렬 처리하고, 여러 비트의 개수를 동시에 세는 방식으로 동작합니다. 단계는 다음과 같습니다:

각 비트 쌍의 1의 개수를 셉니다.
각 4비트 그룹에서 1의 개수를 셉니다.
각 8비트 그룹에서 1의 개수를 셉니다.
이 과정을 계속해서 32비트 숫자 전체에서 1의 개수를 얻습니다.
이 과정은 고정된 수의 연산 단계(즉, 5~6단계)로 이루어져 있으며, 입력 정수 n의 크기에 관계없이 동일한 수의 연산이 수행됩니다. 따라서 시간 복잡도는 O(1)입니다.

3. 하드웨어 명령어
많은 현대 CPU는 비트 카운트를 위한 전용 명령어(예: x86 아키텍처의 POPCNT)를 가지고 있습니다. 이러한 명령어는 비트 카운트를 하드웨어 수준에서 처리하므로 매우 빠르게 실행됩니다. Java의 JIT(Just-In-Time) 컴파일러는 가능한 경우 이러한 하드웨어 명령어를 사용하도록 코드를 최적화할 수 있습니다.

이 명령어는 한 사이클 내에 연산을 완료하므로, 이 경우에도 O(1) 시간 복잡도를 유지할 수 있습니다.

4. 결론
Integer.bitCount(n)가 O(1) 시간 복잡도를 가지는 이유는 이 함수가 입력 크기와 무관하게 일정한 수의 연산만을 수행하는 고정된 알고리즘을 사용하기 때문입니다. 이 알고리즘은 비트 연산을 사용하여 빠르게 1의 개수를 셀 수 있도록 최적화되어 있으며, 현대 CPU의 하드웨어 명령어를 활용할 수 있어 더 효율적인 처리가 가능합니다.

Copy link
Contributor

@DaleSeo DaleSeo Aug 15, 2024

Choose a reason for hiding this comment

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

혹시 위 내용은 #299 (comment) 에 대한 답변이 아닐까요? 제가 여쭤본 내용에 대한 답변이 아닌 것 같습니다.

@TonyKim9401 TonyKim9401 added bug Something isn't working java and removed bug Something isn't working labels Aug 15, 2024
@TonyKim9401 TonyKim9401 changed the title [JAVA][TONY] WEEK 01 solutions [TONY] WEEK 01 solutions Aug 15, 2024
@leokim0922 leokim0922 merged commit 80129c6 into DaleStudy:main Aug 16, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
No open projects
Status: Completed
Development

Successfully merging this pull request may close these issues.

6 participants