😢 도형은 신기하다. 쉬워보이는데, 해보면 생각보다 쉽지는 않다. 특히, 재귀사용을 위해서는 재귀에 대한 높은 이해가 필요하다.
😊 Solution 1) 중첩 for loop을 이용해서 간단하게 해결이 가능하다. 직사각형 형태이기 때문에, 외부 for loop과 내부 for loop 모두 0부터 그리고 n보다 작을 때까지 index를 증가시키면 된다. 그리고 내부 for loop에서 column(열)이 row(행)보다 작거나 같으면 '#'을, 크다면 ' '을 대입해주면 된다.
Solution 2) 재귀적 용법으로 문제를 해결했다. 먼저 row=0, stair=''로 default를 선언해준다. 그리고 만약 n이 row(행)와 같다면 함수를 return;해준다.(n만큼 행을 출력했으니까 더 이상 출력할 필요 없음) 그리고 만약 값을 저장하는 stair의 길이가 n과 같으면 row(행)+1함수를 실행시켜준다. (여기서 return을 필수적으로 해줘야한다. 해주지 않으면 밑으로 내려가 불필요한 재귀를 다시 실행해주기 때문이다) 그 밑으로는 Solution 1)과 마찬가지로 stair.length가 row보다 작거나 같으면 '#', 아니라면 ' '를 대입해준다. (stair.length는 Solution 1)의 column을 대체한다) 그리고 steps(n, row, stair+add)를 재귀적으로 실행하면 된다.
--- Examples capitalize('a short sentence') --> 'A Short Sentence' capitalize('a lazy fox') --> 'A Lazy Fox' capitalize('look, it is working!') --> 'Look, It Is Working!'
Code
😢 배열(Array)의 index을 이용해서 원초적 해결하려 했더니 조금 힘들었다.
😊 Solution 1) 입력받은 str을 split(' ')을 이용해 각 단어별로 나눠진 Array를 만들어주고, for ... of loop 안에서 각 단어를 하나씩 가져와, 첫 번째 알파벳은 대문자로, 나머지 값은 slice(1)로 붙여주었다. 그리고 join(' ')을 이용해 다시 String(문장)으로 만들어 반환해주었다.
Solution 2) classic for loop을 이용해 각 index의 앞(i-1)이 ' '(space)라면 해당 index(i)를 대문자로 변환하여 저장한다. 그게 아니라면, 해당 index(i)를 단순 저장해준다.
✨ Array의 모든 index에 값을 한 번에 채워주거나, 원하는 구간만큼 값을 채워줄 수 있는 helper method
(e.g., arr.fill(false) or arr.fill(0, 2, 4)) 왼쪽처럼 Array의 모든 값을 false로 채우거나, index 2부터 3까지 0을 채워줄 수 있다. (Array.prototype.slice()와 마찬가지로 구간을 지정할 때, end-1까지 진행된다는 점을 명심하자)
💻Example Code
const arr = [ 1, 2, 3, 4, 5, 6 ];
console.log( arr.fill(0, 1, 3) );
😋 매우 큰 Array의 값을 한 번에 초기화 해줄 때, 또는 원하는 index 구간만큼 값을 바꿔줄 때 매우 유용하다. 백준 4673번 셀프 넘버(Self Number)문제를 풀 때 사용했다.
😊 기존 제출 Solution) array를 선언하고, 모든 index 값을 0으로 초기화해준 후 Self Number가 아니라면 해당 index에 1을 넣어주었다. 그리고 마지막에 for loop의 i를 이용해 array[i]의 값이 1이 아니라면(=Self Number라면) Self Number인 i를 출력하도록 했다.
[추가] 최종 제출 Solution) while loop 안에서 각 자릿수 나눠주기 + 나눠준 값 더하기를 진행하여 코드의 복잡도를 줄여줬다. 또한 시간도 더 빨라졌다. 그리고 배열 10000개 만큼 false로 채워주고, 셀프 넘버가 아니라면 true로 변경시켜주었다. 따라서 false로 남아있다면 그건 셀프 넘버다.
✔ 각 자릿수를 구하는 것은 매우 원초적인 방법으로 진행했다. 54321인 다섯 자리를 기준으로 설명하자면, parseInt( 54321/10000 )(=5.4321)은 5 parseInt( (54321%10000) / 1000 )(=4.321)은 4 parseInt( (54321%1000) / 100 )(=3.21)은 3 parseInt( (54321%100) / 10 )(=2.1)은 2 54321 % 10 은 1 아래 Full Code에는 위의 자릿수 나누는 방식을, 다른 방법으로 접근한 Code가 있다.
(e.g., str.replace('dog', 'cat')) 왼쪽처럼 dog을 cat으로 교체하는 것이 가능하다. 간단하게 설명하자면, 첫 번째 parameter에는 RegExp(Regular Expressions) 또는 String을 넣을 수 있고(즉, 찾을 pattern) 두 번째 parameter에는 새로 넣을 new string을 넣을 수 있다(즉, 새로 넣을 replacement)
📌replace(/[^\w]/g, '')를 자세히 살펴보겠다. 1. RegExp의 시작과 끝은 /(slash) 2. []는 []안에 어느 것이라도 매치된다면 이라는 뜻이다. (다시 알아볼 필요가 있음) 3. ^ 는 무효화 시킨다는 뜻이다(반전이라고 생각하면 될듯하다) 4. \w은 글자와 숫자(alphanumeric)를 뜻한다. 5. g는 global이라는 뜻. 한 번 매치되어도 끝까지 매치되는 것을 찾게 한다.
즉, [^\w]을 이용해 글자와 숫자 이외의 모든 문자는 제거한다. 라고 보면 편하다.
😋 Anagrams(철자를 바꾼 말) Algorithm에서 공백, 구두점 그리고 특수문자를 제거하기 위해 사용하였다. Regular Expressions은 문자열을 다루기에 매우 유용하다. 어렵기 때문에 하나씩 차근차근 쌓아가는 것이 필요하다.