본문 바로가기
알고리즘/프로그래머스

[프로그래머스] 이상한 문자 만들기 (JavaScript)

by gardenii 2023. 6. 20.

[프로그래머스] 이상한 문자 만들기 (JavaScript)

https://school.programmers.co.kr/learn/courses/30/lessons/12930#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

https://school.programmers.co.kr/learn/courses/14743/14743-%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%EC%97%B0%EC%8A%B5-%ED%9E%8C%ED%8A%B8-%EB%AA%A8%EC%9D%8C%EC%A7%91?itm_content=lesson12930

 

코딩테스트 연습 힌트 모음집

본 강의는 코딩테스트 연습의 문제와 관련된 간단한 힌트 및 해설을 제공합니다. Release Note 2020-08-22, Released 강의를 모두 수강하셨나요? 심화 학습을 통해 더욱 단단히 기반을 다져봐요. 자료구조

school.programmers.co.kr

* 문제를 풀면서 특정 테스트케이스들에서 지속적으로 오류가 난다면 위 링크를 참고하세요! *

1. 이중 for문, 문자열 사용 풀이

function solution(s) {
    let input = s.split(" ");
    let answer = "";
    
    for(let i = 0; i<input.length; i++){
        for(let j = 0; j<input[i].length; j++){
            if(j % 2 === 0) answer += input[i][j].toUpperCase()
            else answer += input[i][j].toLowerCase()
        }
        if(i != input.length - 1) answer += " ";
    }
    return answer
}

코드 해설

- 입력받은 문자열을 공백문자를 기준으로 나누어 input배열에 넣어줍니다.

- 정답을 넣을 빈 문자열 answer를 생성합니다.

- 단어별로 홀짝을 구분하여 바꿔주어야 하므로 이중 for문을 통해 문자열에 2차원 배열로 접근합니다.

- 외부 for문은 input 요소, 즉 단어 하나를 순회함을 뜻하고 내부 for문은 단어 하나의 문자열 문자 하나씩 순회함을 의미합니다.

- 문자열의 문자 하나씩을 이차원배열의 두 인덱스를 활용하여 참조하고, 만약 인덱스가 짝수일 경우 toUpperCase()를 통해 대문자로 바꿔주고 홀수일 경우 toLowerCase()를 통해 소문자로 바꿔준 후 answer에 문자열로 더해줍니다.

- 단어 하나를 바꾸고 for문을 나갈 때, 단어 순서를 의미하는 i 변수가 input의 길이 - 1이 아니라면, 즉 마지막 단어가 아니라면 단어와 단어 사이에 띄어쓰기를 넣어줍니다.

2. 이중 for문, 배열 join()사용 풀이

function solution(s) {
  let sum = [];
  let words = s.split(" ");
  
  for (let i = 0; i < words.length; i++) {
    let answer = ""; 
    for (let j = 0; j < words[i].length; j++) {
      if (j % 2 === 0) {
        answer += words[i][j].toUpperCase(); 
      } else {
        answer += words[i][j].toLowerCase();
      }
    }
    sum.push(answer);
  }
  return sum.join(" ");
}

코드 해설

- 1번 코드와 비슷하지만, 정답 요소를 각각 문자열로 저장한 뒤 다시 배열로 저장해 join해주는 방법이 다릅니다.

- 외부 for문에서 내부 for문으로 진입하기 전, 단어 하나를 변환한 값을 저장할 answer 변수를 외부 for문이 순회할 때 마다 새로 초기화하여 생성해줍니다.

- 내부 for문을 통해 대/소문자로 변환된 문자들은 answer변수에 저장되고, 내부 for문이 종료되면 sum 배열에 answer를 push해줍니다.

- 과정을 반복하여 만들어진 배열은 join(" ")을 통해 공백 문자를 기준으로 문자열로 합해 반환해줍니다.

- 1번 풀이와 다르게 마지막 배열에 들어갈 공백 문자를 위한 예외 조건을 따로 설정해주지 않아도 되어 깔끔합니다.

3. map() 사용 풀이 (ChatGPT 참고)

function solution(s) {
  let words = s.split(" ");
  let result = words.map((word) => {
    return word
      .split("")
      .map((char, index) => {
        return index % 2 === 0 ? char.toUpperCase() : char.toLowerCase();
      })
      .join("");
  });

  return result.join(" ");
}

코드 해설

- 입력받은 문자열 s를 공백문자 기준으로 문자열로 생성하는 것은 동일합니다.

- map()을 사용하여 각 word를 다시 공백문자로 split해주고, 이를 다시 map()하여 각 char에 대해 대/소문자 변환을 한 뒤 join해 줍니다.

- 위와 같은 과정으로 만들어진 각 문자들을 return하여 result 배열에 문자열로 반환합니다. 

- 최종적으로 만들어진 배열 result를 다시 공백문자로 join()하여 반환합니다.

- 처음에는 알기 힘들지만 천천히 살펴보면 어떤 과정인지 알 수 있습니다.

- 이중 for문 사용 코드와 해당 코드 모두 시간 복잡도가 O(N)으로, 성능 차이는 크지 않지만 가독성과 코드 간결성이 조금 더 우수하다고 합니다.