우선적으로 해야할 일은 문제를 이해하는 것 입니다.
예제) 두 숫자를 가지고 합계를 반환하는 함수를 작성할 것이다.
// 1. 이 문제를 여러분 방식대로 바꿀 수 있나요?
숫자를 더하거나 덧셈을 수행하는 함수를 작성하면 될 것이다.
// 2. 문제에 해당하는 입력값은 무엇인가요?
- int?
- float
- string? or large numbers?
// 3. 출력값의 형태는 어ㅏ떻게 될까요?
int, float, string
// 4. 입력값이 출력값을 결정할 수 있는지, 즉 문제를 해결하기에 충분한 정보를 가지고 있는지
// 5. 문제의 일부인 중요한 데이터의 라벨을 어떻게 지정해야할까요?
무엇이 중요한가에 대해 생각부터 해보자 - 현재 필요한 전부는 입력값과 출력값 두가지다
문자열을 취하고 각 문자의 수를 반환하는 함수를 작성하라고 한다면!
일단 예시를 생각해보자 그래 ..charCount()함수를 작성한다하고
charCount(“aaaa”) // {a: 4} 이런식으로 입력과 반환이 될 거고
charCount(“hello”) // { h: 1, e: 1, l: 2, o: 1 } 이 예제는 이런식으로 될 것이다.
더 복잡함 예시
“my phone number is 158857” // 공백, 숫자, 특문 이런건 어떻게 해야할까?
“Hello hi // 대 소문자는 어떻게 해야할까?
비어있는 인풋을 주었을때
charCount(“”) // 무엇을 반환해야할까요? Null? Undefined?, false? 뭘 해야힐ㄲ라 .. ㅣㅇ는 유요하지 않은 입력값이 주어진 예시를 살펴보는것과 관련있다 .4번!
Null, undefined 같은 갑슬 반환하면 어떡하냐 .. 이런 모든 종류의 경계조건들이 있다.
Ex) 주석으로 해야할 것들을 세분화해서 적어두자
function () {
// make object to return at end
// loop over string, for each character…
// 만약 char문자가 (문자/ 숫자)가 객체에 있다면 , 즉, 키로써 객체이 있다면 1을 더해주고 // 여기서 (문자/숫자)라고 적어준 이유는 공백과 특수문자를 제외시켜야하기 때문이다
// 만약 char문자가 (문자/ 숫자)가 객체에 없다면 추가하고 값을 1로 설정한다.
// 만약 char문자가 공백, 마침표 등과 같은 다른 것이라면 아무것도 하지 않는다.
// return object at end
}
적용하면
function () {
// make object to return at end
var result = {};
// loop over string, for each character…
for( var i =0; i<str.length; i++) {
var char = str[i];
// 만약 char문자가 (문자/ 숫자)가 객체에 있다면 , 즉, 키로써 객체이 있다면 1을 더해주고
// result[char]가 0보다 크면 이미 객체에 있다는 의미이다. true를 반환함
if(result[char] > 0) {
}
}
// 만약 char문자가 (문자/ 숫자)가 객체에 있다면 , 즉, 키로써 객체이 있다면 1을 더해주고 // 여기서 (문자/숫자)라고 적어준 이유는 공백과 특수문자를 제외시켜야하기 때문이다
// 만약 char문자가 (문자/ 숫자)가 객체에 없다면 추가하고 값을 1로 설정한다.
// 만약 char문자가 공백, 마침표 등과 같은 다른 것이라면 아무것도 하지 않는다.
// return object at end
}
마지막으로 리팩터링
리팩터링 질문 나에게 하는 ㅇㅇ
Frequency Counter (횟수, 빈번, 빈도)
문자열 같은거 비교할 때 사용
문자가 그 안에 있는 경우 뿐만 아니라 안에 있는 문자들이 나타나는 정확한 횟수, 빈도가 정확한지 확인해야함
정렬되있다는 조건하에 적용 만약 정렬이 안되있다면 존나 운 없는거 ㅠ ㅠ 화이팅!
이 패턴의 개념은 인덱스나 위치에 해당하는 포인터나 값을 만든 다음 특정 조건에 따라 중간지점부터 시작지점이나 끝 지점이나 양쪽 지점을 향해 이동시키는 것입니다.
결론적으로 말하면 배열이나 문자열과 같은 일종으의선형 구조 ex) [-4, -3, -2, -1, 0, 1, 2, 6, 8] “asosajdighfujeddsfkl” 한 쌍의 값이나 조건을 충족시키는 무언가
양 끝 지점은 반대방향 왼쪽, 오른쪽은 같은 방향으로 흘러가게 인덱스(기준점)을 잡고 움직인다 .그러면 for문 하나로 해서 O(N)이다 .. 예를들면 알맞는 쌍 찾기
싸용법
각각 0과 1 의 위치(index) 를 i, j 로 잡고 큰 값 쪽으로 이동하면서 첫 번째 포인터를 특정한 조건을 준다 즉, 일치하지 않는!
두 개의 고유 값을 찾는 경우에만 바꿔줍니다.
특정 방식으로 연속적인 배열이나 문자열과 같은 일련의 데이터를 입력하거나 해당 데이터의 하위 집합을 찾는 경우에 유용하다.
시작점 or 끝나는점 인덱스를 기준으로 설정하면 되겠네
Ex) [2,4,2,4,5,6,7,5,4,2,1,4], 5 가 주어질때 연속된 5개 숫자를 더해서 가장 큰 값을 구해라 하면
여튼 0번 부터 시작한다하면 loop는 i=0 시작이면 arr.length-5+1 까지다 ㅇㅇ .. 그래야 ㄷ마지막까지 딱 5개 더하니까 ㅇㅇ
근데 마지막 까지로 하고싶으면 일단 0부터 4번까지 5개 합계 구했다는 가정하게 시작을 i= 5 주고. i<arr.length 하게되면 이제 밑에서 방식이
sum - arr[i-num] + arr[i ] 해서 하면 됨 여튼 방식은
5개 합 구할때 0~4 인덱스 합 구하기 vs 1~5합 구하기 이런식으로 하면 계속 더하기가 발생하니
0~4 합 구하고 다음 창으로 이동하면 합에서 0번 인덱스 빼고 5번 인덱스 더해주면 됨 조금 씩 이동한다! 그러면 연산은 조금만 발생함
분할 정복 패턴
이진 탐색
어떤 특정한 값을 찾을떄는 탐색 하면 됳듯
여튼 이런거다 정렬이 된 기준임 ㅇㅇ 그래야 반 나눠서 하니까