4.1프로그래머스 Lv.0 #1~10
프로그래머스 Lv.0 1~10번
개요
기초 트레이닝 문제(Lv.0) 1 ~ 10번 문제 풀이 중 배울 점이 있는 풀이들에서 배운 개념들을 내 것으로 만들고자 정리해본다.
3. 대소문자 바꿔서 출력하기
대소문자 바꿔서 출력하기는 크게 두 개의 포인트가 있다:
- input으로 받은 문자열의 개별 문자를 어떻게 나눌 것인지
- 개별 문자의 대소문자 여부를 자바스크립트에서 어떻게 확인하고 어떻게 바꿀 것인지
또 하나가 더 있다면, 개별 문자만 몇개 바꾸는게 불가능한 자바스크립트의 문자열을 어떻게 바꿀 것인지 정도가 있을 것이다.
내 답은 아래와 같다.
javascriptfunction(){ 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를 만들어 거기서 바꾼 후 다시 이어 붙인다.
javascriptconst 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
와 같은 효과다.
javascriptconst str = input[0]; const regex = /[A-Z]/ console.log([...str].map((v)=> regex.test(v) ? v.toLowerCase() : v.toUpperCase()).join(''))
4. 덧셈식 출력하기
덧셈식 출력하기는 문제 자체로는 그렇게 특별할게 없다. 나는 이렇게 풀었다.
javascriptconst [a, b] = line.split(' '); console.log(a, '+', b, '=', Number(a) + Number(b))
문제될건 없지만, 우아함(?) 측면에서 아래의 답이 인상 깊었다.
4-1. line.split(' ').map(Number)
답부터 보자.
javascriptconst [a, b] = line.split(' ').map(Number); console.log(`${a} + ${b} = ${a + b}`)
Number
는 실제로 문자열을 숫자로 변환하는 함수다. 정확히 말하면,
javascriptNumber('3') === 3 Number('10') === 10 Number('') === 0 Number('abc') === NaN
따라서, map()
함수가 각 요소에 대해 콜백 함수를 실행하므로 위 코드는 아래와 같다.
javascriptline.split(' ').map(x => Number(x))
8. 문자열 돌리기
문자열 돌리기는 문자열을 개별 문자들로 하나씩 하나씩 출력하라는 문제다. 나는 for
문을 애용하다보니 포문을 써서 풀었다.
javascriptconst str = input[0]; for(let i = 0; i<str.length; i++){ console.log(str[i]) }
앞서 3번 문제에서 배운 기법을 쓰면 이렇게도 될 것이다:
javascriptconst str = input[0].split(''); str.forEach(c => console.log(c));
8-1. for... of
사실 위의 기법과 관련된 내용으로 작성하려고 했는데, 복습을 하며 이렇게도 풀 수 있겠네? 하고 쓰다보니 같은 답이어서 잘 안 쓰고 있던 for... of
를 복습하려고 한다. for... of
로는 이렇게 쓸 수 있을 것이고, 이게 더 간단하고 직관적이다.
javascriptconst str = input[0]; for(let i of str){ console.log(i) }
10. 문자열 겹쳐쓰기
문자열 겹쳐쓰기는 나는 정말 지저분하게 풀었다.
javascriptfunction 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
를 쓰면 해결된다.
javascriptfunction 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
에 익숙했더라면 아마 이 방법이 가장 먼저 떠올랐을것 같다.
javascriptfunction 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
와 메소드 이름만 다르고 풀이가 같다.
javascriptfunction solution(my_string, overwrite_string, s) { return my_string.substring(0, s) + overwrite_string + my_string.substring(s + overwrite_string.length); }