๐ŸŒฑ → ๐ŸŒณ

[Baekjoon] 1469. ์ˆŒ ์‚ฌ์ด ์ˆ˜์—ด - python ๋ณธ๋ฌธ

Algorithms

[Baekjoon] 1469. ์ˆŒ ์‚ฌ์ด ์ˆ˜์—ด - python

BAY 2023. 9. 29. 17:17
728x90

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

 

1469๋ฒˆ: ์ˆŒ ์‚ฌ์ด ์ˆ˜์—ด

์ฒซ์งธ ์ค„์— X์˜ ํฌ๊ธฐ N์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— X์— ๋“ค์–ด๊ฐ€๋Š” ์ˆ˜๊ฐ€ ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. X์˜ ํฌ๊ธฐ๋Š” 8๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. X์˜ ์›์†Œ๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ  16๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ •์ˆ˜

www.acmicpc.net

๋ฌธ์ œ ์ •๋ณด

๋ฌธ์ œ ์œ ํ˜• ๋‚œ์ด๋„ ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ํ•ด๊ฒฐ ์œ ๋ฌด ์Šค์Šค๋กœ ๊ตฌํ˜„ ์„ฑ๊ณต
๋ฐฑํŠธ๋ž˜ํ‚น ๊ณจ๋“œ 5 1h o x

์„ค๊ณ„ ๋ฐฉ๋ฒ•

๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜

๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆซ์ž๋ฅผ ์‹œ๋„ํ•˜๊ณ , ๊ทธ ์„ ํƒ์ด ์œ ํšจํ•œ์ง€ ํ™•์ธํ•จ

๋งŒ์•ฝ ์„ ํƒ์ด ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ ์ˆซ์ž๋กœ ๋„˜์–ด๊ฐ€๊ณ , ์œ ํšจํ•˜๋ฉด ์žฌ๊ท€์ ์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํƒ์ƒ‰ํ•จ

  1. back ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ์œ„์น˜(pos)์™€ ๊ฐ ์ˆซ์ž์˜ ์ด์ „ ์œ„์น˜(prev)๋ฅผ ์ธ์ž๋กœ ๋ฐ›์Œ
  2. pos๊ฐ€ 2 * N๊ณผ ๊ฐ™๋‹ค๋ฉด ๋ชจ๋“  ์œ„์น˜์— ๋Œ€ํ•ด ๊ฐ’์„ ํ• ๋‹นํ–ˆ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ True๋ฅผ ๋ฐ˜ํ™˜
  3. ๊ฐ ๋‹จ๊ณ„์—์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์ˆซ์ž i์— ๋Œ€ํ•ด ๋ฐ˜๋ณต๋ฌธ ์‹คํ–‰
    • used[i] < 2: ํ•ด๋‹น ์ˆซ์ž i๊ฐ€ ์•„์ง ๋‘ ๋ฒˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธ
    • (prev[i] != -1 and pos - prev[i] == X[i]+1) or (prev[i] == -1): ์ด์ „์— ํ•ด๋‹น ์ˆซ์ž i๊ฐ€ ์‚ฌ์šฉ๋œ ์ ์ด ์žˆ๊ณ , ํ˜„์žฌ ์œ„์น˜์™€ ์ด์ „ ์œ„์น˜ ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ํ•ด๋‹น ์ˆซ์ž์™€ ์ผ์น˜ํ•˜๊ฑฐ๋‚˜, ์ด์ „์— ํ•ด๋‹น ์ˆซ์ž i๊ฐ€ ์‚ฌ์šฉ๋œ ์ ์ด ์—†๋Š” ๊ฒฝ์šฐ
  4. ์œ„์˜ ์กฐ๊ฑด๋“ค์„ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ:
    • ์ˆ˜์—ด S์˜ ํ˜„์žฌ ์œ„์น˜ pos์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ i๋กœ ์„ค์ •ํ•˜๊ณ ,
    • used ๋ฐฐ์—ด์—์„œ i๋ฒˆ์งธ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ,
    • prev ๋ฐฐ์—ด์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ฑ์žฅํ•œ i์˜ ์œ„์น˜๋ฅผ ํ˜„์žฌ pos๋กœ ์—…๋ฐ์ดํŠธ
  5. ๊ทธ ํ›„ ์žฌ๊ท€์ ์œผ๋กœ back ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ํƒ์ƒ‰
  6. ๋งŒ์•ฝ back ํ•จ์ˆ˜ ํ˜ธ์ถœ ๊ฒฐ๊ณผ True๋ผ๋ฉด, ์ •์ƒ์ ์ธ ์ˆ˜์—ด ์ƒ์„ฑ ์™„๋ฃŒ๋ผ๋Š” ์˜๋ฏธ๋‹ˆ๊นŒ True ๋ฐ˜ํ™˜
  7. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์ˆ˜ํ–‰:
    • ์ˆ˜์—ด S์˜ ํ˜„์žฌ ์œ„์น˜ pos๊ฐ’ ์ดˆ๊ธฐํ™”
    • used ๋ฐฐ์—ด์—์„œ i๋ฒˆ์งธ ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๋ฉฐ,
    • prev ๋ฐฐ์—ด์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ฑ์žฅํ•œ i์˜ ์œ„์น˜ ์ •๋ณด ์›์ƒ ๋ณต๊ตฌ
  8. ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ ํƒ์ƒ‰ ํ›„ ๋ฌธ์ œ ํ•ด๊ฒฐ ์‹คํŒจ๋ผ๋ฉด False ๋ฐ˜ํ™˜
  • N์€ ์ง‘ํ•ฉ X ์•ˆ ์š”์†Œ ๊ฐœ์ˆ˜
  • X: ์ง‘ํ•ฉ X ์•ˆ ์š”์†Œ๋“ค (์—ฌ๊ธฐ์„œ๋Š” 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ์ˆซ์ž)
  • S: ์ƒ์„ฑํ•  ์ˆ˜์—ด, ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋‘ 0์œผ๋กœ ์„ค์ •
  • used: ๊ฐ ์ˆซ์ž๊ฐ€ ๋ช‡ ๋ฒˆ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด
  • prev: ๊ฐ ์ˆซ์ž๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ๋“ฑ์žฅํ•œ ์œ„์น˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฐ์—ด, ์ดˆ๊ธฐ์—๋Š” ๋ชจ๋‘ -1๋กœ ์„ค์ •

๋งŒ์•ฝ ์ˆ˜์—ด ์ƒ์„ฑ์ด ์„ฑ๊ณต์ ์ด๋ผ๋ฉด ์ƒ์„ฑ๋œ ์ˆ˜์—ด์„ ์ถœ๋ ฅํ•˜๊ณ , ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด -1์„ ์ถœ๋ ฅ

์ฝ”๋“œ

def back(pos, prev):
    if pos == 2 * N:
        return True

    for i in range(N):
        if used[i] < 2 and ((prev[i] != -1 and pos - prev[i] == X[i]+1) or (prev[i] == -1)):
            S[pos] = X[i]
            used[i] += 1
            prev_tmp = prev[i]
            prev[i] = pos

            if back(pos + 1, prev):
                return True
            
            # Backtrack
            used[i] -= 1
            S[pos] = 0
            prev[i]=prev_tmp
    return False

N = int(input())
X = sorted(list(map(int, input().split()))) # ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ๊ฐœ์ผ ๊ฒฝ์šฐ ์‚ฌ์ „ ์ˆœ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ๊ฒƒ์„ ์ถœ๋ ฅ
S=[0]*2*N 
used=[0]*N 
prev=[-1]*N 

if back(0,prev): 
    print(' '.join(map(str,S)))
else:
    print(-1)
728x90