본문 바로가기
깃허브 링크!
프로그래머스

자바스크립트 프로그래머스

 

정수 n의 약수를 구해야하는데 for문의 조건부에 i<n=2로 준것은 약수의 절반까지만 구하되 1과 n(자신)에서 n만 생략해주고  ex) 1, 2 ,3 ,4 , 6, 9 ,12 ,18 ,36 여기에서 36만 생략
array.length+1로 대체시켜서 코드가 좀더 가벼워지게 해주었다

 

 

index_list 배열을 중심으로 for문으로 순회할건데

배열의 한요소 한요소를 index라는 변수에 for문으로 전부다 담아주고

 

 빈 문자열 my_string의 index에다가 넣어주는데 사용해주어서 새로 담아주고

result 값을 반환해준다.

 

 


푼 문제 다시보기

 

cnt를 사용하여 1부터 n까지의 숫자를 순회하면서 짝수를 찾기위해서 let cnt=1;로 생성하되 초기화도 해주었고

 

cnt의 값을 더한 sum을 생성해주었다.

 

sum이라는 초기화 합계를 만들고

numbers의 요소를 for문으로 순회하고 sum에다가 합계를 집계하고

결과에는 numbers.length로 sum에다가 나눠준다.

 

 

Math.floor(n/10) * 2000 은 10 미만은 0원이 나오고 n이 10일때부터 2000이 나오도록

 

 

 

7/3

 

여기서 잘못된 부분은 answer.push[i] 부분인데 대괄호 []는 배열의 인덱스를 통해 해당 인덱스의 값을 참조할때 사용하는 것이고 answer.push()는 push메서드를 호출하는 것을 의미한다. push 메서드는 배열에 값을 추가하는 메서드 그러므로 () 소괄호를 사용해 주어야 한다.

 

 


여기까지는 해봤는데 나는 answer=sum(num_list)이렇게만 작성해도 스스로 더해줄줄 알았는데 아니었다. sum함수와 multiply 함수가 정의되어 있지 않아서 문제가 발생한것 함수를 정의하자.

아래 코드는 위의 수정버전

reduce 메서드의 콜백함수는 누적값(accumulator)과 현재 값을 (currentVaule)더하고 초기값을 0으로 설정하고 두번째 초기값이 1인 이유는 곱하기라서


 

indexOf 에 대해서. 🐶

 

- 주어진 문자열이 처음으로 등장하는 인덱스를 반환한다. 

string.indexOf(searchValue, fromIndex)  

 

첫번째 매개변수 : 찾으려는 문자열 또는 문자.

두번째 매개변수 : 검색을 시작할 인덱스

 

 

a = "00100100"으로 설정후에

 

문자열의 첫문자가 0으로 시작되면 다 제거한후에 나타내는게 목적

먼저 indexOf(0)으로 0이 처음시작되는 인덱스를 찾아주고 firstNonZeroIndex에다 할당후

만약 while 문의 조건 (firstNonZeroINdex === 0)을 만족시키면

answer = answer.slice(1,n_str.length);로 맨 앞의 0을 지워주고 

firstNonzeroIndex = answer.indexOf(0)으로 다시 0이 처음 시작되는 인덱스를 찾는데 그게 또 0이면 while문의 반복아래 실행되고 아니면 while문을 빠져나와서 

return answer로 결과를 반환해준다.

 

 


myString보다 작은 알파벳 "a" 부터 "k"까지(문자열을 분할해서 "a","b","c"..."k") Alphabet이라고 선언후에

주어진 myString도 split으로 문자열을 분할시켜준 후에

 

분할된 문자열들끼리 비교해주려는데 for문안의 for문 구조로 시작

j=0일 경우에 i=0부터 my_string.length 길이까지 반복 

j=1일 경우에 i=0부터 my_string.length 길이까지 반복 

 

그중에서 Characters[i] === Alphabet[j]를 만족시키는 즉 Alphabet의 요소중에 하나라도 해당되는게 있다면 그 위치의

Characters[i]="l"로 변경시켜준다. 

 

그후에 answer=Characters.join(" ")으로 분할된 문자열을 합쳐준후에 

return으로 값을 반환해준다.

 


- 처음에는 2번째 사진의 방식대로 나갔는데 이렇게 해보니까 큰수는 뽑을수 있지만 그 인덱스는 찾는 방법이 떠오르지가 않았다.

 

for문을 잘 활용해야 하는데 for문을 활용해서 얻어야 할것은 array중 가장 큰 값과 그 값의 인덱스를 찾아줘야 한다.

-1.

array배열중의 요소들과 값을 비교를 해줘야 하는데 가장 큰값을 찾기위해서는 

한요소 한요소 for문으로 모두  싹 비교해준후에 최종 max의 값은 누구인지 가리는게 목적인데 

 

비교의 기준이 될 array[0]을 max로 지정해놓고 maxIndex는 0으로 초기화 해놓는다.

 

그 후에 i는 1부터 <array.length까지 비교하는데 1부터 하는 이유는 당연히 처음에는 array[0]과 비교하기 위함이다.

 

 


 

배열안에서도 slice가 가능하고 length도 사용가능하다

 


헷갈렸던것은 answer.push(numlist[i]) 

나는 push.answer(numlist[i])이렇게 작성했다.

 

 


 

이게 정답

 const temp = arr[num1];
  arr[num1] = arr[num2];
  arr[num2] = temp;

자바스크립트 이퀄기호

 

ex) a= 1

=는 우항의 값인 1을 좌항의 변수 a에 대입하는 대입 연산자.

 

 arr[num1] = arr[num2]   arr[num2]의 값을 arr[num1]에 대입

arr[num2] = temp는 temp에 저장된 값(원래 arr[num1]에 있던값을 arr[num2]에 할당

 


자바스크립트 =이건 대입 연산자인데 finished[i]의 값을 항상 false로 설정하고 있는데 이는 항상 false를 반환하고 대입 연산자는 항상 대입한 값을 반환하므로 조건식은 항상 false로 평가된다.
올바른 비교를 위해서는 === 연산자를 사용해야 한다. 따라서 조건문은 === 사용

 




 

접미사는 ("banana","anana","nana","na","a") 잘 보면 마지막 문자가 꼭 들어가있고 문자열이 부분적이 아닌 연속적인것을 확인

 

i랑 j변수를 각각의 문자열의 길이를 저장해주고 (-1은 인덱스는 0부터 시작하니까)

조건이 있는데 is_suffix문자열에 한해서 my_string문자열에도 있는지를 보는거니까 

 

while조건문으로 suffix의 인덱스가 0이상으로 조건을 준다.

my_string과 is_suffix의 문자열 끝부분 부터 비교를 해서 suffix의 인덱스가 끝날때까지 비교하는데 하나라도 틀린게 있다면 return 0 을 해준다.

 

while은 주어진 조건이 true인 동안 반복적으로 코드 블록을 실행하는 반복문입니다. 

 


switch문을 사용하였는데 

control.length로 control문자열을 순회하면서 도는데 

"w","s","d","a"인 4가지 경우가 있어서 switch를 사용해 주었다.

 

for문안에 switch구조가 있는 형태이고

만약 4가지 경우의 수 중에 임의의 하나가 선택되면 break로 switch문을 나오고 다시 for문으로 switch를 반복시킨다.

 


 

초기값 -1 설정

정수를 문자열로 변환후에 (indexOf) 사용해서 -1이 아닌경우에

찾는 k의 인덱스를 num에서 찾아준후에 +1을 해준다.(result에서는 인덱스로 계산하는게 아니라 1,2,3 정수로 가기 때문)

 

 


🔱⚜️ gpt 보고 풀었음 .. (처음 풀이보고 이해한후에 어떻게 이런 생각을 할수 있었을까 했는데 글로 써보고 이해하면 아 쉽네 이런다.)

이중 for문이 들어가는데 

arr[0]~arr[4] 까지는 for문으로 돌리면서 (바깥쪽 for문)

변수 j도 for 문으로 돌리는데 이걸 왜 돌리냐면 j<a를 보면 a가 0인 경우에는 성립 x a가 1인 경우에는 j가 0인 경우 한번만 있으니까 한번만 반복 a가 2인 경우에는 j가 0,1인 경우가 있으니까 2번 반복이 된다.

j                      < a
0   0
1   1
2   2
3   3
    4
     

📒📒(비슷한 유형1)

 

function isPrime(n){

if(n !=2 && n%2 == 0){

    return false

} else if(n !=3 && n%3 == 0){

    return false

} else if(n !=5 && n%5 == 0){

    return false

} else if(n !=7 && n%7 == 0){

    return false

}

return true;

 

}

console.log(isPrime(31));// true

console.log(isPrime(10));// false

 


📒📒(비슷한 유형2)

제가 이해했는데, 함수 isCompositeNumber는 주어진 숫자 n이 2, 3, 5, 7을 제외한 수 중 
하나로 나누어지는지를 확인하는 함수입니다. 
그리고 solution 함수는 isCompositeNumber 함수를 사용하여 
n 이하의 합성수(약수가 세 개 이상인 수)의 개수를 구하는 것으로 보입니다.

첫 번째 질문에 대해서, return true는 함수 isCompositeNumber에서 결과로 true를 반환하는 것을 의미합니다. 함수 isCompositeNumber의 내부 조건문에서 n이 2, 3, 5, 7을 제외한 숫자 중 하나로 나누어진다면 true를 반환합니다. 그렇지 않은 경우, 즉 2, 3, 5, 7을 제외한 숫자로 나누어지지 않는 경우에는 false가 반환됩니다.

두 번째 질문에 대해서, solution 함수에서 for 루프를 사용하여 i가 2부터 n까지 반복합니다. 
그리고 isCompositeNumber(i)를 호출하여 i가 합성수인지를 판별합니다. 
만약 isCompositeNumber(i)가 true를 반환한다면, 즉 i가 합성수라면 answer 변수를 1 증가시킵니다.

예를 들어, n이 20인 경우, for 루프에서 i는 2부터 20까지 반복됩니다.
i가 2, 3, 5, 7인 경우는 합성수가 아니므로 isCompositeNumber(i)는 false를 반환합니다. 
따라서, 2, 3, 5, 7을 제외한 수들 중에서 합성수인
4, 6, 8, 9, 10, 12, 14, 15, 16, 18, 20이 존재하므로 answer는 11이 됩니다.

코드는 정상적으로 작동하는 것으로 보입니다. 만약 다른 의문이 있다면 추가적으로 설명해드리겠습니다.

(●'◡'●) slice와 splice의 차이

 

 

- slice

• 배열과 문자열 모두에 사용되는 메소드

• 기존 배열이나 문자열의 일부분을 추출하여 새로운 배열이나 문자열로 반환

• 기존 배열이나 문자열을 변경하지 않는다.

 

• sllice(start,end) 

- start : 추출을 시작할 인덱스

- end : 추출을 끝낼 인덱스

 

 

- splice

• 배열에 사용되는 메소드

• 배열의 원소를 추가하거나 삭제하는 기능

 

 

• splice(start,deleteCount, item1, item2, ...)

- start: 요소를 추가하거나 삭제할 시작 인덱스

- deleteCount: 삭제할 요소의 개수

 


웹개발 도중 번아웃이 크게 찾아왔다.

if절에 else를 생략했는데

if절의 조건이 참이면 return 이 실행되어 함수가 종료한다.

즉 거짓인 경우에는 else 블록이 없더라도 if 절 이후의 코드가 계속 실행되며 함수가 reuturn 2를 실행하는 부분으로 이동하게 된다.

 


my_string.length보다 is_prefix.length가 크다면 애초에 성립이 안되니까 0을 반환

 

그게 아니라면

my_string의 첫번째 문자를 꺼내주는데

이 첫번째 문자가 prefix의 첫번째 문자랑 같으면 또 그 안의 if절로 하나의 조건도 더 만족시켜야한다.

 

처음의 if절을 만족시켰는데 두 번째 안의 if절을 만족못시켜도 아래 그림처럼 가로줄에 해당되어서 return값을 가지진 않는다. 그저 다시  else문안의 for문을 반복해준다. 그렇게 마지막에도 if절안의 if절을 만족시키지 못하면 return0을 가지게 되는 것이고 

만족하면 return 1을 가지게 된다.

추가로 반복문안의 return을 다시 공부해야겠다.

 


my_string을 대문자로 바꾸는걸 기준으로 

기존의 my_string과 대문자로만 만들어진 uppercaseString과의 문자 비교를 for문으로 돌리는 도중에 만약 서로 같다하면 

반대로 바꿔줘야하니 toLowercase를 써준건데 문법적으로 이상하다 .. (챗 gpt를 빌렸다.)

 

 


 

 

위의 코드가 잘못된 점은 발생한 문제는 while 루프 내부에서 피자 판의 수를 증가시키는 것입니다. 이미 Math.ceil(n / slicesPerPizza) 로 최소 판의 수를 구한 뒤, 그 값을 기준으로 while 루프를 돌려서 또다시 피자 판의 수를 증가시키는 것은 올바른 접근 방법이 아니다.

 

여기서는 if(totalSlices >= n && totalSlices % n ===0 )이 부분에서 부등호의 >이걸 왜 넣었는지 헷갈렸는데 직접 대입해보면

ex) > 의 경우

totalSlices가 12이고 n이 9라면 안나눠떨어져서 다시 18/9하면 2로 나눠떨어지니까 pizza가 3개 필요하다.

 

 

 

 

 

'프로그래머스' 카테고리의 다른 글

자바스크립트 프로그래머스  (0) 2023.06.27
프로그래머스 2차원으로 만들기  (0) 2023.06.05
프로그래머스 개미군단  (0) 2023.06.01
프로그래머스  (0) 2023.05.30
코테  (0) 2023.04.10