Search

42860. ์กฐ์ด์Šคํ‹ฑ

ํ”Œ๋žซํผ
ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
๋ถ„๋ฅ˜
์•Œ๊ณ ๋ฆฌ์ฆ˜
์ค‘์š”๋„
ํ‹ฐ์–ด
๋งํฌ
๋‹ค์‹œ ํ’€์–ด๋„ ํ‹€๋ฆด ๊ฒƒ ๊ฐ™์€ ๋ฌธ์ œ
Created At
2023/04/15 12:02
Updated At
2023/04/15 14:42
Writer
์ƒํƒœ

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 ์™„์ „ํƒ์ƒ‰์ด ๋‚˜์„ ๊ฒƒ ๊ฐ™๋‹ค.
์ฐธ๊ณ ํ’€์ด