[TIL] 알고리즘 문제풀이 23.06.13

이상훈·2023년 6월 14일
0

[내일배움캠프]

목록 보기
25/68
post-thumbnail

배열 만들기4

정수 배열 arr가 주어집니다. arr를 이용해 새로운 배열 stk를 만드려고 합니다.
변수 i를 만들어 초기값을 0으로 설정한 후 i가 arr의 길이보다 작으면 다음 작업을 반복합니다.
만약 stk가 빈 배열이라면 arr[i]를 stk에 추가하고 i에 1을 더합니다.
stk에 원소가 있고, stk의 마지막 원소가 arr[i]보다 작으면 arr[i]를 stk의 뒤에 추가하고 i에 1을 더합니다.
stk에 원소가 있는데 stk의 마지막 원소가 arr[i]보다 크거나 같으면 stk의 마지막 원소를 stk에서 제거합니다.
위 작업을 마친 후 만들어진 stk를 return 하는 solution 함수를 완성해 주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/181918#

  • 반복문을 먼저 돌리고
  • 조건을 만족하면 pop을하여 마지막원소를 제거하거나 push하는 방법으로 접근

나의 문제풀이

    let i = 0
    while(i < arr.length) {
        if (arr[i] <= stk[stk.length-1] || 0) {
            stk.pop()
        } else if (arr[i] >= stk[stk.length-1] || 0) {
            stk.push(arr[i])
            i++
        }
     }

stk[stk.length-1] || 0에 true/false 값이 정상적으로 들어오고 접근방법은 맞는 것 같은데 무한루프가 걸려서 해결이 안됐다. 그래서 일단 for문으로 바꿔서 작성해보니 문제는 해결됐다.

    for(let i = 0; i < arr.length;) {
        if (arr[i] <= stk[stk.length-1]) {
            stk.pop()
        } else if (arr[i] > stk[stk.length-1] || []) {
            stk.push(arr[i])
            i++
        }
    } 

문제 해결 후 찾아보니, 관계연산자와 논리연산자를 함께사용하게 되면 관계연산자가 우선순위가 더 높기때문에 내가 작성한 코드에서 괄호를 따로 해주지 않으면 조건성립이 안되는 구조였다.
if (arr[i] <= (stk[stk.length-1] || 0)) 이렇게 괄호를 해주니 while로 작성한 코드도 문제 해결이 됐다.

문자 개수 세기
아스키코드를 처음 활용해보고 charCodeAt()을 처음 사용해봐서 기억에 남기기 위해 추가했다.

알파벳 대소문자로만 이루어진 문자열 my_string이 주어질 때, my_string에서 'A'의 개수, my_string에서 'B'의 개수,..., my_string에서 'Z'의 개수, my_string에서 'a'의 개수, my_string에서 'b'의 개수,..., my_string에서 'z'의 개수를 순서대로 담은 길이 52의 정수 배열을 return 하는 solution 함수를 작성해 주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/181902

  • 처음엔 정규형으로 A-Z,a-z를 찾는 방법으로 접근을 하려했다.
  • 뭔가 알파벳마다 번호가 있었던 것 같은 기억이 있어서 MDN을 찾아보니
  • 아스키코드라는게 있어 이를 활용하여 코드를 작성
  • 대문자(65~90), 소문자(97~122)

나의 문제풀이

function solution(my_string) {
    let answer = Array(52).fill(0);
    my_string.split("").forEach((e) => {
        if(e.charCodeAt() <= 90) {
            answer[e.charCodeAt() - 65]++;
        } else {
            answer[e.charCodeAt() - 71]++;
        }
    })
    return answer;
}

먼저 52개의 길이를 가진 배열을 0으로 채워 선언해주고, forEach문으로 반복문을 돌려
대소문자인지 구분 후에 answer에 직접 더해주는 방법으로 접근했다.

참고할만한 문제풀이

    let ans = Array(58).fill(0);
    for (let c of my_string) ans[c.charCodeAt()-65]++;
    ans.splice(26,6);
    return ans
profile
코린이

0개의 댓글