가운데 글자 가져오기

w=j·2021년 5월 9일
0

1.가운데 글자 가져오기

  • 문제 :
    단어 s의 가운데 글자를 반환하는 함수, solution을 만들어 보세요. 단어의 길이가 짝수라면 가운데 두글자를 반환하면 됩니다.
  • 조건 사항:
    s는 길이가 1 이상, 100이하인 스트링입니다.

입출력 예시
s : "abcde", "qwer"
return : "c", "we"

  • 문제 해결 STEP
    1.단어 s 문자열의 길이를 저장하는 변수 필요.
    2.단어의 길이가 홀수일때 가운데 하나, 짝수일때 가운데 두개 반환.
    3.홀수, 짝수 구분은 단어의 길이를 2로 나누었을때 나머지가 0 이면 짝수 아니면 홀수로 구분.
    4.단어의 길이가 홀수일때,
    단어의 길이를 2로 나누었을때 몫이 index 값이 되어 가운데 문자의 index 값이 된다.
    5.단어의 길이가 짝수일때,
    단어의 길이를 2로 나누었을때 몫이 가운데 두글자중 두번째 문자의 index 값이 된다.
    그러면 가운데 두글자중 첫번째 문자의 index값은 몫에 -1을 하면 된다.
    7.Tip : 자바스크립트 / 연산자를 이용하여 나눗셈을 할때 소수점까지 표현이 되므로 Math객체의 floor() 메서드를 이용하여 소주점을 버린다.
    ex) Math.floor(2.5); 결과 : 2
function solution(s) {
    
    var sLength = s.length;     // 단어길이를 변수에 할당. 
    
    var wordNam = sLength%2;    // 단어를 "2"로 나누었을때 나머지
    var wordMok = Math.floor(sLength/2);    // 단어를 "2"로 나누었을때 몫 , Math.floor() 를 이용하여 소수점 없앤다.
    
    var midWordIndex;           // 단어의 가운데 문자 index 값을 저장할 변수 선언
    var answer = '';
    
    if (wordNam != 0) {         // 나머지가 0이 아니면, 즉 단어의 길이가 홀수일때
        midWordIndex = wordMok; // 몫 값을 이용하여 가운데 글자 index값을 저장할 변수에 할당
        answer = s.charAt(midWordIndex); // charAt() 메서드를 사용하여 해당 index에 있는 문자를 반환 
    } else {                    // 나머지가 0일때, 즉 짝수일때
        midWordIndex = wordMok; // 몫 값을 이용하여 가운데 두글자중 두번째 문자 index로 할당.
        answer = s.charAt(midWordIndex -1) + s.charAt(midWordIndex); 
        // minWordIndex 값은 두번째 문자이므로 첫번째 문자는 해당 값에 -1을 하면 첫번째 문제 index가 된다. 
  
    }
    return answer;
}
  • 위 코드처럼 해당 문제로 풀어 보았습니다.
  • 그런데 코드가 뭔가 너무 길어보여서 저는 String 객체의 메서드중에서 index 값에 따라서 문자열의 문자를 반환하는 메서드를 찾아보았다.
  • 해당 메서드 중에서 substring() 메서드를 이용하여 다시 코드를 작성해보았습니다.
function solution(s) {
    
    var sLength = s.length;
    
    var wordNam = sLength%2;
    var wordMok = Math.floor(sLength/2);
    
    var answer = '';
    
    if (wordNam != 0) { 
        answer = s.substring(wordMok,wordMok+1);
        // 홀수일 경우에는 가운데 문자 하나만 필요하므로 
        // substring()의 첫번째 인자로 몫 값을, 두번째 인자로 몫 + 1 을 하여 length 값을 지정
        
    } else {
        answer = s.substring(wordMok-1,wordMok+1);
        // 짝수일 경우에는 가운데 문자 두개가 필요하므로
        // substring() 첫번째인자로 몫-1 을 하여 첫번째 문자 index로 지정
        // 두번째 인자로 몫+1을 하여 length 값을 지정
    }
    
    
    return answer;
}
  • 위 코드처럼 일단 substring() 메서드를 이용하여 조금 더 간결하게 작성해보았다.
  • 그런데 아직도 뭔가 내 마음에 들지 않는다. 더 간결하게 표현할수 있을것 같은데....
  • 그래서 if문을 한번 한줄로 표현해보자고 생각해보았다.
  • 그방법은 삼항 조건 연산자 : ("조건" ? 참이면 실행 : 거짓이면 실행) 를 이용하는것이다.
function solution(s) {
    var wordNam = (s.length)%2;
    var wordMok = Math.floor(sLength/2);
    
    var answer = '';
    
    answer = wordNam != 0 ? s.substring(wordMok,wordMok+1) : s.substring(wordMok-1,wordMok+1);
    
    return answer;
}
  • 위와 같이 삼항 조건 연사자를 이용하여 if문 대신하여 한줄로 작성 해보았습니다.
  • 더 간결하기위해 단어 s의 length값을 굳이 다시 변수에 저장할 필요가 없을것 같아서 var sLength 변수는 지웠습니다.
  • 여기서 String 객체의 substring() 메서드 말고 substr() 메서드를 이용하여 다시 코드를 작성해보았습니다.
  • substr() 메서드는 index 를 이용하여 문자열의 문자를 반환하는 역활을 한다. 여기서 substring() 메서드와 차이점은 substr()메서드의 두번째 인자 length의 기준은 첫번째 인자가 기준으로 length 값을 지정하고 substring() 메서드 두번째 인자 length 값은 전체 문자열의 처음 기준으로 지정된다.
function solution(s) {
    var wordNam = (s.length)%2;
    var wordMok = Math.floor(s.length/2);
 
    var answer = '';
    
    answer = wordNam != 0 ? s.substr(wordMok,1) : s.substr(wordMok-1,2);
    // wordMok 변수를 이전엔 두개의 인자를 넘길때 다 넣어주었는데 메서드를
    // substr()로 변경하면서 첫번째 인자에만 넣어주었다. 
    // 그 이유는 substr() 메서드의 두번째 인자 length 값의 기준이 첫번재 인자가 되기 때문이다.
    
    return answer;
}
  • 위 코드처럼 substr() 메서드를 이용하여 인자를 넘길때 조금더 간결하게 작성을 하였습니다.

코드리뷰
1. 처음엔 if문을 사용하여 코드를 작성하였는데 if문 사용 용도가 이번 문제에서는 조건이 참, 거짓 두개의 함수 실행 블록중에서 하나만 실행하는 용도로만 사용하여서 그러면 굳이 if문이 아니라 삼항 조건 연산자를 사용해도 문제가 없을거 같아서 삼항 조건 연산자를 사용하여 코드를 간소화 하였다.
그래서 여기서 느끼는 부분은 뭔가 함수 실행 블록 내용이 복잡하지 않거나 갯수가 두개 이하일때는 삼항 조건 연산자를 이용하여 코드를 간소화 하자.

  1. String(객체) 메서드를 더 확인해보자 분명 목적에 맞고 코드를 간소화 시킬수 있는 메서드가 존재한다. 그런 메서드를 잘 이용하자!!!

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

profile
ENJOY!! PROGRAMING!!

0개의 댓글