Problem
Code
ย #1. ํ๋ฆฐ ํ์ด
Idea
[์ต์ด์์ด๋์ด]
์กฐ์ด์คํฑ์ ์ต์ ํ์๋ (์ปค์๋ฅผ ์ด๋ํ๋ ํ์) + (์ํ๋ฒณ์ "A"์์ ์ํ๋ ์ํ๋ฒณ๊น์ง ์ด๋ํ๋ ํ์) ์ด๋ค.
์ฌ๊ธฐ์ (์ํ๋ฒณ์ "A"์์ ์ํ๋ ์ํ๋ฒณ๊น์ง ์ด๋ํ๋ ํ์) ๋ ๊ณ ์ ๋ผ์์ผ๋ฏ๋ก (์ปค์๋ฅผ ์ด๋ํ๋ ํ์) ์ ์ต์๊ฐ์ ๊ตฌํด์ผํ๋ค.
์ปค์๋ฅผ ์ด๋ํ๋ ํ์ ๊ตฌํ๊ธฐ
๊ฐ์ฅ ๊ธด A ๊ทธ๋ฃน์ ์ ์ง๋๊ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ผ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. (โ ์ค์ ๋ก๋ ํจ์จ์ ์ด์ง ์์๋ค. )
๊ทธ๋์ ๊ฐ์ฅ ๊ธด A ๊ทธ๋ฃน์ ์์์ธ๋ฑ์ค์ ๋์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ๊ธด A ๊ทธ๋ฃน์ ์ค์ฌ์ผ๋ก ์ผ์ชฝ๊ทธ๋ฃน๊ณผ ์ค๋ฅธ์ชฝ๊ทธ๋ฃน์ ๋๋ด๋ค.
BBAABBBAAAAABB ๊ฐ ์์ผ๋ฉด
โข
์ผ์ชฝ๊ทธ๋ฃน : BBAABBB
โข
๊ฐ์ฅ ๊ธด A ๊ทธ๋ฃน : AAAAA
โข
์ค๋ฅธ์ชฝ๊ทธ๋ฃน : BB
โข
default(๊ธฐ๋ณธ์งํ) : ๊ทธ๋ฅ ์ค๋ฅธ์ชฝ์ผ๋ก ์ญ ์งํ
โข
left_twice (์ผ์ชฝ 2๋ฒ, ์ค๋ฅธ์ชฝ 1๋ฒ) : ์ผ์ชฝ๊ทธ๋ฃน์์ ๊ฐ์ฅ ๊ธด A ๊ทธ๋ฃน ์ง์ ๊น์ง ์งํํ๋ค๊ฐ ๋ค์ ์ผ์ชฝ๊ทธ๋ฃน์ ์ฒ์์ผ๋ก ๋์์จ๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ์ผ๋ก ๋ค์ ์งํํ๋ฉด์ ์ค๋ฅธ์ชฝ ๊ทธ๋ฃน์ ํ์ํ๋ค.
โข
right_twice (์ผ์ชฝ 1๋ฒ, ์ค๋ฅธ์ชฝ 2๋ฒ) : ์ค๋ฅธ์ชฝ๊ทธ๋ฃน ์๋ค๊ฐ๋คํ๊ณ ์ผ์ชฝ ๊ทธ๋ฃน ํ์
min(default, left_twice, right_twice) ์ด ์ข์ฐ์ด๋์ ์ต์๊ฐ์ด ๋๋ค.
ย Code
def solution(name):
answer = 0
# ํ ์ํ๋ฒณ ๋ฐ๊ฟ ๋ ๋๋ฅด๋ ์กฐ์ด์คํฑ ์ต์ ํ์
def get_change_char(ch):
if ord(ch) <= ord('N'):
return ord(ch) - ord('A')
else:
return ord('Z') - ord(ch) + 1
# ๊ฐ์ฅ ๊ธด ์ฐ์๋ A ๊ทธ๋ฃน์ ์ฐพ๋๋ค.
start, end = 0,0
flag = 0
longest_A = [False,False]
for i in range(len(name)):
# 'A' ๋ฅผ ์ฒ์ ๋ฐ๊ฒฌํ๋ฉด flag ์ฒ๋ฆฌํ๊ณ start ์ธ๋ฑ์ค ์ ์ฅ
if not flag and name[i] == 'A':
flag = 1
start = i
# flag ๊ฐ ์ค์ ๋ ์ํ์์ 'A' ๊ฐ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ฉด end ๊ฐ์ i-1 ์ ์ฅ
if flag and name[i] != 'A':
end = i -1
flag = 0
# ๊ฐ์ฅ ๊ธด A ๋ฌถ์ ๊ฐฑ์
if longest_A[1] - longest_A[0] <= end - start:
longest_A = [start, end]
# flag ๊ฐ ์ค์ ๋ ์ํ์์ ๋๊น์ง ๋๋ฌํ๋ค๋ฉด ๋ง์ง๋ง ๋ฌธ์๋ A ์๋ค๋ ์๋ฏธ
if flag and i == len(name)-1:
end = i # ์์ธ์ฒ๋ฆฌ
flag = 0
if longest_A[1] - longest_A[0] <= end - start:
longest_A = [start, end]
# print(longest_A)
for ch in name:
if ch != "A":
answer += get_change_char(ch)
default = len(name)- 1 # ๊ธฐ๋ณธ (๊ทธ๋ฅ ์ง์ง)
# 'A' ๊ฐ ์๋ ๊ฒฝ์ฐ๋ default ๊ฐ ๋ต์ด ๋จ
if longest_A == [False, False]:
answer += default
# ๋ชจ๋ ๋ฌธ์๊ฐ 'A' ์ธ ๊ฒฝ์ฐ๋ ๋ต์ด 0 ์ด ๋จ
elif longest_A == [0,len(name)-1]:
answer = 0
# ๊ทธ ์ธ ๋๋จธ์ง ๊ฒฝ์ฐ
else:
# ๊ฐ์ฅ ๊ธด A ์ ์์์ธ๋ฑ์ค๊ฐ 0 ์ธ ๊ฒฝ์ฐ๋ 0 ์ผ๋ก ์์ธ์ฒ๋ฆฌ
left = longest_A[0] - 1 if longest_A[0] > 0 else 0
right= (len(name) - 1) - longest_A[1]
left_twice = left * 2 + right
right_twice = left + right * 2
# default(๊ทธ๋ฅ ์ง์ง), left_twice(์ผ์ชฝ ๋ ๋ฒ, ์ค๋ฅธ์ชฝ ํ ๋ฒ), right_twice(d์ผ์ชฝ ํ ๋ฒ, ์ค๋ฅธ์ชฝ ๋ ๋ฒ)
left_right_move = min(default, left_twice, right_twice)
answer += left_right_move
return answer
Python
๋ณต์ฌ
Commentary
๋ฐ๋ก ์ผ์ด์ค๊ฐ ๋ฐ์ํ๋ค.
AAABBAAAABBB ๊ฐ์ ๊ฒฝ์ฐ, ๋ต์ 14์ธ๋ฐ ์ ์ฝ๋๋ 15 ๊ฐ ๋์จ๋ค.
๋ด ์ฝ๋
์ข์ฐ์ด๋ : ์ผ์ชฝ3์นธ์ด๋(BBB) + ์ค๋ฅธ์ชฝ3์นธ์ด๋(BBA) + ์ค๋ฅธ์ชฝ4์นธ(AABB) = 10
์ํ๋ฒณ๋ฐ๊พธ๊ธฐ : 5
์ดํฉ: 15
์ค์
์ข์ฐ์ด๋ : ์ผ์ชฝ์ผ๋ก 9์นธ (BBBAAAABB) = 9
์ํ๋ฒณ๋ฐ๊พธ๊ธฐ : 5
์ดํฉ : 14
๋๋ ๊ฐ์ฅ ๊ธด A ๋ฌถ์์ ๋ฌด์กฐ๊ฑด ์ ์ง๋๊ฐ๋๊ฒ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๊ณ ์ฝ๋๋ฅผ ์งฐ๋๋ฐ ์ ์ด๋ถํฐ ๊ทธ ๋ฐฉ๋ฒ์ด ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ด ์๋์๋ค.
๊ฒฐ๊ตญ ์ด ๋ฐฉ๋ฒ์ผ๋ก๋ ํฌ๊ธฐ
#2. ์ ๋ต ํ์ด
Idea
A ๋ฌถ์์ ์ง๋๊ฐ๋ ์คํตํด์ผํ๋ ๊ฒ์ด ๋ง๊ธดํ๋ฐ, ๊ฐ์ฅ ๊ธด A ๋ฌถ์์ ์คํตํด์ผ ํ๋ ๊ฒ์ ์๋๋ค.
๋ฐ๋ผ์ ๊ธฐ์กด๋ฐฉ์, ์ผ์ชฝ์ผ๋ก ๊ฐ๋ ๋ฐฉ์, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ ๋ฐฉ์ ์ค ์์ ๊ฐ์ ๋งค๋ฒ ์ฒดํฌํ๋ค.
ย Code
def solution(name):
# ์กฐ์ด์คํฑ ์กฐ์ ํ์
answer = 0
# ๊ธฐ๋ณธ ์ต์ ์ข์ฐ์ด๋ ํ์๋ ๊ธธ์ด - 1
min_move = len(name) - 1
for i, char in enumerate(name):
# ํด๋น ์ํ๋ฒณ ๋ณ๊ฒฝ ์ต์๊ฐ ์ถ๊ฐ
answer += min(ord(char) - ord('A'), ord('Z') - ord(char) + 1)
# ํด๋น ์ํ๋ฒณ ๋ค์๋ถํฐ ์ฐ์๋ A ๋ฌธ์์ด ์ฐพ๊ธฐ
next = i + 1
while next < len(name) and name[next] == 'A':
next += 1
# ๊ธฐ์กด, ์ฐ์๋ A์ ์ผ์ชฝ์์ ๋ฐฉ์, ์ฐ์๋ A์ ์ค๋ฅธ์ชฝ์์ ๋ฐฉ์ ๋น๊ต ๋ฐ ๊ฐฑ์
# for๋ฌธ ๋๋ฉด์ ์ผ์ชฝ์ผ๋ก ๊ฐ์ง ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ์ง ๋งค๋ฒ ์ฒดํฌ๋ฅผ ํ๋ค.
min_move = min([min_move, 2 *i + len(name) - next, i + 2 * (len(name) -next)])
# ์ํ๋ฒณ ๋ณ๊ฒฝ(์ํ์ด๋) ํ์์ ์ข์ฐ์ด๋ ํ์ ์ถ๊ฐ
answer += min_move
return answer
Python
๋ณต์ฌ
Commentary
์ ๊ทผ์ ๋น์ทํ๊ฒ ํ๋๋ฐ ์ ์ด์ ๊ทธ๋ฆฌ๋ ํ๋จ ์์ฒด๋ฅผ ์๋ชปํด์ ํ๋ ธ๋ค.
์ค์ ์์ ๋ฌธ์ ์ ์๋๋๋ก ๊ทธ๋ฆฌ๋ํ๊ฒ ์ ๊ทผ์ ๋ชป ํ ๊ฑฐ๋ผ๋ฉด bfs, dfs ์์ ํ์์ด ๋์ ๊ฒ ๊ฐ๋ค.
์ฐธ๊ณ ํ์ด