๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

[๋ฐฑ์ค€] 1759 ์•”ํ˜ธ๋งŒ๋“ค๊ธฐ (python ํŒŒ์ด์ฌ)

์ œ๋ด‰์•„ 2023. 3. 30. 11:26

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

 

1759๋ฒˆ: ์•”ํ˜ธ ๋งŒ๋“ค๊ธฐ

์ฒซ์งธ ์ค„์— ๋‘ ์ •์ˆ˜ L, C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. (3 ≤ L ≤ C ≤ 15) ๋‹ค์Œ ์ค„์—๋Š” C๊ฐœ์˜ ๋ฌธ์ž๋“ค์ด ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์ฃผ์–ด์ง„๋‹ค. ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ž๋“ค์€ ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์ด๋ฉฐ, ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์€ ์—†๋‹ค.

www.acmicpc.net


์ฒ˜์Œ์—๋Š” itertools ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ˆœ์—ด์„ ๊ตฌํ•˜๊ณ , ๊ฐ ์ˆœ์—ด๋งˆ๋‹ค ๊ฒ€์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํ–ˆ๋Š”๋ฐ ์‹œ๊ฐ„์ดˆ๊ณผ ๋˜์—ˆ๋‹ค.

์ƒ๊ฐํ•ด ๋ณด๋ฉด ์ตœ๋Œ€ ๊ฒฝ์šฐ๊ฐ€ 15P15๊นŒ์ง€ ๋‚˜์˜ค๋ฏ€๋กœ ์ด ๋ฐฉ๋ฒ•์€ ๋‹น์—ฐํžˆ ์•„๋‹ˆ์—ˆ๋‹ค.

 

์•”ํ˜ธ๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์•”ํ˜ธ๋ฅผ ์กฐ๊ฑด์— ๋งž๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด ํ•ด๊ฒฐํ•˜์˜€๋‹ค.


์•„์ด๋””์–ด

1. ์•”ํ˜ธ ์กฐ๊ฑด

  • ์•”ํ˜ธ์— ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์„ ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ(aescend)๋กœ ๋ฐฐ์—ด๋˜์—ˆ๋‹ค.
  • ์•”ํ˜ธ์—๋Š” ๋ชจ์Œ 1๊ฐœ ์ด์ƒ, ์ž์Œ 2๊ฐœ ์ด์ƒ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

2. ๋ฐฑํŠธ๋ž˜ํ‚น

  • ๋ฐฑํŠธ๋ž˜ํ‚น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ์•ŒํŒŒ๋ฒณ์ด ์ฆ๊ฐ€ํ•˜๋Š” ์ˆœ์„œ๋กœ ์•”ํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด ์ค€๋‹ค.
  • ์•”ํ˜ธ๋ฌธ์˜ ๊ธธ์ด๊ฐ€ L์ด ๋˜๋ฉด ์ž์Œ๊ณผ ๋ชจ์Œ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•ด ์ค€๋‹ค.
  • ์กฐ๊ฑด์ด ๋งž์œผ๋ฉด ์•”ํ˜ธ๋ฌธ์„ ์ถœ๋ ฅํ•ด ์ค€๋‹ค.

์ „์ฒด ์ฝ”๋“œ

vowel = ['a', 'e', 'i', 'o', 'u']

L, C = map(int, input().split())
words = input().split()

words.sort() 

def check(arr):
    v_count, c_count = 0, 0 # ๋ชจ์Œ ๊ฐœ์ˆ˜, ์ž์Œ ๊ฐœ์ˆ˜

    for i in arr:
        if i in vowel:
            v_count += 1
        else:
            c_count += 1

    if v_count >= 1 and c_count >= 2:
        return True
    else:
        return False

def backtracking(arr):

    if len(arr) == L:
        if check(arr):
            print("".join(arr))
            return

    for i in range(len(arr), C):
        if arr[-1] < words[i]:
            arr.append(words[i])
            backtracking(arr)
            arr.pop()

for i in range(C - L + 1):
    a = [words[i]]
    backtracking(a)

์ฝ”๋“œ ์„ค๋ช…

vowel = ['a', 'e', 'i', 'o', 'u']

L, C = map(int, input().split())
words = input().split()

words.sort()

๋‚˜์ค‘์— ์•”ํ˜ธ๋ฌธ์˜ ๋ชจ์Œ, ์ž์Œ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•˜๋‚˜ ์„ ์–ธํ•ด ๋‘”๋‹ค.

์ฃผ์–ด์ง„ ์ž…๋ ฅ์„ ๋ฐ›๊ณ , ์ฃผ์–ด์ง„ ๋ฌธ์ž๋“ค์€ ์•ŒํŒŒ๋ฒณ์ˆœ์œผ๋กœ ์ •๋ ฌ(sort())ํ•œ๋‹ค.

 

for i in range(C - L + 1):
    a = [words[i]]
    backtracking(a)

๊ทธ๋ฆฌ๊ณ  ๊ฐ ์•ŒํŒŒ๋ฒณ์„ ์‹œ์ž‘์œผ๋กœ backtrackingํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์ด๋•Œ ์•”ํ˜ธ๋ฌธ์˜ ๊ธธ์ด(L)๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ œ์™ธํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ์˜ˆ์ œ์— ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์„ ๋ณด๋ฉด a, c, i๊นŒ์ง€ ์•”ํ˜ธ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ  ๊ทธ ์ดํ›„๋กœ๋Š” ์•”ํ˜ธ๋ฌธ ๊ธธ์ด๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๋‹ˆ๊นŒ ์ œ์™ธํ•œ๋‹ค.

 

def backtracking(arr):

    if len(arr) == L:
        if check(arr):
            print("".join(arr))
            return

    for i in range(len(arr), C):
        if arr[-1] < words[i]:
            arr.append(words[i])
            backtracking(arr)
            arr.pop()

backtrackingํ•จ์ˆ˜๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

๋จผ์ € ํƒˆ์ถœ ์กฐ๊ฑด์œผ๋กœ ์•”ํ˜ธ ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ L์ด ๋˜๋ฉด checkํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด ๋ชจ์Œ, ์ž์Œ์„ ํ™•์ธํ•ด ์ค€๋‹ค.

์กฐ๊ฑด์ด ์ฐธ์ด๋ฉด ์•”ํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  return ํ•ด์ค€๋‹ค. join ๋ฉ”์„œ๋“œ๋ฅผ ์จ์„œ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ถœ๋ ฅํ•ด ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

์•„์ง ๊ธธ์ด๊ฐ€ L์ด ์•„๋‹ˆ๋ฉด ์•ŒํŒŒ๋ฒณ์„ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค. if๋ฌธ์„ ์‚ฌ์šฉํ•ด ์•”ํ˜ธ๋ฌธ์ด ascend ํ•˜๊ฒŒ ์•ŒํŒŒ๋ฒณ์„ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

 

def check(arr):
    v_count, c_count = 0, 0 # ๋ชจ์Œ ๊ฐœ์ˆ˜, ์ž์Œ ๊ฐœ์ˆ˜

    for i in arr:
        if i in vowel:
            v_count += 1
        else:
            c_count += 1

    if v_count >= 1 and c_count >= 2:
        return True
    else:
        return False

checkํ•จ์ˆ˜๋Š” ์œ„์™€ ๊ฐ™๋‹ค.

์ž…๋ ฅ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ(arr)๋ฅผ ํ•œ๋ฒˆ ์Šค์บ”ํ•˜์—ฌ ๋ชจ์Œ๊ณผ ์ž์Œ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์กฐ๊ฑด์— ๋งž์œผ๋ฉด True,

์กฐ๊ฑด์— ๋งž์ง€ ์•Š์œผ๋ฉด False๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.