문자열이 주어지면 문자열을 AAA에서 시작해 몇번만에 만들 수 있는 지 구하는 문제
문제 : https://programmers.co.kr/learn/courses/30/lessons/42860#
알파벳이 움직이는 횟수를 count해서 answer에 더해준다.
단, 맨 왼쪽에서 < 하면 맨 뒤로 넘어간다. 하지만 맨 오른쪽에서 > 한다고 앞으로 오지는 않는다. 문제를 잘못 해석해서 첫시도에는 실패했던 문제다. 이 점만 주의하면 간단히 해결가능하다.
연달아 나온 A 수가 더 많거나 같으면 back을 해야된다.
- (전체길이-A길이-1)+(A앞에나온 문자의 개수-1) 의 식으로 구할 수 있다.
(A없이 진행한다고 생각)+(back할 때 거쳐가는 것들) <- 이렇게 생각해서 식을 작성하면된다.
앞에 숫자가 더 많은 경우 그냥 진행한다.
- (전체길이 -1)
function solution(name) {
let answer = 0;
let aList =[]
let turn =0
for(const char of name){
answer+=changeCharCount(char)
}
if(name[0]==="A") aList.push({idx:0,cnt:1})
for(let i=1; i<name.length; i++){
if(name[i-1]==="A" && name[i]==="A"){
aList[aList.length-1].cnt++
}else if(name[i-1]!=="A" && name[i]==="A"){
aList.push({idx:i,cnt:1})
}
}
aList.sort((a,b)=>b.cnt-a.cnt)
//앞에 있는 개수보다 A개수가 더 많을때
if(aList.length && aList[0].idx<=aList[0].cnt){
turn = (name.length-aList[0].cnt-1)+(aList[0].idx-1)
}else{
turn = name.length-1
}
return answer+turn;
}
function changeCharCount (char){
let charCode = char.charCodeAt()
let start = 'A'.charCodeAt()
const end = 'Z'.charCodeAt()
return Math.min(end-charCode+1,charCode-start)
}
만약 오른쪽에서 > 했을 때 맨 앞으로 오게 된다면.... 다시 깊은 고민을 해야 될것같다.
다행히?도 이번 문제는 그렇지 않아서 해결할 수 있었다. 😅
안녕하세요! 풀이 잘 봤습니다 :)
풀이 참고하는 중에 질문이 있어서 댓글남깁니다!
if(aList.length && aList[0].idx<=aList[0].cnt)
여기서 aList.length 까지 조건에 포함시키신 이유를 알 수 있을까요?