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

5-mong3125 #17

Merged
merged 1 commit into from
Mar 4, 2024
Merged

5-mong3125 #17

merged 1 commit into from
Mar 4, 2024

Conversation

mong3125
Copy link
Collaborator

@mong3125 mong3125 commented Feb 24, 2024

πŸ”— 문제 링크

λ°±μ€€ 10986 - λ‚˜λ¨Έμ§€ ν•©

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

μ•„μ΄λ””μ–΄λž‘ μ½”λ“œ κ΅¬ν˜„μ€ λΉ¨λžλŠ”λ° 계속 였λ₯˜κ°€ ν„°μ Έμ„œ μ•Œκ³ λ³΄λ‹ˆ μ˜€λ²„ν”Œλ‘œμš° λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.
2μ‹œκ°„μ€ μ‚½μ§ˆν–ˆλ„€μš”.

✨ μˆ˜λ„ μ½”λ“œ

ꡬ간 ν•©...?

ꡬ간 ν•©μ΄λΌλŠ” κ°œλ…μ„ μ•Œκ³  μžˆλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

'ꡬ간 ν•© λ°°μ—΄'은 i 번째 μš”μ†Œκ°€ 0λΆ€ν„° iλ²ˆμ§ΈκΉŒμ§€μ˜ ν•©μœΌλ‘œ 이루어진 λ°°μ—΄μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 숫자 배열이 {1, 2, 5, 8, 4, 7} μ΄λ ‡κ²Œ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ ꡬ간 ν•© 배열은 {1, 3, 8, 16, 20, 27}이 λ©λ‹ˆλ‹€.

이 λ•Œ λ§Œμ•½ μ œκ°€ μΈλ±μŠ€κ°€ 2λΆ€ν„° 4κΉŒμ§€μ˜ 합을 κ΅¬ν•˜κ³  μ‹Άλ‹€λ©΄ ꡬ간 ν•© λ°°μ—΄μ˜ 인덱슀 4의 μš”μ†Œ 20μ—μ„œ 인덱슀 1의 μš”μ†Œ 3을 λΉΌλ©΄ 17μ΄λΌλŠ” κ²°κ³Όλ₯Ό λ°”λ‘œ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 5 + 8 + 4의 κ²°κ³ΌλŠ” 17이죠

이 λ°©λ²•μ˜ μž₯점은 ꡬ간 합을 O(n)의 μ‹œκ°„λ³΅μž‘λ„μ—μ„œ O(1)둜 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

문제의 메인 λͺ©ν‘œ

λ¬Έμ œμ—μ„œ μ œμ‹œν•˜λŠ” λͺ©ν‘œλŠ” μ—°μ†λœ λΆ€λΆ„μ˜ 합이 μ–΄λ–€ 수 M으둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” ꡬ간

즉, ꡬ간 ν•© λ°°μ—΄μ—μ„œ μ–΄λ–€ μš”μ†Œ 두 개λ₯Ό λΉΌκ³ (S[j] - S[i-1]) λ‚˜λ¨Έμ§€ 연산을 ν–ˆμ„λ•Œ(M으둜 λ‚˜λˆ΄μ„ λ•Œ) 0이 λ‚˜μ˜€λŠ” 경우의 수(i,j) μž…λ‹ˆλ‹€.

μ΄λŠ” λͺ¨λ“ˆλŸ¬ 정리에 μ˜ν•΄ S[j] % M = S[i -1] % Mλ₯Ό λ§Œμ‘±ν•˜λŠ” i, jλ₯Ό λ½‘λŠ” 경우의 μˆ˜μž…λ‹ˆλ‹€.

β‡’ ꡬ간 ν•©μ˜ λ‚˜λ¨Έμ§€κ°€ 같은 인덱슀 두 개λ₯Ό λ½‘λŠ” μ‘°ν•©

1️⃣ μš°μ„  ꡬ간 ν•© 배열에 λ‚˜λ¨Έμ§€ 연산을 μ μš©ν•œ 배열을 κ΅¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

  • 이전 λ‚˜λ¨Έμ§€μ™€ λ‹€μŒ μž…λ ₯(μ›μ†Œ)λ₯Ό λ”ν•œ ν›„, λ‚˜λ¨Έμ§€ 연산을 ν•˜λ©΄ 같은 κ²°κ³Όκ°€ λ‚˜μ˜΅λ‹ˆλ‹€.

ꡬ간 ν•©μ΄λΌλŠ” κ°œλ…μ„ μ•Œκ³  μžˆλ‹€λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

'ꡬ간 ν•© λ°°μ—΄'은 i 번째 μš”μ†Œκ°€ 0λΆ€ν„° iλ²ˆμ§ΈκΉŒμ§€μ˜ ν•©μœΌλ‘œ 이루어진 λ°°μ—΄μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 숫자 배열이 {1, 2, 5, 8, 4, 7} μ΄λ ‡κ²Œ μžˆλ‹€κ³  κ°€μ •ν•˜λ©΄ ꡬ간 ν•© 배열은 {1, 3, 8, 16, 20, 27}이 λ©λ‹ˆλ‹€.

이 λ•Œ λ§Œμ•½ μ œκ°€ μΈλ±μŠ€κ°€ 2λΆ€ν„° 4κΉŒμ§€μ˜ 합을 κ΅¬ν•˜κ³  μ‹Άλ‹€λ©΄ ꡬ간 ν•© λ°°μ—΄μ˜ 인덱슀 4의 μš”μ†Œ 20μ—μ„œ 인덱슀 1의 μš”μ†Œ 3을 λΉΌλ©΄ 17μ΄λΌλŠ” κ²°κ³Όλ₯Ό λ°”λ‘œ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ 5 + 8 + 4의 κ²°κ³ΌλŠ” 17이죠

이 λ°©λ²•μ˜ μž₯점은 ꡬ간 합을 O(n)의 μ‹œκ°„λ³΅μž‘λ„μ—μ„œ O(1)둜 쀄일 수 μžˆμŠ΅λ‹ˆλ‹€.

ꡬ간 ν•©μ˜ λ‚˜λ¨Έμ§€λŠ”?

ꡬ간 ν•©μ˜ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λŠ” 것은 이제 μ‰¬μ›Œμ‘ŒμŠ΅λ‹ˆλ‹€. κ·Έλƒ₯ ν•©μ—μ„œ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜λ©΄ λ˜λ‹ˆκΉμš”.

ν•˜μ§€λ§Œ 맀번 숫자λ₯Ό μž…λ ₯λ°›μ„λ•Œ λ§ˆλ‹€ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•΄μ„œ μ €μž₯을 ν•˜κ³  이전 κ°’μ˜ λ‚˜λ¨Έμ§€μ™€ 이후 값을 λ”ν•œ 뒀에 λ‚˜λ¨Έμ§€ 연산을 해도 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜ κ·Έλ¦Όμ²˜λŸΌμš”!
image

2️⃣ 이제 λ‚˜λ¨Έμ§€ 연산을 ν•œ μ›μ†Œλ“€μ„ λΉΌλŠ” κ²°κ³Όκ°€ 0이 λ‚˜μ™€μ•Ό λ˜λ―€λ‘œ λ‚˜λ¨Έμ§€κ°€ 같은 κ²ƒμ˜ 개수λ₯Ό μ„Έμ–΄μ€λ‹ˆλ‹€.
image

3️⃣ μ‘°ν•©μœΌλ‘œ 개수λ₯Ό μ„Έμ–΄λ΄…μ‹œλ‹€.
image

4️⃣ λ‚˜λ¨Έμ§€κ°€ 0인 κ²½μš°λŠ” 자기 μžμ‹  ν•˜λ‚˜λ‘œλ„ 쑰건을 μΆ©μ‘±ν•˜λ―€λ‘œ(i==j 인 경우) μ„Έμ–΄μ€μ‹œλ‹€.
image

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

  • ꡬ간 ν•©μ˜ λ‚˜λ¨Έμ§€λ₯Ό ꡬ할 λ•Œ, 이전 λ‚˜λ¨Έμ§€μ—μ„œ μƒˆλ‘œμš΄ 수λ₯Ό λ”ν•˜κ³  λ‚˜λ¨Έμ§€ μ—°μ‚°ν•¨μœΌλ‘œμ¨ λ©”λͺ¨λ¦¬λ₯Ό μ ˆμ•½ν•  수 μžˆμŒμ„ μ•Œκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
    • int μžλ£Œν˜•μœΌλ‘œ ν•˜λ‹ˆκΉŒ μ˜€λ²„ν”Œλ‘œμš°κ°€ λ°œμƒν•΄μ„œ ν‹€λ Έμ—ˆμŠ΅λ‹ˆλ‹€.
  • 쑰합을 κ΅¬ν•˜λ €κ³  ν•  λ•Œ, λ‚˜λ¨Έμ§€λ³΄λ‹€ κ³±μ…ˆμ΄ λ¨Όμ € μžˆλ‹€λ³΄λ‹ˆ intμžλ£Œν˜•μ—μ„œ ν‘œν˜„ν•  수 μžˆλŠ” λ²”μœ„λ₯Ό λ„˜μ–΄μ„œ 이λ₯Ό long νƒ€μž…μœΌλ‘œ κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

Copy link
Collaborator

@YIM2UL2ET YIM2UL2ET left a comment

Choose a reason for hiding this comment

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

처음 λ¬Έμ œμ— N 크기 μ œν•œμ΄ μ‹¬μƒμΉ˜ μ•Šμ€κ±Έ 보고 이걸 μ–΄λ–»κ²Œ ν’€μ–΄μ•Ό ν•˜λ‚˜ μ‹Άμ—ˆλŠ”λ° ꡬ간 ν•© κ°œλ…μ„ μ•Œκ³ λ‚˜λ‹ˆκΉ 문제λ₯Ό μ–΄λ–»κ²Œ 풀지 잘 λ³΄μ΄λ„€μš”. μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€!

Comment on lines +23 to +25
for (int i = 0; i < M; i++) {
count += (long) remainders_count[i] * (remainders_count[i] - 1) / 2; // μ‘°ν•©
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

쑰합을 ν•œλ‹€κ³  ν•˜μ…¨λŠ”λ° μ–΄λ–€ μ›λ¦¬λ‘œ 쑰합을 ν•˜λŠ”κ±΄μ§€ 이 뢀뢄은 잘 이해가 가지 μ•Šλ„€μš”.
ꡬ간 ν•©μ˜ λ‚˜λ¨Έμ§€μΈ 1~M이 λ‚˜μ˜¨ 횟수λ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν•œ 것 같은데 λΆ€μ—° μ„€λͺ…이 ν•„μš”ν•  것 κ°™μŠ΅λ‹ˆλ‹€.

Copy link
Collaborator

@rivkms rivkms left a comment

Choose a reason for hiding this comment

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

βœ”οΈ κ΅¬κ°„ν•©μ˜ λ‚˜λ¨Έμ§€λ₯Ό κ΅¬ν•˜μ‹€ λ•Œ ν›Œλ₯­ν•œ 접근이라고 μƒκ°ν•©λ‹ˆλ‹€!!
μ˜ˆμ „μ— λ‹€λ₯Έ 문제λ₯Ό ν’€ λ•Œ 이런 μ‹μœΌλ‘œ μ ‘κ·Όν–ˆλ˜ 것이 기얡이 λ‚©λ‹ˆλ‹€.

πŸ“ 예λ₯Ό λ“€μ–΄ A와 B의 합을 X둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό 좜λ ₯ν•΄μ•Όν•˜λŠ” μƒν™©μ—μ„œ A+B의 값이 MAX_INTλ₯Ό λ„˜μ–΄κ°€λŠ” μƒν™©μ—μ„œ Aλ₯Ό X둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€μ™€ Bλ₯Ό X둜 λ‚˜λˆˆ λ‚˜λ¨Έμ§€λ₯Ό λ”ν•˜μ—¬ λ‚˜λˆ„λŠ” 방식을 μ‚¬μš©ν–ˆμ—ˆμŠ΅λ‹ˆλ‹€.
이와 μœ μ‚¬ν•œ 상황 같은데, 이 λ¬Έμ œμ—μ„œλŠ” μ‚¬μš©ν•΄μ•Όκ² λ‹€λŠ” 생각을 λͺ»ν–ˆμ—ˆλ„€μš”!!

βœ”οΈ 또 이차원 배열을 μ‚¬μš©ν•˜μ—¬ 1~nκΉŒμ§€μ˜ ꡬ간합 말고도 n~mκΉŒμ§€μ˜ ꡬ간합을 κ΅¬ν•΄μ•Όν•˜λ‚˜λ„ μƒκ°ν•˜μ˜€μ§€λ§Œ, μ΄λ²ˆμ— ν’€μ΄ν•˜μ‹  방법이 곡간과 μ‹œκ°„ μΈ‘λ©΄μ—μ„œ 더 κΉ”λ”ν•œ 것 κ°™μŠ΅λ‹ˆλ‹€

μˆ˜κ³ ν•˜μ…¨μŠ΅λ‹ˆλ‹€.😁

Comment on lines +18 to +19
remainders[i] = (remainders[i - 1] + Integer.parseInt(st.nextToken())) % M;
remainders_count[remainders[i]] += 1;
Copy link
Collaborator

Choose a reason for hiding this comment

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

쒋은 μ½”λ“œμΈ 것 κ°™μŠ΅λ‹ˆλ‹€

Copy link
Member

@kjs254 kjs254 left a comment

Choose a reason for hiding this comment

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

즉, ꡬ간 ν•© λ°°μ—΄μ—μ„œ μ–΄λ–€ μš”μ†Œ 두 개λ₯Ό λΉΌκ³ (S[j] - S[i-1]) λ‚˜λ¨Έμ§€ 연산을 ν–ˆμ„λ•Œ(M으둜 λ‚˜λˆ΄μ„ λ•Œ) 0이 λ‚˜μ˜€λŠ” 경우의 수(i,j) μž…λ‹ˆλ‹€.

ꡬ간 ν•© λ°°μ—΄μ—μ„œ (i, j) μŒμ„ μ°ΎλŠ”λ‹€λŠ” λ‚΄μš©μ€ 이해할 수 μžˆμ—ˆλŠ”λ° κ°€μž₯ μ€‘μš”ν•œ ꡬ간 ν•© 배열을 λ”°λ‘œ ꡬ해야 ν•˜λŠ”κ±΄κ°€μš”?

ꡬ간 ν•© 배열을 λͺ¨λ‘ λ‹€ κ΅¬ν•˜κΈ°μ—λŠ” N의 크기가 μƒλ‹Ήν•˜λ‹€κ³  생각해 ꡬ간 ν•© 배열을 κ΅¬ν•˜μ§€ μ•Šκ³  수 λ°°μ—΄μ—μ„œ μ € μˆœμ„œμŒμ„ μ–΄λ–»κ²Œ ꡬ할 수 μžˆλŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€.

@mong3125 mong3125 merged commit 4d7cb06 into main Mar 4, 2024
1 check passed
@mong3125 mong3125 deleted the 5-mong3125 branch March 4, 2024 07:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants