코드카타 풀이 및 js 공부

김민재·2024년 8월 20일
0
post-thumbnail

코드카타 풀이

문자열 나누기
1.문자열의 첫글자를 읽고 이를 x로 칭한다.
2.이후 왼쪽에서 오른쪽으로 읽어가면서 x와 x가 아닌 다른 글자들이 나온 횟수를 각각세서(x가 나온 수 / x가 아닌게 나온 수) 두 횟수가 같아지는 순간 멈추고, 지금까지 읽은 문자열을 분리한다.
3.분리한 문자열을 제외하고 남은 부분이 없다면 종료 / 두 횟수가 서로 다른데 더이상 읽을 글자가 없다면 문자열을 분리하고 종료.

=> 이때 문자열을 분리한 횟수를 구하시오.

풀이
문자열에서 처음 값을 가져올 때 indexOf나 slice 등으로 가져올수는 있겠지만 각각의 문자가 같은지 아닌지를 비교해야될때 split으로 배열 형태로 분리하여 처리를 하는게 좋다고 생각을 했다.
그리고 처음에 해당하는 문자(x)를 따로 저장하는 변수(first_save)와 x가 나올때마다 올라갈 횟수(count1) / x가 나오지 않을때마다 올라갈 횟수(count2)를 분리하여 선언하였다.

그리고 이렇게 값을 정했다면,
for문을 반복하는데 이때 처음 문자를 받는 곳이 비어있을 경우에는 값을 추가하고 그렇지 않을 경우엔 save의 값과 비교하여 count들을 올리게끔 한 후
이 count들이 서로 동일할 때 문자열을 분리하였다는 뜻으로 answer을 증가시켜주는 것으로 처리를 하였다.

그리고 만약 마지막에 count1이 count2와 같지 않고 i의 값이 save의 마지막일 경우엔 answer을 증가시켜주었다.

Q.만약 문자열을 직접 구해야한다고했다면?
문자열을 저장할 변수를 따로 선언한 후에 let save_copy = '';
if(first_save.length === 0)의 else{전 내용
save_copy += save[i];
}
방식으로 처리하게되면 된다.

js 공부

도전 문제 풀이

1.최대공약수 구하기 - a,b의 최대공약수를 구하시오.
(1)a와 b중 큰 수를 구별한다.
(2)a와 b 중에서 작은 값들을 2부터 순서대로 세며 공통으로 나누어 떨어지는 값을 저장한다.(1은 모든 값의 공약수가 될 수 있으므로 무시)

2.짝수와 홀수의 갯수 세기
(1)짝수와 홀수를 가진 배열을 생성한 후
(2)생성된 배열을 나머지 연산자를 이용하여 짝수인지 홀수인지 구분한다.
(3)구분한 값들을 배열에 값을 저장

3.문자열이 주어지면 해당 문자열을 역순으로 배치한후, 알파벳을 하나씩 오른쪽으로 이동시킨 결과를 출력하라.
(1)문자열을 배열로 분리하여 각 문자의 값을 얻을 수 있게끔 한다.
(2)얻은 문자를 charCodeAt()함수를 이용하여 아스키 코드값을 비교하여 z,Z인지를 확인한다.
(2-1)끝일 경우엔 해당값에 -25를 하여 a,A로 바꿔준후 저장하고
(2-2)끝이 아닐경우엔 해당 값을 오른쪽으로 이동시켜(+1) 저장한다.
(3)이렇게 바꾼 배열을 역순으로 정리하고
(4)join함수를 이용하여 배열을 문자열로 변환시켜준다.

4.회전 초잡을 먹을때, 접시의 번호가 주어지고 이중 임의로 연속된 접시를 선택하여 먹을때 모든 선택에서 가장 다양한 초밥 종류의 갯수를 구하라.
(1)초밥 배열을 가진 변수를 선언
(2)만약 하나의 초밥을 골랐을때 초밥 배열안에 고른 초밥과 동일한 번호를 가진 초밥들이 남아있다면 그 초밥들을 무시하고 하나로만 배열을 생성한다.
(3)생성한 배열의 길이를 구하여 가장 다양한 초밥 종류의 갯수를 구한다.

5.양의 정수가 주어질 때, 숫자에서 k개의 자릿수를 제거하여 얻을 수 있는 가장 큰수를 구하라.
(1)양의 정수와 자릿수를 나타내는 number과 k 변수를 선언하고 최댓값을 처리해줄 max변수를 선언한다.
(2)해당 숫자를 문자열로 변환하여 배열에다가 저장한다.
(3)이후 중첩for문을 이용하여 배열내의 값들을 순회하며 값들을 조합한다.
(4)조합한 값들을 숫자로 변환한후 max와 비교하여 클경우 max에 저장하는 식으로 최댓값을 뽑아낸다.

6.주어진 문자열에서 중복된 문자를 제거하고 남은 문자들을 원래 순서대로 반환하는 함수를 작성하라.
(1)주어진 문자열을 저장하는 변수 save를 선언하고 이를 배열로 분리한다.
(2)분리한 배열들을 위의 4번문제에서 사용했던 filter와 indexOf를 통해 해당하는 문자의 '첫번째'만 뽑아내도록 한다.

7.주어진 배열에서 최솟값,최댓값을 찾고 [최솟값,최댓값] 형태의 배열로 반환하는 함수를 작성하라.
(1)주어진 배열을 저장하는 변수 save와 최댓값과 최솟값을 저장할 max와 min 변수를 선언한다. => 이때 max에는 들어갈 수 있는 가장 작은 값인 -1000과 min에는 들어갈 수 있는 가장 큰 값인 1000을 넣는다.(그래야지만 최대,최솟값을 비교할 수 있기 때문이다.)
(2)for문을 반복하여 배열을 순회하면서 최대,최솟값을 찾아서 저장한다.
(3)answer에 [최솟값,최댓값] 형태로 저장하여 log를 찍는다.

8.주어진 문자열을 요약하는 함수를 작성하라.
str = ‘aaabbbc’ // 출력: ‘a3/b3/c1’
str = ‘ahhhhz’ // 출력: ‘a1/h4/z1’

(1)문자열을 저장할 변수(str)와 결과를 넣을 객체변수(str_copy)를 선언하고, 해당 문자열을 배열로 분리한다.
(2)for문을 반복하여 만약 결과를 넣을 객체변수의 길이가 0이라면 처음엔 값을 넣어준다.(이때, key값에는 문자가 value에는 이 문자가 몇개 담겨있는지를 새려줄 숫자값인 1을 넣게된다.)
(3)만약 객체변수의 길이가 0이 아니라면(즉 객체에 값이 담겨있을 경우엔) for~in문을 이용하여 해당 객체를 순회하며 만약 key값에 현재 배열과 동일한 값이 있을 경우에 해당 배열의 value의 값을 증가시켜 값을 저장한다.
(4)이후에 해당 객체를 Object.entries함수를 이용하여 배열로 바꾸는데 이때 객체 내부에 있는 값들을 문자열 변환 함수인 join 연산을 통해서 한번더 묶고 난 후 한번 더 join을 통해서 원하고자하는 출력을 얻어낸다.

9.주어진 배열에서 두 수를 선택하여 그 합이 주어진 target값과 일치하는지를 확인하는 함수를 작성하라.
일치하는 경우엔 true, 아닐경우엔 false를 반환.
(1)주어진 배열과 target값을 변수로 선언하고 이를 확인할 check 변수를 따로 선언한다.
(2)이후 중첩 for문을 통하여 해당 배열들의 값을 조합하고 이 조합들의 값들 중 하나라도 target과 동일할 경우 true를 반환한다.

10.주어진 문자열이 유효한 괄호 조합인지 확인하는 함수를 작성하세요. 유효한 조합은 모든 여는 괄호가 올바르게 닫혀야 하며, 괄호의 순서도 일치해야 합니다.
(1)주어진 문자열을 저장할 변수 Q와 이를 확인할 check변수 그리고 Q를 객체로써 저장할 save변수와 save를 활용할 stack변수를 만들어준다.
(2)save에 해당 문자와 그 문자가 속한 순서를 key와 value 값으로 저장하고 이를 배열로 바꾸어 2차 배열을 만든다.
(3)for문을 활용하여
(3-1)먼저 시작하는 문자열들이 왔다면 이를 stack에 저장한다.
(3-2)이후에 끝을 내는 문자들이 왔다면 스텍을 for문을 통하여 찾아보고 그 문자와 매칭되는 문자가 먼저 들어와있다면 stack에서 매칭되는 문자를 제거하는 방식인데,
여기서 ( 와 )는 아스키 코드값으로 40과 41이지만,
나머지 [ 와 ] 그리고 { 와 }은 각각 앞에 오는 문자들의 아스키 코드값에 +2를 하게되면 뒤에 오는 문자들의 아스키 코드값과 일치하게된다.
그렇기에 ()만 따로 처리를 하고 나머지 값들은 아스키 코드값으로 처리함으로써 코드가 길어지는걸 줄어보려고 노력했다.
(4)마지막으로 stack이 비어있으면 check를 true로 아니면 false 그대로 두는 방식으로 결론을 냈다.


여기서 count 함수는 디버깅용으로써 제대로 스텍에서 뽑았는지를 확인해주는 변수이다.

profile
ㅇㅇ

0개의 댓글