프로그래머스 4-7 TIL

Seunggyu Jung·2023년 4월 8일
0
post-thumbnail

1. Day15 1/4 : 인덱스 바꾸기

Q. 문자열 my_string과 정수 num1, num2가 매개변수로 주어질 때, my_string에서 인덱스 num1과 인덱스 num2에 해당하는 문자를 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.

1-1. 내 풀이

function solution(my_string, num1, num2) {
    let answer = '';
    let Dex = [...my_string]
    for (let i in Dex) {
        if( i == num1) {
            answer += Dex[num2]
        } else if (i == num2) {
            answer += Dex[num1]
        } else {
            answer += Dex[i]
        }
    }
    return answer;
}

1-2. 해설

  • 1단계. 파라미터가 문자열이라는 것을 감안해서 전개구문으로 전개하여 새로운 변수에 선언한다.
  • 2단계. 본 문제의 핵심은 인덱스를 바꾸는 것이기에, for in 문을 사용하여 순환시킨다.
  • 3단계. for in문 안에 조건문으로 인덱스 num1과 num2를 바꾸면서 정답에 요소들이 누적되도록 코드를 작성한다.

1-3. 다른 풀이 및 해설(구조분해할당)

function solution(my_string, num1, num2) {
    my_string = my_string.split("");
    [my_string[num1],my_string[num2]] = [my_string[num2],my_string[num1]]
    return my_string.join("");
}
  • 이 풀이가 문제의 취지를 가장 잘 파악한 문제라고 생각한다.(물론 내가 푼 것은 아님)
  • 1단계. 본 문제는 요소의 인덱스를 바꾸는 것이지만, 결국 요소끼리 자리를 바꾸면 되기에, 구조분해할당을 이용하여 구조를 재설정하면 된다.
  • 2단계. 파라미터가 문자열로 되어있기에 이를 split("")으로 요소들이 나뉘어진 배열로 바꾼다
  • 3단계. 구조분해할당을 이용하여, 배열의 요소들의 위치를 바꾼다.
  • 4단계. 파라미터가 배열이 되었기에 정답에는 join("")을 사용하여 문자열로 바꾸어 반환한다.

1-4. 다른 풀이 및 해설(map 메서드)

function solution(my_string, num1, num2) {
    my_string = my_string.split("")
    return my_string.map((v,i) => i === num1 ? my_string[num2] : i === num2 ? my_string[num1] : v).join("");
}
  • 1단계. 파라미터가 문자열로 되어있기에 이를 split("")으로 요소들이 나뉘어진 배열로 바꾼다
  • 2단계. 배열 내 요소들에 변화를 주는 것이기에, map메서드를 사용하며, 주어진 인덱스 간에 요소들을 바꿀 수 있는 조건 코드를 삼항 연산자로 작성한다.
  • 3단계. 파라미터가 배열이 되었기에 정답에는 join("")을 사용하여 문자열로 바꾸어 반환한다.

2. Day15 2/4 : 한 번만 등장한 문자

Q. 문자열 s가 매개변수로 주어집니다. s에서 한 번만 등장하는 문자를 사전 순으로 정렬한 문자열을 return 하도록 solution 함수를 완성해보세요. 한 번만 등장하는 문자가 없을 경우 빈 문자열을 return 합니다.

2-1. 내 풀이 및 해설

function solution(s) {
    let answer = '';
    let STR = [...s].sort()
    if(STR[0] != STR[1]){
        answer += STR[0];
    }
    for (let i = 1; i < STR.length ; i++){
        if (STR[i-1] != STR[i]) {
            if(STR[i] != STR[i+1]){
                answer += STR[i];
            }
        }
    }
    return answer;
}
  • 1단계. 정답이 사전 순으로 나와야 하기 때문에, 파라미터에 전개구문과 sort()를 사용하여 알파벳 순으로 정렬된 배열로 만든다.
  • 2단계. 사전 순으로 정렬된 배열에서 한 번만 나오는 문자는 자신의 앞뒤의 문자와 다르다는 조건을 갖고 있다는 것을 파악한다.
  • 3단계. for문으로 반복문을 작성하되, 인덱스의 변수가 0부터 시작하면 자신 앞의 문자가 없기때문에 시작은 1로 진행한다.
  • 4단계. 0번째 요소를 판별하지 못했기 때문에, 이를 판별하는 조건문을 for문 앞에 작성한다.

2-2. 다른 풀이 및 해설

function solution(s) {
    s = s.split("").sort()
    return s.filter((v,i) => s[i-1] != s[i] && s[i] != s[i+1])
            .join("");
}
  • 1단계. 정답이 사전 순으로 나와야 하기 때문에, 파라미터에 split("")과 sort()를 사용하여 알파벳 순으로 정렬된 배열로 만든다.
  • 2단계. 자신의 앞뒤의 문자와 비교하는 조건을 비교연산자와 논리연산자로 작성한 filter()를 사용하여 한 번만 나온 문자를 걸러낸다.

3. 마무리

  • 배열이나 객체 요소의 순서를 바꿔야할 때, 구조분해할당이 상당히 유용하기에 정리하여 익혀둘 것
  • 한 번에 모범적인 풀이법이 나올 필요는 없으니, 다양한 풀이법을 적용해볼 것을 추천한다.
profile
감동을 주고픈 개발자(준비생)

0개의 댓글