๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • What would life be If we had no courage to attemp anything?
Problem Solving/BAEKJOON

[baekjoon]python #2469 ์‚ฌ๋‹ค๋ฆฌ ํƒ€๊ธฐ

by DevIseo 2022. 5. 3.

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

 

2469๋ฒˆ: ์‚ฌ๋‹ค๋ฆฌ ํƒ€๊ธฐ

์ฒซ ์ค„์—๋Š” ์ฐธ๊ฐ€ํ•œ ์‚ฌ๋žŒ์˜ ์ˆ˜ k๊ฐ€ ๋‚˜์˜จ๋‹ค(3 โ‰ค k โ‰ค 26). ๊ทธ ๋‹ค์Œ ์ค„์—๋Š” ๊ฐ€๋กœ ๋ง‰๋Œ€๊ฐ€ ๋†“์ผ ์ „์ฒด ๊ฐ€๋กœ ์ค„์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” n์ด ๋‚˜์˜จ๋‹ค(3 โ‰ค n โ‰ค 1,000). ๊ทธ๋ฆฌ๊ณ  ์„ธ ๋ฒˆ์งธ ์ค„์—๋Š” ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ํƒ€๊ณ  ๋‚œ ํ›„ ๊ฒฐ์ •

www.acmicpc.net

 

#์ฒ˜์Œ์— ์ƒ๊ฐํ–ˆ๋˜ ๋ฐฉ๋ฒ•

์ฒ˜์Œ๊ณผ ๋„์ฐฉ์˜ ์ด๋™๋œ ์œ„์น˜์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ฐ๊ฐ ์ฒดํฌํ•ด ์ด๋™๋œ ์ˆซ์ž๋ฅผ ๋”ํ•ด 2๋กœ ๋‚˜๋ˆ„์—ˆ๋‹ค.

์œ„์˜ ์ˆซ์ž์™€ ladder์— ๋ฐ›์€ '-'์™€ ๋น„๊ตํ•ด ๊ทธ ์ฐจ์ด๊ฐ€ '??'์— ๋“ค์–ด๊ฐ€๋Š” '-'์˜ ๊ฐฏ์ˆ˜์ธ ์ ์„ ๋ฐœ๊ฒฌํ–ˆ๋‹ค.

๋งŒ์•ฝ ladder์˜ '-'์˜ ๊ฐฏ์ˆ˜๊ฐ€ ์ฒดํฌ๋œ ์ˆ˜๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ''??'์—๋Š” 'xx'๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ ,

๊ฐ™๋‹ค๋ฉด '**'๋กœ ์ฑ„์›Œ์ง€๋Š” ๋กœ์ง.. ๊ทธ๋Ÿฌ๋‚˜ ??์— '-','*'์˜ ๋ฐฐ์น˜์— ์–ด๋ ค์›€์ด ์žˆ๋Š” ์ฝ”๋“œ๋ผ ๊ฒฐ๊ตญ ํ๊ธฐํ–ˆ๋‹ค.

k = int(input()) # ์‚ฌ๋žŒ์ˆ˜
n = int(input()) # ์‚ฌ๋‹ค๋ฆฌ์ค„ ์ˆ˜

result = list(map(ord,input()))
ladder = [list(map(str,input())) for _ in range(n)]

alp = []
for i in range(k):
    alp.append(ord('A')+i)

vs = []
for j in range(k):
    a = alp[j]-result[j]
    vs.append(a)

sumV=0
for v in vs:
    if v >0:
        sumV+=v

cnt=0
for y in range(len(ladder)):
    for x in range(len(ladder[y])):
        if ladder[y][x] == '-':
            cnt+=1

output_cnt = cnt-sumV
if output_cnt <0:
    print('x'*(k-1))
elif output_cnt == 0:
    print('*'*(k-1))
else:
    pass  #๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•˜์ง€ ๋ชปํ•œ ๋ถ€๋ถ„...

print(vs)

 

#์ตœ์ข… ์ฝ”๋“œ

์Šคํ„ฐ๋””์›์˜ ์•„์ด๋””์–ด๋ฅผ ๋””๋ฒจ๋กญํ–ˆ๋‹ค.

๋ฌผ์Œํ‘œ ์œ„์™€ ๋ฌผ์Œํ‘œ ์•„๋ž˜๋ฅผ ๋น„๊ตํ•ด์„œ '??'๋ถ€๋ถ„์— ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ๋ฒ•

์ฒ˜์Œ์—๋Š” ladder๋ฐฐ์—ด์—์„œ ์‚ฌ๋‹ค๋ฆฌ๋ฅผ ์ง์ ‘ ํƒ€์•ผํ•˜๋‚˜ ํ–ˆ์ง€๋งŒ,

start๋ฐฐ์—ด๊ณผ result๋ฐฐ์—ด์„ ์ง์ ‘ swapํ•˜์—ฌ ๋น„๊ตํ•˜๋ฉด ๋˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

def find():
    global ladder,result,k,n
    start = [] #์‹œ์ž‘์ ์˜ ABCD... ๋„ฃ์–ด ์ฃผ๊ธฐ์œ„ํ•œ ๋นˆ ๋ฆฌ์ŠคํŠธ
    for i in range(k):
        start.append(chr(ord('A') + i))
    mark = 0 #๋ฌผ์Œํ‘œ ์žˆ๋Š” ์ค„

    #๋ฌผ์Œํ‘œ ์œ„ ์•ŒํŒŒ๋ฒณ
    for y in range(n):
        if ladder[y][0] == '?':
            mark = y
            break
        else:
            for x in range(k-1):
                if ladder[y][x] == '-':
                    start[x],start[x+1] = start[x+1],start[x]

    #๋ฌผ์Œํ‘œ ์•„๋ž˜ ์•ŒํŒŒ๋ฒณ
    for y in reversed(range(mark+1,n)): #์•„๋ž˜๋ถ€ํ„ฐ ์œ„๋กœ!
        if ladder[y][0] == '?':
            break
        else:
            for x in range(k-1):
                if ladder[y][x] == '-':
                    result[x],result[x+1] = result[x+1],result[x]

    answer=[]
    #๋ฌผ์Œํ‘œ ์œ„์™€ ์•„๋ž˜ ๋น„๊ต
    for i in range(k-1):
        if start[i] == result[i]: #๊ฐ™์„๋•Œ
            answer.append('*')
        else: #๋‹ค๋ฅผ๋•Œ
            if start[i] == result[i+1]: #์˜†(์˜ค๋ฅธ์ชฝ) ์ธ๋ฑ์Šค๋ž‘ ๊ฐ™์œผ๋ฉด
                answer.append('-')
            elif i!=0 and start[i]==result[i-1]: #์˜†(์™ผ์ชฝ) ์ธ๋ฑ์Šค๋ž‘ ๊ฐ™์œผ๋ฉด, out of index ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด i๊ฐ€ 0์ธ๊ฑธ ๋ฐฐ์ œ
                answer.append('*')
            else: #์–ด๋–ค ๊ตฌ์„ฑ์œผ๋กœ๋„ ๋งŒ๋“ค ์ˆ˜ ์—†์„ ๋•Œ
                return (''.join(['x' for _ in range(k - 1)]))

    return ''.join(answer)



k = int(input()) # ์‚ฌ๋žŒ์ˆ˜
n = int(input()) # ์‚ฌ๋‹ค๋ฆฌ์ค„ ์ˆ˜
result = list(map(str,input())) #๋„์ฐฉํ–ˆ์„ ๋•Œ
ladder = [list(map(str,input())) for _ in range(n)] #์‚ฌ๋‹ค๋ฆฌ์˜ ๋ฐฐ์—ด

ret = find()
print(ret)

๋Œ“๊ธ€