오늘 하루는 반복문만 쓰다가 끝난 것 같다. for ( let i = 0 ; i < str.length ; i++) 이것만 한 20번은 쳤을 듯? for.. for.. 내가 영어영문학과일 때 이 for는 그냥 단순한 전치사였을 뿐인데 이 컴퓨터의 언어에서는 왜 이렇게 복잡한 건지 모르겠다. 그러다가 문득 생각난 짤 하나
그래도 같이 고생하는 페어님이 계셔서 외롭지는 않았다.
[ 오늘의 할 일 ]
문자열 코플릿반복문(for, while, 이중 반복문) 학습반복문 코플릿Zoom 모임

[ 오늘의 오류와 구글링 ]
1. result, reuslt
오늘 가장 인상 깊었던 오류 해결 중의 하나였다. 내가 return 값으로 result를 내보내려 하는데 계속 에러가 났다. 그런데 나랑 똑같이 작성한 페어 분은 에러 없이 성공적으로 Pass를 받았다. 아니 이게 뭔가 싶어서 한참을 들여보다가 결국 지금 오류나는 코딩 줄 모두 잘라내기하고, 다시 처음부터 작성했다. 새로 작성한 거는 오류가 나지 않았고, 잘라내기 했던 거랑 비교를 해보니 세상에 저 철자 하나 차이였다.
진짜 나 스스로 부탁하는데 이런 철자 하나하나 조심하자. 잊지 말자. 내 상대는 컴퓨터, 컴퓨터는 문법나치다.
2. 문자열은 immutable!
오늘 페어분이랑 스킵하고 다시 풀었던 문제가 하나 있었다. (코드 스테이츠가 내는 문제에 저작권이 있을 수 있으므로 문제의 자세한 내용은 생략하고 원문은 바꾸어서 쓰겠습니다)
function hardQuestion ( str, target, replace ) { }
hardQuestion이라는 함수는 str으로 받은 문자열 중에 target이라는 letter가 있으면 그걸 replace라는 letter로 바꾸는 문제였다. 나랑 페어분은 어떻게 하지 찾다가 밑에 링크달린 str.replace( ) 라는 매소드를 찾았고 그것을 활용해야 한다고 생각했다. 그러나 그렇게 활용하는 것은 불가능했다.
내가 푼 방식은 배열을 활용하는 것이었다.
let result = []
for ( let i = 0 ; i <= str.length ; i++ ) {
if (str[i] !== target) {
result.push(str[i])
} else {
result.push(replace)
}
}
return result.join('')
함수 안에 저 내용을 적었다. 그러니까 각 인덱스를 배열의 원소로 받고, target인 것들만 바꿔서 replace한 것. 물론, 답은 맞췄다. 그런데 왜 문자열을 사용했을 때는 내가 원하는 답이 안 나오는지를 알고 싶어서 찾아봤다.
그 결과, 문자열은 immutable인 것을 확인했다. 즉, 배열과 다르게 문자열의 내용은 바꿀 수 없는 것이다. 그러니까 바꾼다는 생각을 하지 말고, 새로운 문자열을 만든다는 생각을 해야 했다. 배열은 새롭게 만들면서 문자열을 새롭게 만들어야 겠다는 생각을 못한 내가 바보 같아졌다.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
String.prototype.replace() - JavaScript | MDN
The replace() method returns a new string with some or all matches of a pattern replaced by a replacement. The pattern can be a string or a RegExp, and the replacement can be a string or a function to be called for each match. If pattern is a string, onl
developer.mozilla.org
[ 오늘의 느낀 점 ]
1. 아름다운 코딩
이 밑의 코딩은 내가 문제를 풀기 위해 작성한 코딩이다.
let result = 0
if (num1 <= num2) {
for ( let i = num1 ; i <= num2 ; i ++ ) {
if ( i % 2 === 0 ) {
if ( i !== 0 ) {
result = result + 1
}
}
}
return result
}
else {
for ( let i = num2 ; i <= num1 ; i ++ ) {
if ( i % 2 === 0 ) {
if ( i !== 0 ) {
result = result + 1
}
}
}
return result
}
}
진짜 누가 봐도 어지럽게 생겼다. 일단 조건문으로 if와 else가 갈라졌고 if랑 else 각각 안에 for문이 들어가 있고 심지어 그 안에 또 if가 있고 거기 안에 또 if가 있다. 그러니까 내 코딩에는 지금 for문이 2개, if(else포함)문이 6개다. 시간 복잡도를 계산하면 아무래도 더 복잡해지겠지?
그런데 코드 스테이츠에서 제시하는 답을 보면 if문 3 개와 for문 하나로 끝냈다. 심지어 나처럼 복잡하게 파고 파고 또 파는 것이 아니라 단순하게 병렬적으로 나열돼 있다.
if ~~
if ~~
for ~~
if ~~
저 답안을 봤을 때 내가 먼저 들었던 생각은 나도 저렇게 생각할 수 있는 날이 올까? 였다. 나는 고등학생 때 수학을 좋아했다. 그래서 가끔씩 수학 문제집 해설집을 보면 "아름답다"라고 생각하는 해답들이 있었고, 그렇게 해답을 풀기 위해서 부지런히 노력했던 것 같다. 지금 내가 딱 그 기분이다. 코딩이 깔끔하고 아름답다. 나도 언젠가는 저런 코딩을 할 날이 왔으면 좋겠다.
'코드스테이츠 > 코드스테이츠 @ 개발 일지' 카테고리의 다른 글
[코드 스테이츠] 6일차, 복습의 힘 (0) | 2021.07.24 |
---|---|
[코드 스테이츠] 5일차, "나는 왜 개발자가 되려고 할까?" (0) | 2021.07.23 |
[코드 스테이츠] 3일차, "구글링"의 시작 (0) | 2021.07.21 |
[코드 스테이츠] 2일차, "맨 땅에 헤딩 중" (0) | 2021.07.20 |
[코드 스테이츠] 1일차, "능동적인" 개발자 가이드 (0) | 2021.07.19 |