관리 메뉴

나의 개발일지(김지헌)

2번. 이상한 문자 만들기2 (중) 본문

알고리즘 공부

2번. 이상한 문자 만들기2 (중)

코딩이좋아요 2022. 9. 29. 22:20
문제 설명
문자열 s는 한 개 이상의 단어로 구성되어 있습니다. 각 단어는 하나 이상의 공백문자로 구분되어 있습니다. 
각 단어의 짝수번째 알파벳은 대문자로, 홀수번째 알파벳은 소문자로 바꾼 문자열을 리턴하는 함수, solution을 완성하세요.
<제한 조건>
공백을 포함하지 않고, 문자열 전체의 짝/홀수 인덱스를 판단해야합니다.
첫 번째 글자는 0번째 인덱스로 보아 짝수번째 알파벳으로 처리해야 합니다.

처음에 문제를 받고 읽었을때 공백을 포함하지 않고 짝/ 홀수 인덱스 이 말을 이해를 못해서 공백을 기준으로 

문자마다 짝/홀수로 구해서 풀었는데 끝나고 나서 이야기를 해보니 문자의 길이 즉 공백 포함해서 짝홀로 가는거였다.

더보기
function solution(s) {
    return s.toUpperCase().split(" ")
   .map(a => a.split('').map((b,i)=> i%2 !==0 ? b.toLowerCase() : b).join(''))
   .join(' ');
}
let s= "yoon ji yong";
console.log(solution(s))
이게 처음 잘못 짠 코드이다 
let s= "hang hae ninety nine"; 이문자를 넣으면  HaNg HaE NiNeTy NiNe 이렇게 나온다 HaNg HaE nInEtY nInE
이렇게 나오는게 답이다. 

그래서 끝나고 나서 그 이야기를 들으니 문제를 완전 착각 한거였다 . 그래서 새로 풀어 봤는데

function solution(s){
   b = s.split(" ").join("")
   let abc = "";
   let count = "";
   for (j = 0; j < s.length; j++){
    if(s[j] == " "){
       count += j + ","
    }
}
   for (i = 0; i < b.length; i++){
    if(i % 2 == 0){
        abc += b[i].toUpperCase()
       
    }else {
        abc += b[i]
    }
   }
   let counts = count.split(",")
   let abc2 = abc.split("")
   for (i = 0; i < counts.length; i++){
     abc2.splice(counts[i],0," ")
   }
return abc2.slice(1, s.length+1).join("")

}
let s= "hang hae ninety nine";
console.log(solution(s))
//HaNg HaE nInEtY nInE 정상 출력 확인 
//문자열 앞에 공백이 포함 " hang hae ninety nine"  => " HaNg HaE nInEtY nInE" 잘 출력된다

설명을 해보자면

function solution(s){
   b = s.split(" ").join("") //처음들어온 문자를 공백을 기준으로 배열로 만들어서 붙혀준다. hanghaeninetynine출력
   let abc = ""; //문자를 받을 변수
   let count = ""; //숫자를 문자열로 받을 수 있는 변수
   for (j = 0; j < s.length; j++){  //공백의 인덱스 값을 찾기 위해 반복문들 돌려 인덱스 값을 카운트에 넣어준다.                                                                    //0부터 시작하는 이유는 앞에 공백이 있을수도 있기떄문
    if(s[j] == " "){ //공백이 있으면 통과  
       count += j + "," //인덱스 값과 ,를 같이 넣어준다 구분을 주기위함  0,5,9,16, count에 들어가있다
    }
}
   for (i = 0; i < b.length; i++){ //여기는 짝수는 대문자로 만들어야하기 때문에 반복문을 돌렸다
    if(i % 2 == 0){ //i % 2 == 0 즉 짝수
        abc += b[i].toUpperCase() //위에 선언한 abc라는 변수에 짝수를 대문자로 바꾸어서 저장.
       
    }else {
        abc += b[i] //홀수는 그대로 저장
    }
   }
   let counts = count.split(",")//아까 count에서 나온 값을 split 함수로 "," 기준으로 배열로 만든다. [ '0', '5', '9', '16', '' ]
   let abc2 = abc.split("") //문자열에는 값을 넣을수가 없어서 배열로 만들어서 넣을예정이다.
   for (i = 0; i < counts.length; i++){ //배열이 만큼 반복문을 돌려준다.
     abc2.splice(counts[i],0," ") 

//splice(인덱스값, 제거갯수, 바꿀값) 제거할껀 없으니 splice(counts[i](공백 인덱스값, 0 ," ")공백추가
   }
return abc2.slice(1, s.length+1).join("")

//그리고 return 하는데 slice를 넣는 이유는 count에 ''이값이 하나 들어가기 때문에 문자앞에 공백이 하나 생기가 되어서

//slice로 0부터 s.lenght까지 하면 되는데 우리는 앞에 공백이 필요없기 때문에1, s.length+1 앞에 공백을 제거하고 조인

//메소드로 문자열로 만들어준다. 

}
let s= "hang hae ninety nine"; 
console.log(solution(s))

//HaNg HaE nInEtY nInE

//let s= " hang hae ninety nine"; // HaNg HaE nInEtY nInE 앞에 공백이 포함되어있으면 제거 되지않고 잘 나오는걸 볼수있다.

 

 

문자를 합쳐서 계산하는걸 빨리 알아 챘으면 이렇게 풀었을꺼 같은데 너무 아쉬웠다 역시 알고리즘은 어려운거 같다.

매일 매일 공부해서 실력을 늘려야겠다.

'알고리즘 공부' 카테고리의 다른 글

3진법 뒤집기  (0) 2022.10.06
1번. 없는 정수 사이의 합 (하)  (0) 2022.09.29
가운데 글자 뽑아보기  (0) 2022.09.24