수박수박수박수

w=j·2021년 5월 10일
0

1. 수박수박수박수

  • 문제 :
    길이가 n이고, "수박수박수박수...."와 같은 패턴을 유지하는 문자열을 리턴하는 함수, solution을 완성하세요. 예를들어 n이 4이면 "수박수박"을 리턴하고 3이라면 "수박수"를 리턴하면 됩니다.

  • 조건 사항:
    n은 길이 10,000이하인 자연수입니다.

입출력 예시
n : 3, 4
return : "수박수", "수박수박"

  • 문제해결 STEP
    1.수박수박수박수...를 배열로 봤을때
    0:"수", 1:"박", 2:"수", 3:"박", 4:"수"... 이런패턴으로 진행된다.
    그러면 여기서 규칙은 index를 2로 나누었을때 나머지가 0이다.
    index%2 == 0 이런규칙이 나온다.
    2.그래서 이전단계에서 index%2 == 0 일땐, "수" 문자 반환. 그렇지 않으면 "박" 문자 반환.
    3.문제에서 길이가 n, 10,000이하 자연수이므로 n을 문자열 길이(length)로 두고 반복문을 n(문자열 길이)만큼 돌리면 된다.
    4."수", "박"을 담은 공간 변수 정의.
function solution(n) {
    var word;        // 각 문자를 저장할 변수 
    var answer = ''; // 반환된 각문자를 합칠 변수
    
    for (var i = 0; i < n; i++) { // i:인덱스 0으로지정(배열("수박수박수...")) i < n:문자열 길이와 같거나 커지면 for문 중단(이유?! 배열의 가장 끝 index는 0부터 시작이므로 n(문자열 길이) - 1이 된다.)
        if (i%2 == 0) {  // 나머지가 0일때 '수' 문자 반환
            word = '수';
        } else {         // 그렇지 않으면 '박' 문자 반환
            word = '박';
        }
        answer += word;  // 각 문자가 반환되었을때 변수에 계속 할당
        word = '';       // for문 진행되는동안 i=0,i=1 각 단계가 진행이 끝나면 word 변수 빈문자열로 초기화
    }
    return answer;
}
  • 위 코드처럼 작성해보았다.
  • 여기서 if문을 조금더 간결하게 하기위해 삼항 조건 연사자를 통해 간결화.
function solution(n) {
    var word;
    
    var answer = '';
    
    for (var i = 0; i < n; i++) {
        word = i%2 == 0 ? word = '수' : word = '박';
        // 삼항 조건 연산자를 통해 if문 간결화.
        
        answer += word;
        
        word = '';
    }
    return answer;
}
  • 여기서 먼가 더 간소화 시킬수 있을것 같은데... 저는 여기서 String 객체의 메서드중에서 어떤 문자열을 반복으로 반환하는 메서드가 있는가를 찾아 보았습니다.
  • 그래서 repeat() 이라는 메서드를 찾았습니다.
  • 그런데 repeat() 메서드는 같은문자를 계속 반복적으로 표현하니깐 특정 문자를 표현 할 수 없다.
    ex) '수박'.repeat(2); 결과 : '수박수박'
    여기서 '수박수' 이런식으로 repeat() 메서드로만으로는 결과가 나올수가 없다.
    그래서 repeat()으로 문자를 반복하고 어떤 메서드를 이용하여 해당 문자열을 잘라서 써야겠다는것을 생각을 해 보았다.
  • 음.. 문자를 잘라서 사용할 수 있는 메서드는 splice(), substring(), substr() 이 있다.
function solution(n) {
    
    var answer = '';
    
    var word = '수박';
    
    answer = word.repeat(n/2 + 1).substr(0, n);
    // '수박'을 반복하여 해당 문자열을 잘라서 반환.
    
    // answer = '수박'.repeat(n/2 + 1).substring(0, n);
    // answer = '수박'.repeat(n/2 + 1).slice(0, n);
    // 모두 같은 결과 값을 가진다. 
    
    return answer;
}
  • word.repeat(n/2 + 1);
    n/2 + 1를 입력한 이유?!
    '수박'을 반복으로 계속 돌릴예정인데
    ex) n=3, n/2 == 1.5,
    word.repeat(n/2); // 결과 : '수박'
    n=3 이면 '수박수'가 반환이 되어야하는데
    처음부터 반복된 반환값이 '수박'이면 '수'라는 문자가 없는 상태이여서
    저는 여기서 n/2 + 1 을 하여 '수박수박'를 반환하여 '수박수' 까지만 잘라서 반환하려고 해서 n/2에 1을 더해서 반복을 한번더 진행 했습니다.

  • word.repeat(n/2 + 1).substr(0,n);
    substr(0,n)
    문자열 처음부터 입력받은 문자열 길이만큼 잘라서 해당 문자열을 반환한다.
    ex) n=3 일때
    word.repeat(n/2 + 1); // 결과 : '수박수박'
    word.repeat(n/2 + 1).substr(0, n); // 결과 : '수박수'
    substr(추출하고자 문자 시작위치, 추출할 문자의 총 길이);

코드리뷰
1. 해당 문제를 풀면서 for문, if문을 이용하여 문제를 풀수도 있지만
저희는 자바스크립트의 String 객체의 메서드를 사용하여 해당 코드를 같은 결과가 나오더라도 훨씬 간결하게 작성할 수 있다.
2. 자바스크립트의 내장객체의 메서드들을 잘 확인해 잘 이용하자!!!

참조 사이트 :
https://poiemaweb.com/js-string

profile
ENJOY!! PROGRAMING!!

0개의 댓글