sungyup's.

Web_Miscellaneous / Algorithm(JS) / 4.1 프로그래머스 Lv.0 #1~10

4.1프로그래머스 Lv.0 #1~10

프로그래머스 Lv.0 1~10번

개요

기초 트레이닝 문제(Lv.0) 1 ~ 10번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.

3. 대소문자 바꿔서 출력하기

대소문자 바꿔서 출력하기는 크게 두 개의 포인트가 있다:

  1. input으로 받은 문자열의 개별 문자를 어떻게 나눌 것인지
  2. 개별 문자의 대소문자 여부를 자바스크립트에서 어떻게 확인하고 어떻게 바꿀 것인지

또 하나가 더 있다면, 개별 문자만 몇개 바꾸는게 불가능한 자바스크립트의 문자열을 어떻게 바꿀 것인지 정도가 있을 것이다.

내 답은 아래와 같다.

javascript
function(){ const [str] = input; let answer = ""; for(let i = 0; i < str.length; i++){ if(str[i].toUpperCase() === str[i]){ answer += str[i].toLowerCase(); } else { answer += str[i].toUpperCase() } } console.log(answer); };

나는 1번 문제는 문자열이 array-like object인 것을 활용해 str[i] 식으로 개별 문자에 접근하고 for문으로 각 문자를 나눴다. 또, str는 바꿀 수 없으므로 answer라는 빈 문자열을 만들고 거기에 개별 문자를 붙였다.

다른 사람들의 접근법들 중 좋다고 생각한 것은 아래와 같다:

3-1. split('')으로 나누고 forEach

문자열을 직접 바꿀수는 없으므로 개별 문자들로 구성된 array를 만들어 거기서 바꾼 후 다시 이어 붙인다.

javascript
const str = input[0].split(''); // array로 만든다 str.forEach((value, index)=> { // forEach로 array를 순회한다 if(value === value.toUpperCase()){ str[index] = value.toLowerCase(); // str[index]에 값을 직접 할당한다 } //... }) console.log(str.join('')); // 다시 문자열로 합친다

3-2. [...str].map과 regex.test

대문자 여부 확인을 regex(정규표현식)으로 하였다. 사실 나도 보통 폼의 유효성 검사 등을 할 때 regex를 쓰는 편인데, 그때그때 인터넷에서 찾아쓰곤 했다.

regex.test를 개별 문자별로 하기 위해 이 답안은 [...str]로 문자열을 개별 문자 단위로 구성된 배열로 풀었다. 앞선 답에서의 str.forEach와 같은 효과다.

javascript
const str = input[0]; const regex = /[A-Z]/ console.log([...str].map((v)=> regex.test(v) ? v.toLowerCase() : v.toUpperCase()).join(''))

4. 덧셈식 출력하기

덧셈식 출력하기는 문제 자체로는 그렇게 특별할게 없다. 나는 이렇게 풀었다.

javascript
const [a, b] = line.split(' '); console.log(a, '+', b, '=', Number(a) + Number(b))

문제될건 없지만, 우아함(?) 측면에서 아래의 답이 인상 깊었다.

4-1. line.split(' ').map(Number)

답부터 보자.

javascript
const [a, b] = line.split(' ').map(Number); console.log(`${a} + ${b} = ${a + b}`)

Number는 실제로 문자열을 숫자로 변환하는 함수다. 정확히 말하면,

javascript
Number('3') === 3 Number('10') === 10 Number('') === 0 Number('abc') === NaN

따라서, map() 함수가 각 요소에 대해 콜백 함수를 실행하므로 위 코드는 아래와 같다.

javascript
line.split(' ').map(x => Number(x))

8. 문자열 돌리기

문자열 돌리기는 문자열을 개별 문자들로 하나씩 하나씩 출력하라는 문제다. 나는 for문을 애용하다보니 포문을 써서 풀었다.

javascript
const str = input[0]; for(let i = 0; i<str.length; i++){ console.log(str[i]) }

앞서 3번 문제에서 배운 기법을 쓰면 이렇게도 될 것이다:

javascript
const str = input[0].split(''); str.forEach(c => console.log(c));

8-1. for... of

사실 위의 기법과 관련된 내용으로 작성하려고 했는데, 복습을 하며 이렇게도 풀 수 있겠네? 하고 쓰다보니 같은 답이어서 잘 안 쓰고 있던 for... of를 복습하려고 한다. for... of로는 이렇게 쓸 수 있을 것이고, 이게 더 간단하고 직관적이다.

javascript
const str = input[0]; for(let i of str){ console.log(i) }

10. 문자열 겹쳐쓰기

문자열 겹쳐쓰기는 나는 정말 지저분하게 풀었다.

javascript
function solution(my_string, overwrite_string, s) { let answer = ''; let mslength = my_string.length; let oslength = overwrite_string.length; for(let i = 0; i < s; i++){ answer += my_string[i] } for(let i = 0; i< oslength; i++){ answer +=overwrite_string[i] } for(let i = oslength + s; i < mslength; i++){ answer += my_string[i] } return answer; }

그래서 다른 답을 봤을때 더 부끄러웠던것 같다.

10-1. slice 쓰기

그냥 문자열을 원하는 위치부터 원하는 위치까지 자를 수 있는 slice를 쓰면 해결된다.

javascript
function solution(my_string, overwrite_string, s) { return my_string.slice(0, s)+overwrite_string+my_string.slice(s + overwrite_string.length); }

10-2. splice 쓰기

문자열을 우리가 3번 문제로 익힌 테크닉 string.split('')으로 개별 문자로 구성된 배열로 만든다면, splice 메소드도 사용 가능하다.

splice는 기본적으로 array.splice(startIndex, deleteCount, item1, item2, ...)식으로 쓰여, 배열의 어디서부터 몇개의 요소를 제거하고 무엇을 넣을지를 지정하는 메소드다. 즉, 이 문제랑 찰떡이다. splice에 익숙했더라면 아마 이 방법이 가장 먼저 떠올랐을것 같다.

javascript
function solution(my_string, overwrite_string, s){ const answer = my_string.split(''); answer.splice(s, overwrite_string.length, overwrite_string); return answer.join(''); }

10-3. substring 쓰기

substring(startIndex, endIndex)는 시작 지점부터 종료 지점까지(옵션. endIndex가 없으면 끝까지) 문자열을 잘라낸다.

slice와 비교하면 substring은 startIndex > endIndex면 두 값을 자동으로 교환해서 어떻게든 문자열을 주려고 하고, slice는 빈 문자열을 반환한다. 또, slice음수 인덱스도 사용 가능하다. slice의 음수 인덱스는 -1이면 맨 끝, -2면 맨 끝 바로 앞, ... 식이다.

substr 메소드도 있다. substring이랑 아주 비슷하게 생긴 이 메소드는 시작부터 length만큼 추출하는 메소드이지만 deprecated된 메소드로, 레거시 코드에서나 쓰이기 때문에 쓰지 말자.

아무튼, 이 상황에선 딱히 음수 인덱스를 쓸 일도 없기 때문에 앞서 본 slice와 메소드 이름만 다르고 풀이가 같다.

javascript
function solution(my_string, overwrite_string, s) { return my_string.substring(0, s) + overwrite_string + my_string.substring(s + overwrite_string.length); }