문제 설명

문제 링크

[프로그래머스[Level2] 큰 수 만들기]
(https://school.programmers.co.kr/learn/courses/30/lessons/42883)

접근 방법

  1. 매 순간 최적을 생각하는 그리디로 일정 범위 내에서 가장 큰 수를 찾기(테케10,시간 초과)

    for문을 0~numberOfDigits 필요한 범위만큼 설정
    안쪽의 for문에서는 k+i만큼 범위를 설정 (why?)
    startIndex의 변화로 현재 가장큰수 찾고 그 다음 인덱스를 시작 Index로 설정

  2. 최소한의 변수 선언으로 최적의 해 도출하기

    주어진 number 배열의 길이만큼 for문을 구성
    while문을 사용하여
    1)k>0 -> 주어진 k만큼 while문을 돌리며
    2)answer[answer.length-1] < number[i]

    -> answer 배열의 맨뒤 원소값을 현재 number[i]와 계속해서 비교하여
    number[i]보다 작은경우 빼주기 위해서 ex) 4 1 7 ...=> 4 7  => 7

    answer.join("")으로 배열형식을 String 형식으로 조절
    .slice(0,number.length-k) 는 ex) "666","44444",... 등 연속되는 숫자인 경우
    while문 루프를 돌지 않고 push만 하기 때문에 원하는 자릿수만큼 결과를 리턴하기 위함

    코드

function solution(number, k) {
    var answer = '';
    // return 받을 자리수 
    let numberOfDigits =  number.length - k ;
    let startIndex = 0;

    for(let i=0;i<numberOfDigits; ++i){
        let maxValue = -1;
        let maxIndex = 0;
        // 범위 설정 이유 :
         ex) "4177952841" ,k = 4 인 경우 원하는 자릿수 6으로
             4 1 7 7 9 | 5 2 8 4 1
                     ↑  
             앞쪽에서 k+1 범위 내에서 가장 큰 수 : 9 , index : k+1 나머지 5자리를 붙여서 만들어야 하기때문에
        for(let j=startIndex; j<=k+i;++j){
            if(maxValue<parseInt(number[j])){
                maxValue = number[j];
                maxIndex = j;
            }
        }
        startIndex = maxIndex+1; 
        answer+=maxValue
    }
    return answer;
}
// 테케 10 : 시간 초과
function solution(number, k) {
    var answer = [];
    for (let i=0;i<number.length;++i){
        while(k>0&&answer[answer.length-1]<number[i]){
            answer.pop();
            k--;
        }
        // answer : 1  number[1] = 9
        // answer : (1) 9  number[2] = 2
        // answer : (1) 9 2 number[3] = 4
        // answer : (1) 9 (2) 4
        answer.push(number[i]);
    }
    // ex) 똑같은 수 나올 경우 "333" while 문에 들어가지 않고 "333"을 전부 return 하게 되기 때문에 원하는 문자열 만큼을 리턴하게 만들어줌 
    return answer.join("").slice(0,number.length-k);
}

문제 설명

문제 링크

[프로그래머스[Level1] 크기가 작은 부분 문자열]
(https://school.programmers.co.kr/learn/courses/30/lessons/147355)

접근 방법

  1. t의 문자열을 index 0 부터 p.length만큼 잘라주기
  2. p.length만큼 자른 뒤에 pick라는 변수를 주고 한칸씩 이동하면서 다시 1의 과정을 반복
  3. parseInt를 통해 정수로 바꿔줘 비교한 뒤 조건에 적합하면 answer++

    코드

function solution(t, p) {
    var answer = 0;
    let pick = 0;

    while(pick+p.length!=t.length+1){
        if(parseInt(t.slice(pick,pick+(p.length))) <=parseInt(p)) answer++;
        pick++;
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level1] 가장 가까운 같은 글자]
(https://school.programmers.co.kr/learn/courses/30/lessons/142086)

접근 방법

  1. 일단 기준을 잡은 상태에서 기준만큼 검사해주는 방식을 선택함
  2. 앞서 나온 것이 없다면 1번 반복

    코드

function solution(s) {
    var answer = [];
    let i=0;
    //visited를 따로 설정해 준 이유는 
    //ex) "banana" 처럼 a가 3개인 경우 먼거리에 있는 것도 answer에 push하기 때문에
    let visited = []; // 방문 여부 판단
    while(i!=s.length){
        let standard = s[i];
        let istrue = false;
        for(j=0;j<i;++j){
            if(standard===s[j]&&!visited[j]){
                answer.push(i-j);
                visited[j]= true;
                istrue = true;
            }
        }
        if(istrue===false) answer.push(-1);
        i++;
    }
    return answer;
}

문제 설명

문제 링크

[프로그래머스[Level2] 기능개발]
(https://school.programmers.co.kr/learn/courses/30/lessons/42586)

접근 방법

  1. success 배열을 만들어 배포가 이루어지는 일수 저장해주기 => success배열을 탐색하며 기준잡은 success[standard]보다 큰수가 나오기 전까지 cnt값을 ++해줘 기준보다 큰 수가 나올경우 answer에 푸시하기

    코드

function solution(progresses, speeds) {
    var answer = [];
    let cnt =1; //cnt는 앞 뒤 원소 비교후 앞의 원소가 다음으로 오는 원소보다 작을 때까지 ++ 
    let success = []; // success에 (100-progresses)/speeds = ?(일간 작업 후 배포가 가능한지에 대한 저장소)
    for(let i = 0,standard = 0;i<progresses.length;++i){
        success[i]= Math.ceil((100-progresses[i])/speeds[i]);
        if(success[standard]>=success[i]&& i!==0) cnt++; //i!==0 을 해준 이유는 0번째 원소가 기준되어 시작하기 때문에
        else if(success[standard]<success[i]&&i!==0){
            standard = i; //standard를 i번째 인덱스로 바꿔주고
            answer.push(cnt); //그동안 count 된 값 : cnt 를 answer에 push해주기
            cnt = 1; // 다시 같은 것을 반복해주기 위해 1로 초기화
        }
    }
    answer.push(cnt);
    return answer;
}

문제 설명

문제 링크

프로그래머스(Level1) 숫자 문자열과 영단어

접근 방법

  1. 0,1,2,3,... 각각 숫자를 영단어로 바꾸기

-> numbers 배열을 만들어 ["zero","one","two"...,"nine"]을 넣어줍니다.

  1. for문을 루프를 돌며 문자열 s에서 영단어로 되어 있는 numbers배열 탐색 후 split을 수행하고 join을 통해 문자열 s에서 split이 수행되어진 부분을 연결해줍니다.

  2. (1),(2) 과정을 수행한 후 주어진 문자열을 숫자로 return 해줍니다.

코드

function solution(s) {
    // numbers 라는 배열을 만들어 숫자에 해당하는 영단어 배열을 만들어 줍니다.
    const numbers = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"];
    for(let i=0;i<numbers.length;++i){
        //문자열 s에서 영단어로 되어 있는 numbers 배열 탐색 후 split 수행합니다.
        let arr = s.split(numbers[i]); 
        //join 을 통해 split되어진 문자열 s를 i를 넣어주고 연결해줍니다.
        s = arr.join(i);
    }
    // 형변환을 통해 숫자로 return 합니다.
    return Number(s);
}

HTTP의 특성

무상태 프로토콜 (Stateless)

🗣 HTTP에서 서버가 클라이언트의 상태를 보존하지 않는다.

  • 장점
    - 서버확장성이 높다
    - 무상태 응답 서버를 쉽게 바꿀 수 있기 때문에 무한한 서버 확장 가능
  • 단점
    - Client가 추가 Data를 전송해야함.

무상태의한계

🚫 로그인과 같이 유저의 상태를 유지해야하는 서비스 (쿠키, 세션, 토큰) 을 이용해 상태를 유지해야 한다.

비연결성 (Connectionless)

🗣 비연결성을 가지는 HTTP에서는 실제로 요청을 주고 받을 때만 연결을 유지하고 응답을 주고 나면 TCP/IP와의 연결을 끊는다.

  • 장점
    - 트래픽이 많지 않고, 빠른 응답을 제공할 수 있는 경우 효율적임.
  • 단점
    - 트래픽이 많고, 큰 규모의 서비스를 운영할 때 비연결성의 한계를 보임.

비연결성의 한계

🚫 (HTTP 1.0) TCP/IP 연결을 새로 맺어야하므로 3-way-handshake 시간이 추가됨 (오버 헤드 발생)

  • 한계 해결
    - HTTP1.1 에서 HTTP 지속 연결(Persistant Connections)이 가능해짐 → 연결이 이루어지고 난 뒤 각각의 자원들을 요청하고, 모든 자원에 대한 응답이 돌아온 후에 연결을 종료합니다.
  • 단점
    - 매번 새로운 연결을 시도/해제의 과정을 거쳐야하므로 오버 헤드가 발생함.
  • 한계 해결
    - KeepAlive : 이에 대한 또다른 해결책으로 오버헤드를 줄이기 위해 HTTP의 keepalive 속성을 사용.

'CS(Computer science)' 카테고리의 다른 글

[CS]HTTP 와 HTTPS의 차이는 무엇일까?  (0) 2024.02.26

+ Recent posts