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

10-seongwon030 #43

Merged
merged 1 commit into from
May 19, 2024
Merged

10-seongwon030 #43

merged 1 commit into from
May 19, 2024

Conversation

seongwon030
Copy link
Collaborator

@seongwon030 seongwon030 commented May 6, 2024

πŸ”— 문제 링크

연속 ν•©

문제

λŒ€λΆ€λΆ„μ˜ μ–‘μ˜ μ •μˆ˜λŠ” 적어도 2개 μ΄μƒμ˜ μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.

예λ₯Ό λ“€λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

6 = 1 + 2 + 3

9 = 5 + 4 = 4 + 3 + 2

ν•˜μ§€λ§Œ, 8은 μ—°μ†λœ μžμ—°μˆ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό μˆ˜κ°€ μ—†λ‹€.

μžμ—°μˆ˜ N이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 이 수λ₯Ό 적어도 2개 μ΄μƒμ˜ μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ” 경우의 수λ₯Ό 좜λ ₯ν•˜μ‹œμ˜€.

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

1μ‹œκ°„ 30λΆ„

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

μ—°μ†ν•©μ΄λ‹ˆκΉŒ μ–΄λ””κΉŒμ§€ 탐색을 ν•΄μ•Όν• κΉŒ 고민을 ν•΄λ΄€λ‹€. μ œκ³±κ·ΌλΆ€ν„° μƒκ°ν•΄λ΄€λŠ”λ° n=1800 일 λ•Œ 제곱근이 42..xxμ˜€λ‹€. 근데 1800을 45둜 λ‚˜λˆˆ λͺ«μ΄ 40이고 , κ·Έλ ‡λ‹€λ©΄ 40을 κΈ°μ€€ μ–‘μ˜†μœΌλ‘œ 22κ°œμ”© 연속합을 계산해도 연속합에 ν¬ν•¨λ˜λŠ” 값이 턱없이 많이 λ‚¨λŠ”λ‹€.

ν•΄κ²°

λ‚˜λˆ„λŠ” 수λ₯Ό j , λ‚˜λˆˆ λͺ«μ„ center 라고 ν•˜λ©΄ jλŠ” 연속합 κ΅¬κ°„μ˜ μ •μˆ˜μ˜ 개수λ₯Ό μ˜λ―Έν•œλ‹€. centerλŠ” κ·Έ κ΅¬κ°„μ˜ 쀑앙값을 μ˜λ―Έν•œλ‹€. center값은 μ†Œμˆ˜μ μžλ¦¬λ₯Ό 없애버리고 μ •μˆ˜λ‘œ 섀정해쀬닀. cntλŠ” 경우의 μˆ˜λ‹€. (j//2 λŠ” 쀑앙값을 κΈ°μ€€μœΌλ‘œ μ–‘μ˜†μœΌλ‘œ 더할 μ •μˆ˜μ˜ κ°œμˆ˜κ°€ λœλ‹€.)

  1. jκ°€ 짝수일 λ•Œ -> centerκ°€ 쀑앙값이 μ•„λ‹ˆλ―€λ‘œ 연속합은 (center + center+1) x (jλ₯Ό 2둜 λ‚˜λˆˆ λͺ«)
  2. jκ°€ ν™€μˆ˜μΌ λ•Œ -> centerκ°€ μ€‘μ•™κ°’μ΄λ―€λ‘œ center + center x 2 x (j//2)
    제일 μ€‘μš”ν•œ 것은 μ–΄λ””κΉŒμ§€ 탐색해야 λ˜λŠ”κ°€ 인데 center κΈ°μ€€μœΌλ‘œ μ•žμœΌλ‘œ j//2 λ²ˆμ§ΈκΉŒμ§€ 탐색이 κ°€λŠ₯ν•΄μ•Ό ν•˜λ‹ˆ centerκ°€ j//2보닀 μž‘κΈ° μ „κΉŒμ§€ λ°˜λ³΅ν•˜λ©΄ λœλ‹€!
import math

n = int(input())
for i in range(n):
    cnt = 0
    k = int(input())
    j = 2 # 적어도 2개 μ΄μƒμ˜ μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©
    while True:
        center = math.floor(k / j)  # center 값을 μ΄ˆκΈ°ν™”
        div = j // 2
        if center < div:
          break
        if j % 2 == 0:
            if ((center + center + 1) * div == k):
                cnt += 1
        elif j % 2 == 1:
            if ((center * 2 * div + center) == k):
                cnt += 1
        j += 1
    print(cnt)
스크란샷 2024-05-07 00 42 38

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

μ–΄λ””κΉŒμ§€ 탐색해야 ν•˜λŠ”μ§€ μ§‘μ€‘ν•˜λ‹ˆ 생각보닀 빨리 ν’€λ¦¬λŠ” 것 κ°™λ‹€.

Copy link
Collaborator

@InSange InSange left a comment

Choose a reason for hiding this comment

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

μ €λŠ” 아직 풀어보지 μ•Šμ•˜μ§€λ§Œ k값이 μ£Όμ–΄μ‘Œμ„ λ•Œ μ΅œμ†Œ j = 2κ°œλΆ€ν„° ~ n/2 κΉŒμ§€ μƒκ°ν•΄λ΄€μŠ΅λ‹ˆλ‹€.
ex) 6의 경우 1 + 2 + 3κ³Ό 같이 κ°œμˆ˜κ°€ 6/2개이기 λ•Œλ¬Έμ΄λ‹€.
μ΄λ ‡κ²Œ j문을 λŒλ €μ„œ k/j의 값을 기점으둜 j개만큼 쒌 우 νƒμƒ‰ν•˜μ—¬ 값을 더해주면 연속합이 λ˜μ§€ μ•Šμ„κΉŒ μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. ν•΄λ‹Ή 곡식을 μ–΄λ–»κ²Œ μ°Ύμ•˜λŠ”μ§€ μ•Œ 수 μžˆμ„κΉŒμš”?

j = 2 # 적어도 2개 μ΄μƒμ˜ μ—°μ†λœ μžμ—°μˆ˜μ˜ ν•©
while True:
center_first = math.floor(k / j) # center 값을 μ΄ˆκΈ°ν™”
div = j // 2
Copy link
Collaborator

Choose a reason for hiding this comment

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

ν•΄λ‹Ή λΆ€λΆ„ div에 λŒ€ν•΄μ„œ μ’€ 더 μƒμ„Έν•œ μ„€λͺ…이 κ°€λŠ₯ν• κΉŒμš”?
jλŠ” k에 λŒ€ν•œ 연속합을 μœ„ν•œ 개수λ₯Ό μ μš©ν–ˆμ„λ•Œ μ™œ j//2κ°€ 적용이 λ˜λŠ”μ§€ κΆκΈˆν•˜λ„€μš”!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

ν•΄λ‹Ή λΆ€λΆ„ div에 λŒ€ν•΄μ„œ μ’€ 더 μƒμ„Έν•œ μ„€λͺ…이 κ°€λŠ₯ν• κΉŒμš”? jλŠ” k에 λŒ€ν•œ 연속합을 μœ„ν•œ 개수λ₯Ό μ μš©ν–ˆμ„λ•Œ μ™œ j//2κ°€ 적용이 λ˜λŠ”μ§€ κΆκΈˆν•˜λ„€μš”!

center_first λŠ” 쀑앙값이고 jλŠ” 연속합에 ν¬ν•¨λ˜λŠ” μ •μˆ˜μ˜ 개수라고 ν•œλ‹€λ©΄, div=j//2 λŠ” 쀑앙값을 κΈ°μ€€μœΌλ‘œ μ•žμ— μ΅œμ†Œ j//2 개 μ΄μƒμ˜ μ •μˆ˜κ°€ μžˆμ–΄μ•Ό 연속합이 μ‘΄μž¬ν•˜κ²Œ λ©λ‹ˆλ‹€ !

Copy link
Collaborator

@yuyu0830 yuyu0830 left a comment

Choose a reason for hiding this comment

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

λ¬Έμ œκ°€ μž¬λ―Έμžˆμ–΄λ³΄μ—¬μ„œ 저도 ν•œλ²ˆ ν’€μ–΄λ΄€μŠ΅λ‹ˆλ‹€. 접근은 μ„œμ†‘μ΄λ‹˜μ΄λž‘ 쑰금 λ‹€λ₯΄κ²Œ ν–ˆμ–΄μš”.
μš°μ„  λ¬Έμ œλŠ” 크게 2개둜 λΆ„ν•  κ°€λŠ₯ν•©λ‹ˆλ‹€.

  1. n개의 μžμ—°μˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό λ•Œ n의 탐색 λ²”μœ„λŠ” μ–΄λ””κΉŒμ§€μΈκ°€
  2. n개의 μžμ—°μˆ˜μ˜ ν•©μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλŠ”κ°€

탐색 λ²”μœ„

μš°μ„  n개의 μžμ—°μˆ˜λ₯Ό 더할 λ•Œ κ°€μž₯ μž‘μ€ 경우의 μˆ˜λŠ” 1λΆ€ν„° nκΉŒμ§€ λ“±μ°¨μˆ˜μ—΄μ˜ 합곡식을 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.
n * (n + 1) / 2
즉 ν•΄λ‹Ή n의 값에 λ”°λ₯Έ λ²”μœ„λ₯Ό ꡬ할 수 μžˆμŠ΅λ‹ˆλ‹€.

  • 1 : 1
  • 2 : 2~3
  • 3 : 4~6
  • 4 : 7~10
  • ...

ν•˜μ§€λ§Œ μš°λ¦¬λŠ” μžμ—°μˆ˜ xλ₯Ό ν‘œν˜„ν•  수 μžˆλŠ” μžμ—°μˆ˜μ˜ 연속합 쀑 κ°€μž₯ n의 크기λ₯Ό κ΅¬ν•΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— μ—­μœΌλ‘œ xκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ n의 μ΅œλŒ€κ°’μ„ κ΅¬ν•΄μ•Όν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ•„λž˜μ™€ 같이 κ΅¬ν˜„ν–ˆμŠ΅λ‹ˆλ‹€.

int n = (int) sqrt((t * 2) - (int) sqrt(t * 2));

이 식 κ΅¬ν•˜λŠ”λ° μƒλ‹Ήνžˆ 고생 ν–ˆμŠ΅λ‹ˆλ‹€...

μžμ—°μˆ˜μ˜ ν•© κ°€λŠ₯ μ—¬λΆ€

n개의 μ—°μ†λœ μžμ—°μˆ˜λ₯Ό λ”ν•œ κ°’ tλŠ” λ“±μ°¨μˆ˜μ—΄μ˜ 합곡식에 따라 λ‹€μŒκ³Ό 같이 ν‘œκΈ°λ©λ‹ˆλ‹€.
t = n * (n + 1) / 2

μ—¬κΈ°μ„œ μ–‘ 변을 n으둜 λͺ¨λ“ˆλŸ¬ 연산을 해보면 λ‘κ°œμ˜ ν•­μœΌλ‘œ λ‚˜λ‰©λ‹ˆλ‹€.
t % n = {n * (n + 1) / 2} % n = ((n^2 / 2) % n) + {(n / 2) % n}
이 식을 톡해 μ§μˆ˜μ™€ ν™€μˆ˜μΈ κ²½μš°μ— 따라 μš°λ³€μ˜ 값이 λ‹¬λΌμ§‘λ‹ˆλ‹€.

  1. n이 짝수인 경우
    t % n == n / 2
    (n^2 / 2) % n 은 n이 짝수인 경우 {n * (n / 2)} % n 이기 λ•Œλ¬Έμ— 0이 λœλ‹€
    {(n / 2) % n} λŠ” n / 2κ°€ n보닀 μž‘κΈ° λ•Œλ¬Έμ— n / 2κ°€ λ˜μ–΄ κ²°κ΅­ μš°λ³€μ€ n / 2 + 0 = n / 2κ°€ λœλ‹€.

  2. n이 ν™€μˆ˜μΈ 경우
    t % n == 0
    (n^2 / 2) % n 의 경우 μ§μˆ˜μ™€ λ˜‘κ°™μ΄ {n * (n / 2)} % n μ΄μ§€λ§Œ n / 2κ°€ μ •μˆ˜λ‘œ λ‚˜λˆ„μ–΄λ–¨μ–΄μ§€μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— n / 2 만큼이 λ‚¨κ²Œλœλ‹€.
    {(n / 2) % n} λŠ” μ§μˆ˜μ™€ 같이 n / 2κ°€ λ‚¨λŠ”λ‹€.
    결과적으둜 μš°λ³€μ— (n / 2 + n / 2) % n = n % n = 0 이 λœλ‹€.

μ†ŒμŠ€μ½”λ“œ

#include <iostream>
#include <math.h>

using namespace std;

int main() {
    int n; cin >> n;
    while (n--) {
        int t; cin >> t;
        int p = (int) sqrt((t * 2) - (int) sqrt(t * 2)), ans = 0;

        for (int i = 2; i <= p; i += 2) if (t % i == i / 2) ans++;
        for (int i = 3; i <= p; i += 2) if (!(t % i)) ans++;

        printf("%d\n", ans);
    }
}

μ—­μ‹œ μˆ˜ν•™ λ¬Έμ œκ°€ μž¬λ°Œλ„€μš”

@seongwon030
Copy link
Collaborator Author

seongwon030 commented May 17, 2024

int n = (int) sqrt((t * 2) - (int) sqrt(t * 2));

이 식 κ΅¬ν•˜λŠ”λ° μƒλ‹Ήνžˆ 고생 ν–ˆμŠ΅λ‹ˆλ‹€...

μžμ—°μˆ˜μ˜ ν•© κ°€λŠ₯ μ—¬λΆ€

n개의 μ—°μ†λœ μžμ—°μˆ˜λ₯Ό λ”ν•œ κ°’ tλŠ” λ“±μ°¨μˆ˜μ—΄μ˜ 합곡식에 따라 λ‹€μŒκ³Ό 같이 ν‘œκΈ°λ©λ‹ˆλ‹€. t = n * (n + 1) / 2

연속합이라 λ“±μ°¨μˆ˜μ—΄μ˜ 합을 μ“Έ 수 μžˆμ—ˆλ„€μš”. κ·Έκ±Έ μ΄μš©ν•΄μ„œ 곡식을 κ΅¬ν•˜λ‹€λ‹ˆ .. ν•œ 수 λ°°μ›Œκ°‘λ‹ˆλ‹€.

Copy link
Contributor

@dhlee777 dhlee777 left a comment

Choose a reason for hiding this comment

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

κ΅¬κ°„μ˜ 쀑앙값(center)와 κ΅¬κ°„μ˜ 크기(j)λ₯Ό ν™œμš©ν•˜μ—¬ 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방식이 μΈμƒκΉŠμ—ˆμŠ΄λ‹ˆλ‹€.λ˜ν•œ center < div: 일경우 break ν•΄μ€ŒμœΌλ‘œμ¨ νƒμƒ‰λ²”μœ„λ₯Ό μž˜μž‘μ•„μ£Όμ–΄ λΆˆν•„μš”ν•œ 연산을 쀄일 수 μžˆμ—ˆλ˜κ±° κ°™λ„€μš”.. κΉ”λ”ν•œ μ½”λ“œ 잘보고 κ°‘λ‹ˆλ‹€!

@seongwon030 seongwon030 merged commit 5d80818 into main May 19, 2024
1 check passed
@seongwon030 seongwon030 deleted the 10-seongwon030 branch May 19, 2024 15:37
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