๐ ๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/42860
๐ ๋์ ํ์ด
๋ฌธ์ ๋ฅผ ๋ณด์๋ง์, ์์คํค์ฝ๋๋ก ๋ณํํด์ ์ ๊ทผํด์ผ๊ฒ ๋ค๊ณ ํ๋จํ๋ค. ์กฐ์ด์คํฑ์ ์๋ก ์ฌ๋ฆฌ๋ ์๋๋ฅผ ์ฌ๋ฆฌ๋ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ ์ด์ฐจํผ ์ซ์๋ก ์นด์ดํธ ๋๋ ๊ฑฐ๋๊น! ๊ทธ๋ฆฌ๊ณ , ๋๊ฐ์ง๋ฅผ ๋๋ ์ ์๊ฐํ๊ธฐ๋ก ํ๋ค.
1. ์ฒซ๋ฒ์งธ๋ก ๋จผ์ , ๋ฐฉํฅํค๋ฅผ ๋ช๋ฒ ์์ง์ฌ์ผํ๋์ง ํ๋จํด์ฃผ๋ ค๊ณ ํ๋ค. A๊ฐ ์๋ ์์ด๋ค์ ์์น๋ฅผ ์์๋ด์ ๐ ์ด์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ง, ๐์ด์ชฝ ๋ฐฉํฅ์ผ๋ก ๊ฐ์ง ๋์ค์ ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์์ง์ด๋๊ฒ ์ต์์ธ์ง ํ๋จํ๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
๋ง์ฝ JAZ ๋ผ๋ฉด, J์์ A๋ฅผ ๊ฑฐ์ณ์ Z๋ก ๊ฐ์ง ์๊ณ , J์์ ๋ฐ๋ก Z๋ก ์์ง์ด๋๊ฒ ํ์๊ฐ ์๋ค. ๊ทธ๋์ ๋๋ ๋๊ฐ์ง ๋ฐฉํฅ ๋ชจ๋ ์ดํด๋ณด๊ณ ๋ ์ ์ ๊ฐ์ ์ฐพ์์ count์ ๋ํด์ฃผ๋ ค๊ณ ํ๋ค.
2. ์ ๋ ฅ๋ฐ์ ๋ฌธ์๋ค์ ์ ๋ถ ์์คํค์ฝ๋๋ก ๋ฐ๊ฟ์, ๋ง์ฐฌ๊ฐ์ง๋ก A๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๋๊ฒ๊ณผ Z๋ฐฉํฅ์ชฝ์ผ๋ก ๋ฐ๊พธ๋๊ฒ์ ๋น๊ตํ๋ค. ์ด ๋ชจ๋ ๊ณผ์ ์ ์์คํค์ฝ๋๋ก ๋ณ๊ฒฝํด์ ๋น๊ตํ๋ค. ์์คํค์ฝ๋๋ก A๋ 65, Z๋ 90์ ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ง์ ๋บ์ ์ ํ์ฉํด์ ๋ช๋ฒ ์นด์ดํธ๋๋์ง ํ๋จํ ์ ์๋ค.
ABCY ๊ฐ์๊ฒฝ์ฐ
B๋ A์์ ํ๋ ์ปค์ง๋ ๋ฐฉํฅ์ผ๋ก,
C๋ A์์ ๋๊ฐ ์ปค์ง๋ ๋ฐฉํฅ์ผ๋ก ๊ฐ๋ ๊ฒ์ด ๋ ์นด์ดํธ๊ฐ ์ ๊ณ
Y ๊ฐ์ ๊ฒฝ์ฐ๋ A์์ Y๋ก ์ฐจ๋ก๋๋ก ๊ฐ๋ ๊ฒ๋ณด๋ค๋, A -> Z -> Y ๋ก ๊ฐ๋๊ฒ์ด ํจ์ฌ ์นด์ดํธ๊ฐ ์ ๋ค.
โ ์ฒซ๋ฒ์ฌ ์๋ - ์คํจ ๋ฐญ์ด๋ค ๋ฐญ
์์ฒญ๋๊ฒ ๋ง์ด ํ๋ ธ๋ค. ์ค๊ฐ์ ๋ฌธ๋ฒ์ ์ธ ์ค๋ฅ๋ ์๋๊ฒ ๊ฐ๋ค. ๊ทธ๋๋, ์์๋ถ๋ถ์ ๋ง์ ๊ฑธ๋ก ๋ณด๋, ๋ด๊ฐ ํ์ดํ ๋ฐฉํฅ์ด ์์ ํ๋ฆฌ์ง ์์ ๊ฒ ๊ฐ๋ค. ์ด์ ์กฐ๊ฑด๋ค์ ๋ค์ ์ดํด๋ณด๊ณ ๋ค์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์.
func solution(_ name:String) -> Int {
let nameArr = name.map{ String($0) }
var count = 0
// ์ด๋๋ฐฉํฅ์ผ๋ก ์ํํ ๊ฑด์ง
// A์ ์ธ๋ฑ์ค ์ ๋ถ ์์๋ณด์
var charIndex = [Int]()
for i in 0..<nameArr.count {
if nameArr[i] != "A" {
charIndex.append(i+1)
}
}
charIndex.sort(by: <)
// -> ๋ฐฉํฅ ์ํ (๋ง์ง๋ง๊บผ - ์ฒซ๋ฒ์จฐ๊บผ), <- ๋ฐฉํฅ ์ํ (๋ณธ์ธ + (namearr๊ธธ์ด - ๋๋ฒ์จฐ))
count += min(charIndex[charIndex.count-1] - charIndex[0], charIndex[0] + (nameArr.count - charIndex[1]))
// A๋ก ๋ฐ๊พธ๋๋ฐ ์ผ๋งํผ ์์ง์ฌ์ผํ๋๊ฐ
for char in nameArr {
if char != "A" {
let now = Int(UnicodeScalar(char)!.value)
count += min(now-65, 90-now+1)
}
}
return count
}
โ (์ฌ๋ฌ๋ฒ์ ์๋) ๋ด๊ฐ ๋์น ๊ฒ๋ค
1. AAAA ๊ฐ์ด charIndex ๋ฐฐ์ด์ด ๋น์ด์๋ ๊ฒฝ์ฐ๋ฅผ ํ๋จํด์ฃผ์ง ์์๋ค. ์ด๊ฒ ๋๋ฌธ์ ์ค๊ฐ์ค๊ฐ ๋ฌธ๋ฒ์ ์ธ ์ค๋ฅ๊ฐ ๋ซ๋ค. charindex๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ min๊ฐ์ ํ๋จํ!! ํ๊ณ ,,, ์ค๊ฐ์ ์๋ if ๋ฌธ์ ํ๋ ๋ฃ์ด์ฃผ์๋ค.
if charIndex.isEmpty {
return 0
}
2. name์ ๊ธธ์ด๊ฐ 1์ธ๊ฒฝ์ฐ๋ฅผ ํ๋จํด์ฃผ์ง ์์๋ค.
๋ง๋ค, ๋ด ์ฝ๋์์๋ ์ด๋๋ฐฉํฅ์ผ๋ก ์ํํ ์ง ์ ํด์ฃผ๋ ๊ณผ์ ์์ ์๋์ ๊ฐ์ ๊ณต์์ ์ฌ์ฉํ๋ค.
// -> ๋ฐฉํฅ ์ํ (๋ง์ง๋ง๊บผ - ์ฒซ๋ฒ์จฐ๊บผ), <- ๋ฐฉํฅ ์ํ (๋ณธ์ธ + (namearr๊ธธ์ด - ๋๋ฒ์จฐ))
count += min(charIndex[charIndex.count-1] - charIndex[0], charIndex[0] + (nameArr.count - charIndex[1]))
๋ง์ฝ nameArr๊ฐ 1์ด์ด์ charIndex์ int 1 ๋ฐ์ ๋ค์ด์์ง ์๋ค๋ฉด, charIndex[1]์ ๊ฐ์ด ์กด์ฌํ์ง ์๋๋ค. ์ด๊ฒ๋ ํ๋ฒ ๋ถ๊ธฐ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์๋ค.
3. ํ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ ๊ฒ ์ด๋ผ๊ณ ์๊ฐํ๋ค. ์๋ค๊ฐ ๋๋์๊ฐ ์๋ ์์ง ์๋? ๊ทธ๋์ ์ปค์์ ์ด๋ ํ์๋ฅผ ๊ฒฐ์ ํ๋ ์ฝ๋๋ฅผ ๋ํญ ์์ ํ๋ค. ์ด๋ ๊ฒ ์์ ํด์ ๋๋ ธ๋๋ฐ,,, ์๋... ๋ ๊ณ์ ํ๋ ค ๊ณ์... ์๋ง ์์ธ์ผ์ด์ค ๋๋ฌธ์ธ๊ฑฐ๊ฐ์๋ฐ ๋ญ๊น ๋๋์ฒด๊ฐ ;;;
์๋ค๊ฐ ๋๋์๊ฐ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
- ์ผ๋จ ํ๋จํ๋ ค๊ณ ํ๋ ์ธ๋ฑ์ค ๋ถ๋ถ์ด A๋ฉด ๋์ด๊ฐ๋ค.
- next: ๋ค์์ผ๋ก ๋ฐ๊ฟ ์ธ๋ฑ์ค
- prev; ์ง์ ์ ์กฐ์์ ๊ฐํ ์ธ๋ฑ์ค
- ์ง๊ธ ํ๋จํ๊ณ ์๋ i ๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ for ๋ฅผ ๋๋ ค์ ๋ค์์ผ๋ก ๋ฐ๊ฟ์ค ์ธ๋ฑ์ค๊ฐ ์๋์ง ๋ด์ฃผ๊ธฐ → ๋ค์์ผ๋ก ๋ด์ค ์ธ๋ฑ์ค๊ฐ ๊ฒฐ์ ๋๋ค๋ฉด break, next์ j๋ฅผ ๋ฃ์ด์ฃผ๊ณ , ์ด์ ์ ์กฐ์์ ๊ฐํ์ (๋ค์๋ฒ์ ํ๋จํด์ผํ๋๊น prev ์๋ ๋ฃ์ด์ค)
- ๋ง์ฝ next๊ฐ -1 ๊ทธ๋๋ก๋ผ๋ฉด ๋ค์์ผ๋ก ์กฐ์์ ๊ฐํ ์ ๊ฐ ์๋ค๋ ๋ป์ด๋๊น
๊ธฐ์กด cursor์ ํ์ฌ ๋ณด๊ณ ์๋ i ๊น์ง (i๊ทธ์์ฒด๊ฐ ๊ฑฐ๋ฆฌ), ์ด์ ์ ์กฐ์์๊ฐํ ๋ถ๋ถ์์ ๊ฑฐ๊พธ๋ก ๋์์์ ๋ค๋ก ๋์์ฌ๋ ์ด ์ธ๊ฐ์ง case ์ค ์ต์๊ฐ์ ๊ตฌํจ - ๋ง์ฝ ๋ค์์๋ก ์กฐ์์ ๊ฐํ ์ ๊ฐ ์กด์ฌํ๋ค๋ฉด
๊ธฐ์กด cursor ์, ๋๋์์์ ๋ค๋ก ๋์์ next๊น์ง ์ค๋ ๊ฑฐ๋ฆฌ๋ฅผ ๋ํ ์ ์ค ์ต์๊ฐ์ cursor์ ์ ์ฅํด์ค๋ค.
// ์ปค์์ ํ
for i in 0..<nameArr.count {
if nameArr[i] == "A" {
continue
}
var next = -1
for j in i+1..<nameArr.count {
if nameArr[j] != "A" {
next = j
prev = j
break
}
}
if next == -1 {
cursor = min(cursor, i, prev * 2 + nameArr.count - i)
} else {
cursor = min(cursor, i*2+nameArr.count-next)
}
}
์์ ์ค๋ช ์ด ์ดํด๊ฐ ์ ์๋ ์๋ ์๋ค. ๊ทธ๋๊น, ๊ทธ๋ฆผ์ผ๋ก ๊ทธ๋ ค๋ณด๋ฉด
๊ทธ๋ ์ด๋ ๊ฒ ๋๋์์ค๋๊ฑฐ ๊น์ง ๊ณ ๋ คํ์ด. ๊ทผ๋ฐ..? ์ ..? ์๋ ธ๋ใ ๋๋๋?
4. ํ ์คํธ์ผ์ด์ค ์ถ๊ฐ๋๋ค๊ณ ํ๋๋ฐ,, ์์ง์ง ๋ฏธ์น๊ฒ ๋ค ์ด๊ฑฐ ์์ธ์ผ์ด์ค๋ฅผ ๋ชป์ฐพ๊ฒ๋ค... ๋ฏธ์ณ ๋์๊ฐ์๊ฒ ๋ค
๋ฏธ์ณ๋์๊ฐ์๊ธฐ์ ์ ์ธํฐ๋ท์ ์ฐธ๊ณ ํ๊ณ ? ๋ ์์ธ์ฌํญ์ ์ฐพ์๋ฒ๋ ธ๋ค. ใ ใ ใ .ใ .ใ .ใ .ใ .ใ .ใ ... ์ง๊ธ ๋ด๊ฐ ๊ณ ๋ คํ ์ผ์ด์ค๋ ๋ชจ๋ ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๊ฑฐ๋, ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ๊ฑฐ๋(์ด? ์ด๊ฑด ์์ ๋ ์ฝ๋์์ ๋น ์ง๋ฏํ๋ฐ..?ํ,, ), ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ค๊ฐ ๋์์ค๊ฑฐ๋์ด๋ค. ํ๊ฐ์ง ๋น ์ง๊ฑด,, ๋ฐ๋ก ๋ค๋ก ๊ฐ๋ค๊ฐ ๋์์ค๋๊ฒ...
์ด๋ ๊ฒ 2๋ฒ์ฌ ๊ฒฝ์ฐ์ฒ๋ผ ์์ ์ฒ์๋ถํฐ ๋ค๋ก ๋์๊ฐ์ ๋ง์ง๋ง๊บผ๋ถํฐ ํ์ํ๊ณ , ๊ทธ๋ค์ ๋ค์ ์์ผ๋ก ๋์์ค๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด์ฃผ์ด์ผํ๋ค. ๋ด๊ฐ ์ฐธ๊ณ ํ ์ฝ๋์์๋ ์ด๊ฒ์ A์ ๊ธธ์ด๋ก ๋น๊ตํ๋ค. A๊ฐ ์ฐ์๋๋ ๊ธธ์ด๋ฅผ ์์๋ณด๊ณ , ์์ผ๋ก ๋์๊ฐ๋๊ฒ ๋น ๋ฅธ์ง, ๋ค๋ก ๋์๊ฐ๋๊ฒ ๋น ๋ฅธ์ง ํ๋จํด์ฃผ์๋ค. ํ... ๊ธธ๊ณ ๊ธธ์๋ค...
๐ ์ ๋ต์ฝ๋
import Foundation
func solution(_ name:String) -> Int {
let nameArr = name.map{ String($0) }
var count = 0
var idx = 0
var cursor = nameArr.count - 1
for char in nameArr {
if char != "A" {
let now = Int(UnicodeScalar(char)!.value)
count += min(now-65, 91-now)
}
}
if count == 0 {
return count
}
// ์ปค์์ ํ
for i in 0..<nameArr.count {
idx = i + 1
while idx < nameArr.count, nameArr[idx] == "A" {
idx += 1
}
cursor = min(cursor, i * 2 + nameArr.count - idx, (nameArr.count - idx) * 2 + i)
}
return name.count == 1 ? count : count + cursor
}
๐ฌ ์๊ฐ..์ ์ ์ด๋ณด์
์,, ์ด ๋ฌธ์ ๋ ์์ธ์ผ์ด์ค๊ฐ ์ ๋ง ๊น๋ค๋ก์ ๋ค. ๋ฌธ์ ๋ ๋ณด๋ฉด, ๊ณ์์ ์ผ๋ก ์์ธ์ผ์ด์ค๊ฐ ์ถ๊ฐ๋๊ณ ์์๊ณ ํ์ฌ ๊ธฐ์ค์ผ๋ก 1์๋ฌ์๋ ์ผ์ด์ค๊ฐ ์ถ๊ฐ๋์๋ค. ๊ทธ๋์ ์ธํฐ๋ท์ ๋ชจ๋ ์ฝ๋๊ฐ ๋์๊ฐ์ง ์์๋ค ใ ใ ใ ใ ใ ใ ...
์์ง ๋ค์ํ ๋ฐฉ๋ฉด์์ ์๊ฐํ๋ ํ์ด ๋ถ์กฑํ๋ค๊ณ ์๊ฐ๋๋ค. ์ปค์๋ฅผ ์ฎ๊ธด๋ค๊ณ ํ์ ๋
- ์ค๋ฅธ์ชฝ์ผ๋ก ์์ง์ด๊ฑฐ๋
- ์ผ์ชฝ์ผ๋ก ์์ง์ด๊ฑฐ๋
์ด๋ ๊ฒ ๋ ๊ฐ์ง ๊ฒฝ์ฐ ๋ฐ์ ์๊ฐํ์ง ์์๋ค. ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ๋ค๊ฐ ๋๋์๊ฐ์ ๋ค๋ก ๋์๊ฐ๋ ๋ฐฉ๋ฒ์ด๋, ์์ ๋ค์ชฝ๋จผ์ ํ์ํ๊ณ ๋ค์ ๋์์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํ๋ ๊ฒฝ์ฐ ๊น์ง ๋ชจ๋ ๊ณ ๋ คํด์ค์ผํ๋ค.
์ด ๊ฒฝ์ฐ์์ index๋ฅผ ์ด์ฉํ๊ฑฐ๋ ๊ธธ์ด๋ฅผ ์ด์ฉํ๋๋ฐ ์์ฃผ๊ทธ๋ฅ ๋จธ๋ฆฌ๊ฐ ํฐ์ง ๊ฒ ๊ฐ์๋ค. ... ํ...
์ฝ๋ฉํ
์คํธ ๋ฌธ์ ๋ฅผ ์ ํ๋ฉด์ ์์ธ์ผ์ด์ค๋ฅผ ์๊ฐํด๋ด๋ ํ์ด ๊ฐ์ฅ ์ค์ํ๊ฒ๊ฐ๋ค๊ณ ๋๋ผ๋ ์์ฆ์ด๋ค. ๋งค๋ฒ ์๊ณ ๋ฆฌ์ฆ์ ํ๊ธด ํธ๋๋ฐ, ๋ช๊ฐ์ง์ ํ
์คํธ์์ ๊ฑธ๋ฆฌ๊ฑฐ๋,,,, ๋ช๊ฐ์ง์ ํ
์คํธ์์๋ง ์ธ๋ฑ์ค์ค๋ฅ๋ฅผ ๋ด๊ฑฐ๋ ์ด๋ฐ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ค์ด๊ธฐ ์ํด์๋ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํ ์ค ์๋ ์ฌ๋์ด ๋์ด์ผ๊ฒ์ง? ํ,, ํ๋ด์ ๐ซ
'Algorithm > Programmers' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] (Python) ๊ตฌ๋ช ๋ณดํธ (lv.2, ๊ทธ๋ฆฌ๋) (0) | 2023.02.08 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ํฐ ์ ๋ง๋ค๊ธฐ (lv.2, ๊ทธ๋ฆฌ๋) (0) | 2023.02.03 |
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฒด์ก๋ณต (lv.1 ๊ทธ๋ฆฌ๋) (0) | 2023.02.02 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ๊ฐ์ฅ ํฐ ์ ์ฌ๊ฐํ ์ฐพ๊ธฐ (Lv.2) (0) | 2023.01.23 |
[ํ๋ก๊ทธ๋๋จธ์ค] (Swift) ์ด์ง๋ณํ ๋ฐ๋ณตํ๊ธฐ (LV.2) (feat. radix) (0) | 2022.10.11 |