✍️ What I Learned/TIL

[TIL] 20230523 Day 9 - 문자열 연습, 반복문과 조건문 연습

Jiwon() 2023. 5. 23. 21:17

오늘 강의 키워드

ECMAScript 6(ES6) 문법, 일급객체로서의 함수, Map과 Set



프로그래머스 문제 풀이

문자열 연습하기


문제 설명
대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다. 예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

제한사항
- 문자열 s의 길이 : 50 이하의 자연수
- 문자열 s는 알파벳으로만 이루어져 있습니다.


어제 고민했던 1주차 문자열 연습문제를 다시 열었다. 어제에 이어 다시 뚫어져라 문제랑 눈싸움했는데, 내가 먼저 눈을 깜빡여서 우선 튜터님의 해설 강의를 다시 시청해보기로 했다.

 

(1) 해설강의 풀이

튜터님의 로직은 다음과 같다.

(참고: 나같은 코드쓰는 감자들을 위해 이해하기 쉽게 풀어서 제시한 해설로, 깔끔한 코드는 아니라고 하셨으니 문제 해결 로직을 이해하는데 집중해보자)


1. 대/소문자가 섞여있으므로 → 문자열을 대문자로 통일
2. for문 사용하여 문자열을 하나하나씩 비교
 2-1. 문자열의 요소들을 'P', 'Y'와 비교
3. 'P, 'Y'의 개수가 같은지 체크

 

 

위의 로직대로 작성해내려간 코드는 다음과 같다.

 

function solution(s){
var answer = true;

// 1. 대/소문자 섞여있음 -> 문자열을 대문자로 통일
s = s.toUpperCase();

// 2. for문을 사용하여 문자열의 요소 하나하나씩 비교
// 2-1. P, Y와 비교
// for(변수 선언문 또는 할당문; 조건식; 증감식) {
//     조건식이 true인 경우 반복 실행될 문
// }
var num = 0;

for (var i=0; i<s.length; i++) {
// ❓ P일 때 ++, Y일 때 --
// 내가 이해가 가지 않았던 부분..
    if(s[i] === 'P') {
        num++;
    }
    if(s[i] === "Y") {
        num--;
    }
}

// 3. P, Y의 개수가 같은지 체크
if (num === 0) {
    answer = true;
} else {
    answer = false;
}

return answer;
}

var str1 = "pPoooyY";
var str2 = "Pyy";

// solution() 함수 호출
console.log(solution(str1));
console.log(solution(str2));

 

위의 코드에서 '이해가 가지 않는 부분'이라고 적어둔 부분이 있는데 주석과 코드를 계속 들여다보니 이해 완료!

지금와서 생각해보면 '왜 이걸 이해 못했지..?' 싶은데 🤔 어쨌든 이해했으니 다행..

 

다른 풀이 방법이 궁금해서 구글에 검색해보니, 문자열에서 특정 문자 개수를 구하는 함수로 split 함수와 match 함수를 찾아볼 수 있었다. 함수의 뜻과 사용법을 대충 읽어본 뒤, 먼저 split 함수를 사용하여 풀어보기로 했다.

 

 

 

(2) split 함수를 사용한 풀이

split 함수
String.prototype.split()
split() 메소드는 String 객체를 지정한 구분자를 이용하여 여러 개의 문자열로 나눈다.
즉, split 함수를 이용하여 특정 문자를 기준으로 문자열을 배열로 반환할 수 있다.

 

문제 풀이에 앞서, 아직 변수와 함수 선언, 호출조차 익숙하지 않은 상태라 아래와 같이 split 함수를 사용하는 연습을 해보았다.

 

// 문자열에서 특정 문자 개수 구하는 방법
// 1. split 함수 사용
//  - 특정 문자를 기준으로 문자열을 배열로 반환

var word = "Papago";
var word = word.toUpperCase();
var countP = word.split("P").length;
console.log(countP);
// 위의 경우 "P"를 기준으로 배열로 변환하므로 countP의 값은 ["PA", "PA", "GO"] = 3
// 따라서 특정 문자를 구하려면 split 함수를 사용해서 구한 배열의 크기에서 -1 해주어야 함

 

 

최종적으로 아래의 로직에 따라 답안 코드를 작성했다.

 


1. 문자열을 대문자로 통일
2. 'P'와 'Y'를 기준으로 배열로 변환 후, 배열 개수에서 -1을 하여 문자의 개수를 구함
3. if문을 사용하여 'P'와 'Y'의 개수가 같으면 true, 그렇지 않으면 false를 반환
4. 'P'와 'Y'가 하나도 없는 경우에는 countP === count Y가 0 === 0으로 동일 할 것이므로 true 반환

 

function solution(s){
    var s = s.toUpperCase();
    var countP = s.split("P").length - 1;
    var countY = s.split("Y").length - 1;

    if (countP === countY) {
        var answer = true;
    } else {
        var answer = false;
    }

    return answer;
}

var str1 = "pPoooyY";
var str2 = "Pyy";

console.log(solution(str1));
console.log(solution(str2));

몇 시간을 머리 싸매면서 작성한 뒤 답안 제출하고 '정답입니다!'라 뜰 때 그 희열이란..

 

 

 

답안 제출 후 다른 사람 풀이를 확인했는데, split 함수를 사용하여 한 줄로 끝낸 답안이 있어서 와.. 했다.

 

function numPY(s){
    return s.toUpperCase().split("P").length === s.toUpperCase().split("Y").length;
}

console.log( numPY("pPoooyY") )
console.log( numPY("Pyy") )

그냥 split.length 값을 비교하면 됐는데 나는 굳이 -1을 했었네..

 


반복문, 조건문 연습하기


문제 설명
어떤 정수들이 있습니다. 이 정수들의 절댓값을 차례대로 담은 정수 배열 absolutes와 이 정수들의 부호를 차례대로 담은 불리언 배열 signs가 매개변수로 주어집니다. 실제 정수들의 합을 구하여 return 하도록 solution 함수를 완성해주세요.

제한사항
absolutes의 길이는 1 이상 1,000 이하입니다.
 - absolutes의 모든 수는 각각 1 이상 1,000 이하입니다.
signs의 길이는 absolutes의 길이와 같습니다.
 - signs[i]가 참이면 absolutes[i] 의 실제 정수가 양수임을, 그렇지 않으면 음수임을 의미합니다.

 

function solution(absolutes, signs) {
    // 1. answer 초기값 0으로 선언
    var answer = 0;
    
// 2. for문을 사용
// for(변수 선언문 또는 할당문; 조건식; 증감식) {
//     조건식이 true인 경우 반복 실행될 문
// }
// 내가 익숙하지 않은 것 - for문 작성법
    for (var i = 0; i < absolutes.length; i++) {

        // 내가 익숙하지 않은 것 - absolutes[i] 작성
        if (signs[i] === true) {
            answer = answer + absolutes[i];
        } else {
            answer = answer - absolutes[i];
        }
    }

    return answer;
}

var absolutes = [4, 7, 12];
var signs = [true, false, true];

// 3. 함수 호출하여 출력
console.log(solution(absolutes, signs));

 

이 문제는 로직은 비슷하게 세웠는데, 코드를 어떻게 작성해야할지 키보드가 눌러지지 않았다. 아직 자바스크립트 코드 작성하는 것이 전반적으로 익숙하지 않은 탓이다. for문 공식은 외웠는데, 변수 선언문 또는 할당문을 작성하는 것이 체득되지 않은 듯 하다. 계속 공부하면서 자연스럽게 익숙해지는 날이 오겠지. 😂

 

 


✒️ 시도 해볼 것

  • 문제 1 - match 함수를 사용해서 풀어볼 것
  • 문제 2 - forEach를 사용해 풀어볼 것