๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ Python/solve-algorithm

๋ฐฑ์ค€ 1065 [ํ•œ์ˆ˜] : ํŒŒ์ด์ฌ (๋ธŒ๋ฃจํŠธํฌ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜(Brute-force search))

๐Ÿ“Ž Problem

https://www.acmicpc.net/problem/1065

 

1065๋ฒˆ: ํ•œ์ˆ˜

์–ด๋–ค ์–‘์˜ ์ •์ˆ˜ X์˜ ๊ฐ ์ž๋ฆฌ๊ฐ€ ๋“ฑ์ฐจ์ˆ˜์—ด์„ ์ด๋ฃฌ๋‹ค๋ฉด, ๊ทธ ์ˆ˜๋ฅผ ํ•œ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค. ๋“ฑ์ฐจ์ˆ˜์—ด์€ ์—ฐ์†๋œ ๋‘ ๊ฐœ์˜ ์ˆ˜์˜ ์ฐจ์ด๊ฐ€ ์ผ์ •ํ•œ ์ˆ˜์—ด์„ ๋งํ•œ๋‹ค. N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜

www.acmicpc.net


๐Ÿ“Ž Submission Code

๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ’€์ด๋ฅผ ํ•ด๋ณด์•˜๋Š”๋ฐ, ๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” 30864KB๋กœ ๋™์ผํ•˜์˜€๊ณ  ์‹œ๊ฐ„์€ 68ms ๋˜๋Š” 72ms๋กœ ๋น„์Šทํ•˜์˜€๋‹ค.

1 ) ์ „์ฒด - ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜ ๋นผ๊ธฐ

ํ•œ ์ž๋ฆฌ ์ˆ˜์ธ 1~9๋Š” ์ˆ˜์—ด์˜ ๊ธธ์ด๊ฐ€ 1์ธ ๋“ฑ์ฐจ์ˆ˜์—ด๋กœ, ๋‘ ์ž๋ฆฌ ์ˆ˜์ธ 10~99๋Š” ๊ธธ์ด๊ฐ€ 2์ธ ๋“ฑ์ฐจ์ˆ˜์—ด๋กœ ๋ณธ๋‹ค. ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฌ๊ธฐ๋ฅผ ํด๋ฆญํ•ด์„œ ์ฐธ๊ณ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋”ฐ๋ผ์„œ ์ž…๋ ฅ๊ฐ’์ด ์ตœ๋Œ€ 1000์ด๋ฏ€๋กœ, ์„ธ ์ž๋ฆฌ ์ˆ˜ ๋˜๋Š” ๋„ค ์ž๋ฆฌ ์ˆ˜(1000 1๊ฐœ)์ธ ๊ฒฝ์šฐ๋งŒ ํ™•์ธ์„ ํ•˜๋ฉด ๋œ๋‹ค.

์„ธ์ž๋ฆฌ ์ˆ˜ ์ผ๋•Œ๋Š” ๋“ฑ์ฐจ์ˆ˜์—ด์˜ ์ •์˜์— ๋”ฐ๋ผ [์„ธ๋ฒˆ์งธ ์ž๋ฆฌ(ํ•ญ) - ๋‘๋ฒˆ์งธ ์ž๋ฆฌ(ํ•ญ)] == [๋‘๋ฒˆ์งธ ์ž๋ฆฌ(ํ•ญ) - ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ(ํ•ญ)] ์ฆ‰, ๊ณต์ฐจ(common difference)๊ฐ€ ๊ฐ™์ง€ ์•Š์€ ๊ฒฝ์šฐ ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋กœ ์นด์šดํŠธ ํ•ด์ค€๋‹ค.

๋งˆ์ง€๋ง‰์— ์ „์ฒด ์ˆ˜์—์„œ ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜๋ฅผ ๋นผ์ค€๋‹ค.

# case 1 : ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜ ์นด์šดํŠธํ•ด์„œ ์ „์ฒด์—์„œ ๋นผ๊ธฐ - ๋ฉ”๋ชจ๋ฆฌ 30864KB / ์‹œ๊ฐ„ 68ms
import sys
num = int(sys.stdin.readline())
count = 0  # ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜ ์นด์šดํŠธ

for i in range(1, num + 1):
    # ๊ธธ์ด๊ฐ€ 3์ž๋ฆฌ์ด๊ฑฐ๋‚˜ 4์ž๋ฆฌ์ผ๋•Œ๋งŒ ํ™•์ธ(1์ž๋ฆฌ ๋˜๋Š” 2์ž๋ฆฌ์ผ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ํ•œ์ˆ˜์ž„)
    if len(str(i)) == 3 and (int(str(i)[2]) - int(str(i)[1])) != (int(str(i)[1]) - int(str(i)[0])): count += 1
    elif len(str(i)) == 4: count += 1

print(num - count)


# ---------------------------------------------------------------------------------
# case 1 : (ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ธฐ) ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜ ์นด์šดํŠธํ•ด์„œ ์ „์ฒด์—์„œ ๋นผ๊ธฐ - ๋ฉ”๋ชจ๋ฆฌ 30864KB / ์‹œ๊ฐ„ 72ms
import sys
num = int(sys.stdin.readline())

def solve(num):
    count = 0  # ํ•œ์ˆ˜๊ฐ€ ์•„๋‹Œ ์ˆ˜ ์นด์šดํŠธ

    for i in range(1, num + 1):
        # ๊ธธ์ด๊ฐ€ 3์ž๋ฆฌ์ด๊ฑฐ๋‚˜ 4์ž๋ฆฌ์ผ๋•Œ๋งŒ ํ™•์ธ(1์ž๋ฆฌ ๋˜๋Š” 2์ž๋ฆฌ์ผ๋•Œ๋Š” ๋ฌด์กฐ๊ฑด ํ•œ์ˆ˜์ž„)
        if len(str(i)) == 3 and (int(str(i)[2]) - int(str(i)[1])) != (int(str(i)[1]) - int(str(i)[0])): count += 1
        elif len(str(i)) == 4: count += 1

    return num - count

print(solve(num))

2 ) ํ•œ์ˆ˜์ธ ์ˆ˜ ์นด์šดํŠธ ํ•˜๊ธฐ

ํ•œ์ˆ˜์ธ ์ˆ˜๋ฅผ ์นด์šดํŠธํ•ด๋ณด์ž. 99 ์ดํ•˜ ์ฆ‰ ๋‘์ž๋ฆฌ ์ˆ˜ ์ดํ•˜์ธ ๊ฒฝ์šฐ์—๋Š” case1๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•œ์ˆ˜๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ ์นด์šดํŠธ๋ฅผ ํ•ด์ค€๋‹ค.(sum = 99)

์„ธ์ž๋ฆฌ ์ˆ˜ ์ด์ƒ์ผ ๋•Œ๋Š”, ์ฒซ๋ฒˆ์งธ ์ˆ˜ + ์„ธ๋ฒˆ์งธ ์ˆ˜(2a+2b) == ๋‘๋ฒˆ์งธ์ˆ˜(a+b) * 2 ์ธ ๊ฒฝ์šฐ๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•œ์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€ ์•Š๋Š”๋‹ค๋ฉด ์•„๋ž˜์˜ ๊ทธ๋ฆผ์„ ์ฐธ๊ณ ํ•˜์ž. 

# case 2 : ํ•œ์ˆ˜์ธ ์ˆ˜ ์นด์šดํŠธ ์ •๋ฆฌ - ๋ฉ”๋ชจ๋ฆฌ 30864KB / ์‹œ๊ฐ„ 68ms
import sys
num = int(sys.stdin.readline())

if num <= 99: sum = num  # 3์ž๋ฆฌ ์ˆ˜ ์ดํ•˜์ผ ๋•Œ๋Š” ์ž…๋ ฅํ•œ ์ˆ˜ = ํ•œ ์ˆ˜
else:
    sum = 99  # 3์ž๋ฆฌ ์ˆ˜ ์ด์ƒ์ผ ๋•Œ๋Š”, ๋‘์ž๋ฆฌ ์ˆ˜๊นŒ์ง€๋Š” ํ•œ ์ˆ˜๋กœ ์นด์šดํŠธํ•˜๊ณ  ์‹œ์ž‘
    for i in range(100, num + 1):
        if i//100 + i%10 == ((i%100) // 10) * 2: sum += 1

print(sum)


# ---------------------------------------------------------------------------------
# case 2 : ํ•œ์ˆ˜์ธ ์ˆ˜ ์นด์šดํŠธ ์ดํ•ดํ•˜๊ธฐ
import sys
num = int(sys.stdin.readline())

if num <= 99: sum = num  # 3์ž๋ฆฌ ์ˆ˜ ์ดํ•˜์ผ ๋•Œ๋Š” ์ž…๋ ฅํ•œ ์ˆ˜ = ํ•œ ์ˆ˜
else:
    sum = 99  # 3์ž๋ฆฌ ์ˆ˜ ์ด์ƒ์ผ ๋•Œ๋Š”, ๋‘์ž๋ฆฌ ์ˆ˜๊นŒ์ง€๋Š” ํ•œ ์ˆ˜๋กœ ์นด์šดํŠธํ•˜๊ณ  ์‹œ์ž‘
    for i in range(100, num + 1):
        # ์ฒซ๋ฒˆ์งธ ์ˆ˜ + ์„ธ๋ฒˆ์งธ ์ˆ˜(2a+2b) == ๋‘๋ฒˆ์งธ์ˆ˜(a+b) * 2
        if i//100 + i%10 == ((i%100) // 10) * 2:
            print(i)  # ํ•œ์ˆ˜์ธ ์ˆ˜
            print(f"1 : {i//100}")  # 100์œผ๋กœ ๋‚˜๋ˆˆ ๋ชซ : ์ฒซ๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜(a)
            print(f"2 : {i%10}")  # 10์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€ : ์„ธ๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜(a+2b)
            print(f"3 : {(i%100 // 10) * 2}")  # ๋‘๋ฒˆ์งธ ์ž๋ฆฌ ์ˆ˜(a+b) * 2
            sum += 1

print(sum)


๐Ÿ“Ž Reference