โ๏ธ ๋ฌธ์ ์์ฝ
SW Expert Academy
SW ํ๋ก๊ทธ๋๋ฐ ์ญ๋ ๊ฐํ์ ๋์์ด ๋๋ ๋ค์ํ ํ์ต ์ปจํ ์ธ ๋ฅผ ํ์ธํ์ธ์!
swexpertacademy.com
์ซ์ํ๊ณผ ๊ตํ ํ์๊ฐ ์ฃผ์ด์ง๋ค. ์ฃผ์ด์ง ์ซ์ํ๋ค ์ค ๋ ์๋ฅผ ์ ํํด์ ์ ํด์ง ํ์๋งํผ ๊ตํํด์ผ ํ ๋, ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ง๋ค์ด๋ผ.
๐ช ๋ฌด์ํ๊ฒ ํ๊ธฐ
๊ตฌํ์ด ์ด๋ ต๋ค๊ธฐ ๋ณด๋ค๋ ์๊ฐํด์ผ ํ๋ ์กฐ๊ฑด์ด ๊น๋ค๋ก์ด ๋ฌธ์ ์๋ค. ๐ฅฒ
1. for๋ฌธ์ผ๋ก ์๊ธ(`price`)์ ๊ฐ ์๋ฆฌ๋ฅผ ์ํํ๋ฉด์, ๋(`price[i]`) ์ดํ์ ๋๋ณด๋ค ํฐ max๊ฐ ์์ผ๋ฉด ๋์ ๊ตํํ ๊ฒ์ด๋ค.
1-1. ์ด๋, ๊ฐ์ด ๊ฐ์ max๊ฐ ๋ ๊ฐ ์ด์ ์์ผ๋ฉด์ && ๋ด ๋ค์ ๋๋ณด๋ค ์์ ๊ฐ์ด ์์ผ๋ฉด -> ๋๋ ๋งจ ์ค๋ฅธ์ชฝ max๊ฐ ์๋, ๋งจ ์ค๋ฅธ์ชฝ max์์ ํ ์นธ ์์ max์ ๊ตํํด์ผ ํ๋ค. โญ๏ธ
1-2. ๋ง์ฝ max๊ฐ ํ ๊ฐ์ด๊ฑฐ๋ || ๋ ๊ฐ ์ด์์ด๋ผ๋ ๋ด ๋ค์ ๋๋ณด๋ค ์์ ๊ฐ์ด ์๋ค๋ฉด -> ๋์ ๋งจ ์ค๋ฅธ์ชฝ max๋ฅผ ๊ตํํ๋ค.
2. for๋ฌธ์ ๋ค ๋์๋๋ฐ ๊ตํ ํ์(`N`)๊ฐ ๋จ์๋ค๋ฉด
2-1. ์๊ธ(`price`)์ ๊ฐ์ ์๊ฐ ๋ ๊ฐ ์ด์ ์๋ค๋ฉด -> ๊ทธ๋๋ก ์ข ๋ฃํ๋ค. (๊ฐ์ ์๋ผ๋ฆฌ ๊ณ์ ๊ตํํด์ ๊ตํ ํ์๋ฅผ ์๋ชจํ๋ฉด ๋๊ธฐ ๋๋ฌธ)
2-2. ์๊ธ์ด ๋ชจ๋ ๋ค๋ฅธ ์๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ฉด
2-2-1. ๊ตํ ํ์(`N`)๊ฐ ์ง์๊ฐ ๋จ์๋ค๋ฉด -> ๊ทธ๋๋ก ์ข ๋ฃํ๋ค. (์๋ฌด๊ฑฐ๋ ๋ ๊ฐ ๊ตํํ๊ณ ๋ค์ ์์๋ณต๊ทํ๋ฉด ๋๊ธฐ ๋๋ฌธ)
2-2-2. ๊ตํ ํ์(`N`)๊ฐ ํ์๊ฐ ๋จ์๋ค๋ฉด -> ์ ์ผ ์ค๋ฅธ์ชฝ ๋ ์๋ฆฌ๋ฅผ ํ ๋ฒ๋ง ๊ตํํ๋ค. (์ง์๋ฒ์ ์์๋ณต๊ทํ ์ ์๋ค๊ณ ํ๋ค. ๋ฐ๋ผ์, ํ์๋ฒ์ ์ง์๋ฒ + 1 ์ด๋ฏ๋ก ํ ๋ฒ๋ง ๊ตํํ๋ฉด ๋๋ค. ๊ตํ ํ์๋ฅผ ๋ชจ๋ ์๋ชจํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ฌด์กฐ๊ฑด ํ ๋ฒ์ ๊ตํํด์ผ ํ๋ค. ๋ฐ๋ผ์, ์๊ฐ ์ต์ํ์ผ๋ก ์์์ง๋๋ก ๋งจ ์ค๋ฅธ์ชฝ ๋ ์๋ฆฌ๋ฅผ ๊ตํํ์.)
import sys
sys.stdin = open("input.txt", "r")
sys.stdout = open("output.txt", "w")
def find_all_max_index(start_idx):
mx = -1e9
max_idx = []
for i in range(start_idx, len(price)):
if price[i] > mx:
mx = price[i] # ์ต๋๊ฐ ๊ฐฑ์
max_idx = [i]
elif price[i] == mx:
max_idx.append(i)
return max_idx # ๋ชจ๋ ์ต๋๊ฐ ์ธ๋ฑ์ค
# lst์ ๊ณตํต ์์ 2๊ฐ ์ด์ ์กด์ฌํ๋์ง ํ์ธ
def is_exist_duplicated_value(lst):
visited = [0] * 10
for x in lst:
visited[x] += 1
if visited[x] > 1: return True
return False
# ๋ ์ดํ์ ๋๋ณด๋ค ์์ ์์ ์๋์ง ํ์ธ
def is_exist_smaller_than_me(start_idx, target):
for i in range(start_idx, len(price)):
if price[i] < target: return True
return False
if __name__ == '__main__':
T = int(input())
for test_case in range(1, T+1):
price, N = map(int, input().split())
price = list(map(int, str(price)))
for i in range(len(price)):
# ๋ ์ดํ ์์๋ค ์ค max๊ฐ ๋๋ณด๋ค ํฌ๋ฉด ๋์ ๋ณ๊ฒฝํ ๊ฑด๋ฐ
if len(find_all_max_index(i+1)) > 0 and price[i] < price[find_all_max_index(i+1)[0]]:
# 1) ๊ฐ์ max๊ฐ ๋ ๊ฐ ์ด์ ์์ผ๋ฉด์, ๋ด ๋ค์ ๋๋ณด๋ค ์์ ๊ฐ ์์ผ๋ฉด -> ๋๋ ๋ง์ง๋ง ํ ์นธ ์ผ์ชฝ๊ณผ ๊ตํ (๋ง์ง๋ง ๋ง๊ณ )
if len(find_all_max_index(i+1)) >= 2 and is_exist_smaller_than_me(i+1, price[i]):
price[i], price[find_all_max_index(i+1)[-2]] = price[find_all_max_index(i+1)[-2]], price[i]
else: # 2) ์๋๋ผ๋ฉด ๋์ ๋ง์ง๋ง ๊ตํ
price[i], price[find_all_max_index(i + 1)[-1]] = price[find_all_max_index(i + 1)[-1]], price[i]
N -= 1
if N == 0: break
# N(๊ตํ ํ์)์ด ๋จ์๋ค๋ฉด
if N > 0 and not is_exist_duplicated_value(price) and N % 2 == 1:
# ์ด์ฉ ์ ์์ด ์ ์ผ ์ค๋ฅธ์ชฝ ๋ ์๋ฆฌ ๋ณ๊ฒฝ
price[-1], price[-2] = price[-2], price[-1]
print('#{}'.format(test_case), end=' ')
print(*price, sep='')
โจ ์ฐ์ํ๊ฒ ํ๊ธฐ (DFS)
DFS๋ฅผ ์ด์ฉํด์ ์์ ํ์์ผ๋ก ํ ์๋ ์๋ค.
๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ค ์์ ํ์ํ๊ฒ ๋๋ฉด 15^10๊น์ง์ ๊ฒฝ์ฐ์ ์๊ฐ ๋์ค๊ธฐ ๋๋ฌธ์ โญ๏ธ ๊ฐ์ง์น๊ธฐ๊ฐ ์ค์ํ๋ค!
1. ์ฐ์ ์๊ธ(`price`)์ ์ ๋ ฅ ๋ฐ์ ๋ค, ์๊ธ์ ์๋ฆฌ์๋งํผ `index` ๋ฆฌ์คํธ๋ฅผ ์์ฑํด๋์. (DFS ํ ๋ `combinations()` ๋ฉ์๋๋ฅผ ์ด์ฉํ๊ธฐ ์ํด์์ด๋ค.)
2. ์ด์ DFS๋ฅผ ํตํด ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๋ค.
๊ตํ ํ์๊ฐ `N`์ด๊ธฐ ๋๋ฌธ์, Level(`L`)์ด N์ด ๋ ๋ ์ต๋๊ฐ(`mx`)์ ๊ฐฑ์ ํ๋ค. (์๋ฅผ ๋ค์ด `price` = [1,2,3] ์ด๋ผ๋ฉด `int(''.join(map(str, price)))`๋ 123(๋ฐฑ์ด์ญ์ผ)์ด ๋๋ค.)
๊ทธ๋ฆฌ๊ณ ์๊น ์์ฑํด๋์ `index` ๋ฆฌ์คํธ ์ค ์์ ์์ด(combination) ๋ ๊ฐ๋ฅผ ๋ฝ๋๋ค. (์ด๋ ๋ฝ์ ์๋ price์ '์ธ๋ฑ์ค'์ด๋ค.)
๊ทธ๋ฆฌ๊ณ ๋ฌํํ๊ฒ๋ ๋ฝ์ ๋ ์๋ฅผ ๊ตํํ๋ค ๋ค์ DFS(`DFS(L+1)`)๋ฅผ ํธ์ถํ๊ณ , ์ด๋ ๊ตํํ ๋ ์๋ฅผ ๋ค์ ์๋๋๋ก ๋๋ ค๋์์ผํ๊ธฐ ๋๋ฌธ์ DFS ํธ์ถ ์ดํ์ ํ๋ฒ ๋ ๊ตํํด๋์ผ๋ฉด ๋๋ค. (ํ์ง๋ง ๋ค์ DFS๋ฅผ ํธ์ถํ๊ธฐ ์ ์ '๊ฐ์ง์น๊ธฐ'๋ฅผ ํด์ผ ์๊ฐ์ด๊ณผ๊ฐ ์๋๋ค!)
๊ฐ์ง์น๊ธฐ๋ฅผ ์ด๋ค ๊ธฐ์ค์ผ๋ก ํ ๊นโ
์ซ์์ ๊ทธ ๋์ ๋ ๋ฒจ์ `visited` ๋ฐฐ์ด์ ๋ด์๋์ผ๋ฉด ๋๋คโ๏ธ (์ด๋ ๋งํ๋ ๋ ๋ฒจ์ '๋ช ๋ฒ์งธ ๊ตํ์ธ์ง'๋ฅผ ์๋ฏธํ๋ค.)
์๋ฅผ ๋ค์ด, [3,2,8,8,8]์ด๋ผ๋ ์ซ์ํ์ด ์ฃผ์ด์ก์ ๋,
์ฒซ ๋ฒ์งธ ๊ตํ์์ 2๋ฒ์ธ๋ฑ์ค <-> 3๋ฒ ์ธ๋ฑ์ค๋ฅผ ๊ตํํ๋ค๊ณ ๊ฐ์ ํ์. ๊ทธ๋ผ `visited`์ `(1, 32888)`์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
๋ ๋ฒ์งธ ๊ตํ์์ ๋ 2๋ฒ ์ธ๋ฑ์ค <-> 3๋ฒ ์ธ๋ฑ์ค๋ฅผ ๊ตํํ๋ค๋ฉด, `visited`์ `(2, 32888)`์ ์ถ๊ฐํ๋ค.
์ค์ํ ๊ฒ์, ์๊ฐ ๊ฐ๋๋ผ๋ ๊ทธ๊ฒ ๋ช ๋ฒ์งธ ๊ตํ(=๋ ๋ฒจ)์ธ์ง์ ๋ฐ๋ผ ์๋ฏธ๊ฐ ๋ค๋ฅด๋, `visited`์ ์์ ๋ ๋ฒจ์ ๊ผญ ํจ๊ป ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ DFS๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ํด๋น (๋ ๋ฒจ, ์)๊ฐ `visited`์ ์๋์ง ํ์ธํ๋ค. `visited`์ ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ๋ ์ด์ ๊ฐ ํ์๊ฐ ์๋ ๊ธธ์ธ ๊ฒ์ด๋ค. (์ด์ ์ ์ด๋ฏธ ๊ฐ์๊ฑธ ํ์๊ธฐ ๋๋ฌธ!)
from itertools import combinations
def DFS(L):
global mx
if L == N:
mx = max(mx, int(''.join(map(str, price))))
return
for a, b in combinations(index, 2):
price[a], price[b] = price[b], price[a]
num = int(''.join(map(str, price))) # ๊ฐ์ง์น๊ธฐ๋ฅผ ์ํด
if (L, num) not in visited:
DFS(L+1)
visited.append((L, num)) # ๋ค ๊ฐ๋ค๊ฐ ์ฌ๋ผ์ค๋ฉด์ ์ฒดํฌ
price[a], price[b] = price[b], price[a] # ์์๋ณต๊ตฌ (๋ฐฑํธ๋ํน)
T = int(input())
for test_case in range(1, T+1):
price, N = map(int, input().split())
price = list(map(int, str(price)))
index = [x for x in range(len(price))]
visited = []
mx = -1e9
DFS(0)
print('#{} {}'.format(test_case, mx))
๐ ์ฐธ๊ณ
๋ฐฑํธ๋ํน #12 ์ต๋ ์๊ธ (SWEA)
'๐ซ ETC > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA] 1220.[S/W ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ] 5์ผ์ฐจ - Magnetic (2) | 2023.11.18 |
---|---|
[SWEA] 1206. [S/W ๋ฌธ์ ํด๊ฒฐ ๊ธฐ๋ณธ] 1์ผ์ฐจ - View (๊ตฌํ) (0) | 2023.11.15 |
[SWEA] 1928. Base64 Decoder (2) | 2023.11.14 |
[SWEA] 2001. ํ๋ฆฌ ํด์น (DP) (2) | 2023.11.09 |
[๊นํ์ ์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ณผ๋๋ฌด (BFS) (0) | 2023.11.07 |