TIL 05-31(スタックとキュー符号化の問題)

9279 ワード

1.右かっこ


問題の説明

괄호가 바르게 짝지어졌다는 것은 '(' 문자로 열렸으면 반드시 짝지어서 ')' 문자로 닫혀야 한다는 뜻입니다. 예를 들어

"()()" 또는 "(())()" 는 올바른 괄호입니다.
")()(" 또는 "(()(" 는 올바르지 않은 괄호입니다.
'(' 또는 ')' 로만 이루어진 문자열 s가 주어졌을 때, 문자열 s가 올바른 괄호이면 true를 return 하고, 올바르지 않은 괄호이면 false를 return 하는 solution 함수를 완성해 주세요.

제한사항
문자열 s의 길이 : 100,000 이하의 자연수
문자열 s는 '(' 또는 ')' 로만 이루어져 있습니다.

입출력 예
s	answer
"()()"	true
"(())()"true
")()("	false
"(()("	false

に答える


  • かっこはペアで、「(ある場合)」が存在する必要があります.

  • 一時配列を作成する(stackの概念として使用される)

  • sをチェックすると、要素が「(」の場合は値をプッシュし、「)」の場合は値をポップアップします.

  • もしこの時「popの要素がなかったら?残りの半分はありません=>false

  • sをチェックした後に配列に値があるとしたら?残りの半分しか残っていません=>false
    残りの価格がなかったら?正しいかっこ=>true
  • function solution(s){
        //array를 하나 정의
        let array = [];
        //앞 괄호가 있는 경우에는 array에 특정 값을 푸쉬
        for (let el of s){
            if(el === "("){
                array.push(el)
                }
            //만약 뒤 괄호가 있는 경우에는 두가지로 분기
            else if(el === ")"){
            //array가 0이다? 짝이 없다 = false
                if(array.length === 0){
                    return false;
                }else{
            //일단 짝이 있는 것 같으니 "(" 제거
                    array.pop();
                }
            }
        }
    return array.length === 0;
        
    }

    2.機能開発


    問題の説明

    프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.
    
    또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.
    
    먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 
    각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.
    
    제한 사항
    작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
    작업 진도는 100 미만의 자연수입니다.
    작업 속도는 100 이하의 자연수입니다.
    배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 
    예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.
    입출력 예
    progresses	                    speeds	         return
    [93, 30, 55]	                   [1, 30, 5]	         [2, 1]
    [95, 90, 99, 99, 80, 99]	[1, 1, 1, 1, 1, 1]	[1, 3, 2]

    に答える


  • resultは配列を生成します.

  • 進捗と速度を別々に増やします.
    しかしprogressの要素が100の場合、追加は停止します.

  • 加算が完了すると、進捗の最初の要素が100に達すると、進捗と速度の最初の要素が変わります.
    次の要素も100になったら?同様に削除します.
    最初の要素が100でないまで繰り返します
    この場合、count(デフォルトは0)を作成し、削除した要素に基づいて1を追加します.

  • 3のプロセスが終了したら、countを結果にプッシュします.

  • 2のプロセスをprogressの長さ0に繰り返します.

  • progressの長さが0の場合、resultが返されます.
  • function solution(progresses, speeds) {
      //result를 하나 만들어준다. result는 배열
        let result = [];
      //progresses의 값들에 speeds의 값들을 더해줄 것이다.
        while(progresses.length !==0){
            for(let i = 0 ; i<progresses.length ; i++){
                if(progresses[i]<100){
                     progresses[i] = progresses[i] + speeds[i]
                }   
            }
      //다 더하고 나서 progress의 첫번째 값이 100이 되었을때는 빼주면서
            let func = 0;
            while(progresses[0]>=100){
                progresses.shift()
                speeds.shift()
                func++
            }
      //result에 progresses에서 빼준 갯수를 push
            if(func !==0)result.push(func)
        }
        //progresses가 0이 되었을때 result를 return;
        return result;
       
    }