[JS] 프로그래머스 -JadenCase 문자열 만들기

boyon99·2023년 12월 18일
0

algorithm

목록 보기
4/4
post-thumbnail

해설

function solution(s) {
    let arr = s.split(' ')
    let answer = ""
    for(let i = 0; i < arr.length; i++){
            
            let tempArr = arr[i].toLowerCase().split('')
            tempArr[0] = tempArr[0].toUpperCase()
            answer += tempArr.join('') 
            if(i !== arr.length - 1){
                answer += " "
            }
    }
    return answer
}

처음 문제를 제출했을 때 런타임 에러가 발생하였다. 문제 조건을 다시 읽어보니 [공백문자가 연속해서 나올 수 있습니다.]라는 제한 조건에 대한 처리를 하지 않아 생긴 문제로 그 부분에 대한 예외처리를 진행하였다.

function solution(s) {
    let arr = s.split(' ')
    let answer = ""
    for(let i = 0; i < arr.length; i++){
      		// 공백 문자일 경우
            if(arr[i] === '') {
                answer += " "
            } else {
              // 문자열일 경우
                let tempArr = arr[i].toLowerCase().split('')
                tempArr[0] = tempArr[0].toUpperCase()
                answer += tempArr.join('') 
                if(i !== arr.length - 1){
                    answer += " "
            }
        }
    }
    return answer
}

더 이상 런타임 에러는 발생하지 않았으나 테스트 8번을 통과하지 못하여 실패가 나왔다. 원인을 발견하고자 했으나 찾을 수 없어 질문하기에서 문제 8번에 대한 반례를 얻어 틀린 이유를 분석하였다.

원인은 다음과 같다.

현재 코드에서 배열의 마지막 인덱스가 아닐 경우 문자열 마지막에 띄어쓰기를 하고 있는데 만약 배열이["answer", "",""]과 같을 경우 ["answer ","",""]로 반환하게 된다.

답안

function solution(s) {
  let arr = s.split(' ')
  let answer = ""
  for (let i = 0; i < arr.length; i++) {
    // 공백인 경우
    if (arr[i] === '') {
      answer += " "
    } else {
      // 문자열인 경우
      let tempArr = arr[i].toLowerCase().split('')
      tempArr[0] = tempArr[0].toUpperCase()
      answer += tempArr.join('') + " "
    }
  }
  // 마지막 공백 제거
  answer = answer.split("").slice(0, answer.length - 1).join("")
  return answer
}

하여 if()문을 통해 예외처리를 한 부분을 제거한 후 -> 반복문이 끝난 이후 마지막 공백을 제거하는 코드를 추가하였다.

시간 복잡도
1. split()를 사용한 문자열 분리 : O(n)
2. for()문을 이용한 반복문 : O(k)
3. if else 문에서 문자열 조작 및 결합 : O(m)
4. 문자열의 마지막 공백을 제거하는 데 걸리는 시간 : O(n)

결과적으로 O(nk)의 시간 복잡도가 발생한다.

개선

오류를 해결하기 위해 불필요한 코드를 추가하여 문제를 풀이하였는데 그 과정에서 코드를 개선할 필요성을 느꼈다. 하여 다른 사람들의 코드를 참고하여 개선해보았다.

  1. if else문에서 중복으로 사용되는 코드 수정
  2. else문에서 문자열 변환 과정을 한 줄로 수정
  3. 문자열의 마지막 공백을 제거하기 위해 실행한 불필요한 계산 작업 제거
function solution(s) {
  let answer = s.split(' ')
  for (let i = 0; i < answer.length; i++) {
     answer[i] = answer[i].substring(0,1).toUpperCase() + answer[i].substring(1).toLowerCase();
    }
  return answer.join(" ")
}

시간 복잡도

  1. split()를 사용한 문자열 분리 : O(n)
  2. for()문을 이용한 반복문 : O(k)
  3. 문자열 조작 및 결합 : O(m)
  4. join()을 이용한 문자열 결합 : O(km)

따라서 시간 복잡도는 O(n +km)이 된다.

0개의 댓글