๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm/SWEA

[Algorithm] SWEA : 10965. ์ œ๊ณฑ์ˆ˜ ๋งŒ๋“ค๊ธฐ by Python

by ํฌ๊ตฌ๋ฆฌ 2020. 12. 29.

๐Ÿ“Œ๋ฌธ์ œ ์„ค๋ช…

์–ด๋–ค ์ž์—ฐ์ˆ˜ A๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์—ฌ๊ธฐ์— ์ž์—ฐ์ˆ˜ B๋ฅผ ๊ณฑํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฑฐ๋“ญ์ œ๊ณฑ์ˆ˜๊ฐ€ ๋˜๋Š” ์ตœ์†Œ์˜ B๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ.

์ž…๋ ฅ

  • ์ฒซ ๋ฒˆ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ˆ˜ T ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.
  • ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ํ•˜๋‚˜์˜ ์ž์—ฐ์ˆ˜ A(1≤A≤10**7) ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๐Ÿ’ก ๋ฌธ์ œ ํ’€์ด

์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ๋งŽ์€ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋˜ ๋ฌธ์ œ...

 

1์ฐจ์‹œ๋„ - ์‹œ๊ฐ„์ดˆ๊ณผ

๋ฌธ์ œ์˜ ๋‚œ์ด๋„๊ฐ€ ๋†’์ง€ ์•Š์•„ ๋‹จ์ˆœํ•˜๊ฒŒ 2๋ถ€ํ„ฐ A๊นŒ์ง€ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ๋‚˜๋ˆˆ ํšŸ์ˆ˜๊ฐ€ ํ™€์ˆ˜์ด๋ฉด ๊ณฑํ•ด์ฃผ๋Š” ๋ฐฉ์‹(๋‚˜๋ˆˆ ํšŸ์ˆ˜๊ฐ€ ์ง์ˆ˜์—ฌ์•ผ ์ œ๊ณฑ์ˆ˜๊ฐ€ ๊ฐ€๋Šฅ)์œผ๋กœ ์ •๋‹ต์„ ๋„์ถœํ•˜๋ ค ํ•˜์˜€๋‹ค. 

T = int(input())
for tc in range(T):
    A = int(input())
    res = 1
    # items = dict()
    for i in range(2, A+1):
        if not A%i:
            cnt = 1
            A //= i
            while True:
                if not A%i:
                    cnt += 1
                    A //= i
                else:
                    break
            if cnt % 2:
                res *= i
            if A == 1:
                break
    print('#{} {}'.format(tc+1, res))

์ž์—ฐ์ˆ˜ A์˜ ๋ฒ”์œ„๊ฐ€ 10**7 ๊นŒ์ง€์ด๋‹ค ๋ณด๋‹ˆ ํฐ ์ˆซ์ž์˜ ๊ฒฝ์šฐ ์œ„์˜ ๋ฐฉ๋ฒ•์€ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์˜ค๋‹ต!
โ€ป ํ‰๊ท ์ ์œผ๋กœ 100000๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ค‘ 190๊ฐœ๊ฐ€ ํ†ต๊ณผํ•˜์˜€๋‹ค...

 

2์ฐจ์‹œ๋„ - ์‹œ๊ฐ„์ดˆ๊ณผ

ํ˜น์‹œ๋‚˜ํ•ด์„œ ๋‚˜๋ˆ„๋Š” ์ž‘์—…์„ ํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ ์ˆซ์ž๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด์„œ ์ œ๊ณฑ์ˆ˜๋ฉด ์ถœ๋ ฅํ•˜๋„๋ก ์•„๋ž˜์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

import math

T = int(input())
for tc in range(T):
    A = int(input())
    for i in range(1, A+1):
        if A * i == int(math.sqrt(A * i)) ** 2:
            print('#{} {}'.format(tc+1, i))
            break

์˜ˆ์ƒ๋Œ€๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๊ณ  ์ฒซ๋ฒˆ์งธ ๋ฐฉ๋ฒ•๋ณด๋‹ค ํ›จ์”ฌ ์ ์€ 60๊ฐœ ๊ฐ€๋Ÿ‰์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ํ†ต๊ณผ๋˜์—ˆ๋‹ค.

 

3์ฐจ์‹œ๋„ - ํ•ด๊ฒฐ

 

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ 1๋ถ€ํ„ฐ A๊นŒ์ง€์˜ ๋ฒ”์œ„์˜ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ์‹œ๊ฐ„์ดˆ๊ณผ์˜ ์›์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์˜€๋‹ค.

๋”ฐ๋ผ์„œ, ์†Œ์ˆ˜์— ๋Œ€ํ•ด์„œ๋งŒ A๊ฐ€ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•˜๋ ค๊ณ  ํ–ˆ๋‹ค.

ex) 2๋กœ ๋‚˜๋ˆˆ ์ดํ›„์—๋Š” 4, 6, 8.. ๊ณผ ๊ฐ™์€ ์ง์ˆ˜๋Š” ๋‚˜๋ˆ„์–ด์งˆ ์ˆ˜๊ฐ€ ์—†๋‹ค.

 

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋ฐ˜๋ณตํ•ด์„œ ์†Œ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋น„ํšจ์œจ์ ์ด๋ฏ€๋กœ ๊ฐ€์žฅ ์ƒ๋‹จ์— 2๋ถ€ํ„ฐ 3162( = int(10000000 ** 0.5))๊นŒ์ง€์˜ ์†Œ์ˆ˜๋ฅผ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ ๋‹ค.

 

  • prime : 2๋ถ€ํ„ฐ 3162๊นŒ์ง€์˜ ์†Œ์ˆ˜๋ฅผ ๋‹ด์€ ๋ฆฌ์ŠคํŠธ

A ๊ฐ’์ด ์ œ๊ณฑ์ˆ˜์ด๋ฉด ๋” ์ด์ƒ ์ง„ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์ œ๊ณฑ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด prime์— ์žˆ๋Š” ์†Œ์ˆ˜๊ฐ’๋“ค๋กœ ํ•˜๋‚˜์”ฉ A๊ฐ’์ด ๋‚˜๋ˆ„์–ด์ง€๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
→ ์ œ๊ณฑ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฐ’์„ ํŒŒ์•…

 

๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ A๊ฐ€ ์†Œ์ˆ˜ p์— ๋Œ€ํ•ด์„œ ๋ช‡ ๋ฒˆ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐœ์ˆ˜๋ฅผ ํŒŒ์•…ํ•œ๋‹ค.

  • cnt : ํŠน์ • ์†Œ์ˆ˜๊ฐ€ ๋ช‡๋ฒˆ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€๋Š” ํ™•์ธํ•˜๊ธฐ ์œ„ํ•œ ๋ณ€์ˆ˜
  • res : A์— ๊ณฑํ•œ ๊ฒฐ๊ณผ๊ฐ€ ๊ฑฐ๋“ญ์ œ๊ณฑ์ˆ˜๊ฐ€ ๋˜๋Š” ์ตœ์†Œ์˜ ์ž์—ฐ์ˆ˜(์ž์—ฐ์ˆ˜ B)

์ดํ›„ cnt์˜ ๊ฐ’์ด ์ง์ˆ˜๋ฉด ์ œ๊ณฑ๊ทผ์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ™€์ˆ˜๋ฉด ํ•ด๋‹น ์†Œ์ˆ˜๋ฅผ ๊ณฑํ•ด์ค˜์•ผ ์ œ๊ณฑ๊ทผ์ด ๋˜๋ฏ€๋กœ res์— ํ•ด๋‹น ์†Œ์ˆ˜(p)๋ฅผ ๊ณฑํ•ด์ค€๋‹ค

 

์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ A๊ฐ€ ๋” ๋‚˜๋ˆŒ ์ˆ˜ ์—†๋Š” ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋Š” breakํ•ด์ค€๋‹ค.

  1. A == 1
  2. p > A

prime์— ์žˆ๋Š” ๋ชจ๋“  ์†Œ์ˆ˜๋กœ ๋‚˜๋ˆ„์—ˆ์Œ์—๋„ ๋‚˜๋ˆ„์–ด๋–จ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด ํ•ด๋‹น ๊ฐ’์€ prime์˜ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ๋” ํฐ ์†Œ์ˆ˜๊ฐ’์ด๋ฏ€๋กœ res์— ๊ณฑํ•ด์ค€๋‹ค.

 

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค

prime = [2]
for i in range(3, int(10000000 ** (0.5)), 2):
    for p in prime:
        if not i % p: break
    else:
        prime.append(i)
answer = []
T = int(input())
for tc in range(T):
    A = int(input())
    res = 1
    if A**0.5 != int(A**0.5):
        for p in prime:
            cnt = 0
            while not A % p:
                A //= p
                cnt += 1
            if cnt % 2:
                res *= p
            if A == 1 or p > A:
                break
        if A > 1:
            res *= A
    answer.append('#{} {}'.format(tc+1, res))
for ans in answer:
    print(ans)

์‚ฌ์‹ค ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋งŒ ์ž‘์„ฑํ•ด๋„ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ 10๋งŒ๊ฐœ๋‹ค๋ณด๋‹ˆ ๋ฐ˜๋ณต๋ฌธ์„ ํ†ตํ•œ ์ถœ๋ ฅ๋ฌธ์—์„œ ์ƒ๋‹นํ•œ ์‹œ๊ฐ„์„ ์žก์•„๋จน๋Š”๋‹ค.

์ด๋Ÿด ๊ฒฝ์šฐ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ์— ๊ฒฐ๊ณผ๊ฐ’์„ ์ „๋ถ€ ๋‹ด์€ ๋‹ค์Œ ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•ด์ฃผ๋ฉด ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ans : ๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ์ถœ๋ ฅ๋ฌธ(#tc๋ฒˆํ˜ธ ์ž์—ฐ์ˆ˜B)์„ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ

 

โœ” ๋ฌธ์ œ๋ฅผ ํ’€๊ณ  ๋‚œ ํ›„...

์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ์›น ์‚ฌ์ดํŠธ๋“ค์ด ๋งŽ์€๋ฐ(Programmers, ๋ฐฑ์ค€, SWEA ๋“ฑ)

๊ฐ ์‚ฌ์ดํŠธ์—์„œ ์ œ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค๋ณด๋‹ˆ ์–ด๋ ค์›€์„ ๊ฒช์„ ๋•Œ๊ฐ€ ์žˆ๋‹ค.
โ€ป ๋ฌธ์ œ ์Šคํƒ€์ผ๋„... ๋งŽ์ด ๋‹ค๋ฅธ๊ฒƒ ๊ฐ™๋‹ค.

 

ex) ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋Š” ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ž…๋ ฅ์„ ๋ฐ›์•„ ํ•จ์ˆ˜ ๋ฒ”์œ„ ๋‚ด์—์„œ ํ’€์ด, SWEA๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ์ด์šฉํ•˜์—ฌ ์ž…๋ ฅ์„ ๋ฐ›์•„ ๋ฌธ์ œ๋ฅผ ํ’€์ด

 

๋”ฐ๋ผ์„œ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค๋ฅผ ์ œ์™ธํ•œ ๋ฐฑ์ค€, SWEA์—์„œ๋Š” ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›๋Š” ๋ถ€๋ถ„๊ณผ ๋‹ต์„ ์ถœ๋ ฅํ•˜๋Š” ๋ถ€๋ถ„์—์„œ ์ตœ์ ํ™”(์‹œ๊ฐ„ ๋‹จ์ถ•)๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.


์œ„ ๋ฌธ์ œ์—์„œ๋„ ans์— ์ถœ๋ ฅํ•˜๋Š” ๋‚ด์šฉ์„ ๋‹ด์•„ ํ•œ ๋ฒˆ์— ์ถœ๋ ฅํ•จ์œผ๋กœ์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๋ฐฑ์ค€์—์„œ๋„ ๋น ๋ฅธ ์ž…๋ ฅ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก sys.stdin.readline() ์‚ฌ์šฉ์„ ์š”๊ตฌํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋‹ค.

 

๋ฌผ๋ก  ํŒŒ์ด์ฌ์—์„œ ๋น ๋ฅธ ์ž…์ถœ๋ ฅ์„ ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ๋Š” ๋‹จ์ˆœ ์ž…์ถœ๋ ฅ์ด ์•„๋‹Œ
์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณผ์ •์—์„œ์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋งŒ ๋‹ค๋ค˜์œผ๋ฉด ์ข‹๊ฒ ๋‹ค..๐Ÿ˜‚

๋Œ“๊ธ€