내일배움캠프 Node.js 본캠프 34일차

김선우·2024년 9월 25일
post-thumbnail

알고리즘 문제 풀어보기

기사단원의 무기

문제 설명

숫자나라 기사단의 각 기사에게는 1번부터 number까지 번호가 지정되어 있습니다. 기사들은 무기점에서 무기를 구매하려고 합니다.

각 기사는 자신의 기사 번호의 약수 개수에 해당하는 공격력을 가진 무기를 구매하려 합니다. 단, 이웃나라와의 협약에 의해 공격력의 제한수치를 정하고, 제한수치보다 큰 공격력을 가진 무기를 구매해야 하는 기사는 협약기관에서 정한 공격력을 가지는 무기를 구매해야 합니다.

예를 들어, 15번으로 지정된 기사단원은 15의 약수가 1, 3, 5, 15로 4개 이므로, 공격력이 4인 무기를 구매합니다. 만약, 이웃나라와의 협약으로 정해진 공격력의 제한수치가 3이고 제한수치를 초과한 기사가 사용할 무기의 공격력이 2라면, 15번으로 지정된 기사단원은 무기점에서 공격력이 2인 무기를 구매합니다. 무기를 만들 때, 무기의 공격력 1당 1kg의 철이 필요합니다. 그래서 무기점에서 무기를 모두 만들기 위해 필요한 철의 무게를 미리 계산하려 합니다.

기사단원의 수를 나타내는 정수 number와 이웃나라와 협약으로 정해진 공격력의 제한수치를 나타내는 정수 limit와 제한수치를 초과한 기사가 사용할 무기의 공격력을 나타내는 정수 power가 주어졌을 때, 무기점의 주인이 무기를 모두 만들기 위해 필요한 철의 무게를 return 하는 solution 함수를 완성하시오.

제한사항

1 ≤ number ≤ 100,000
2 ≤ limit ≤ 100
1 ≤ power ≤ limit

풀이 코드

function solution(number, limit, power) {
    var answer = 0;
  
    for (i = 1; i <= number; i++) {
      var count = 0;
      for (j = 1; j * j <= i; j++) {
        if (i % j === 0) {
          count++;
          if (j !== i / j) {
            count++;
          }
        }
      }
      if (count > limit) {
        count = power;
      }
      answer += count;
    }
    return answer;
  }

풀이 과정

주어진 수의 제곱근까지 반복해서 약수를 찾고, 해당수가 i로 나누어 떨어지면 약수이므로 약수를 찾을 때마다 약수 쌍의 수를 증가시켜줌. 만약 약수가 제곱근과 같지 않으면 해당 약수 반대편 약수도 존재하므로 쌍의 수를 추가로 증가시키고, 약수의 갯수를 더하고 설정 공격력보다 높으면 낮춰준다.

팀 프로젝트 KPT 회고

첫 팀 프로젝트떄보다는 실력이 늘었을 수 있지만 여전히 많이 부족했다. 그래도 공부하고, 구글링하면서 내가 맡은 회원가입, 로그인, 계정조회, 캐시구매에 대한 부분을 제대로 풀어보려고 노력했고 구현이 가능하게 풀어낸것에서 만족할 수 있었다.(Keep) 하지만 프로젝트를 구현한다고 강의를 제대로 보지 않고 필요한 부분에서만 보면서 사용하다 보니 제대로 이해하지는 못했고, 내가 강의를 더 빨리 제대로 이해할 수 있었다면 같이 프로젝트를 진행하는 팀원들에게 민폐를 끼치지 않고 도전 구현도 더 진행할 수 있었을 것 같다는 생각이 들었다.(Problem) 이 때문에 복습을 통해 강의를 확실히 이해하고, 내 집중력을 높혀 학습시간을 늘린다면 위의 문제를 해결하고 다음 프로젝트에서도 발전할 수 있을 것 같다고 생각했다(Try)

웹소켓 맛보기

웹소켓(WebSocket)

  • 클라이언트와 서버 간의 양방향 통신을 위한 프로토콜.
  • 기존의 HTTP 통신 방식과는 달리, 연결이 한번 성립되면 실시간으로 양쪽에서 데이터를 자유롭게 주고받을 수 있음.

HTTP

클라이언트가 서버에 요청을 보내고, 서버가 요청에 대한 응답을 보내는 구조.
=> 클라이언트가 요청하지 않으면 서버에서 데이터를 전송할 방법이 없음.(단방향 통신)

웹소켓

클라이언트와 서버 간의 지속적인 연결을 유지해 양방향으로 데이터를 자유롭게 교환 가능.
=> 클라이언트가 요청하지 않아도 서버에서 데이터를 푸시할 수 있엇 매우 빠른 실시간 통신 가능.

장점

  • 양방향 통신 : 클라이언트와 서버 간에 언제든 데이터를 주고받을 수 있음.
  • 낮은 오버헤드 : HTTP와 달리 요청-응답을 반복하지 않기 때문에 네트워크 자원을 덜 소모.
  • 실시간 데이터 교환 : 주식 차트, 온라인 게임, 실시간 채팅등에서 매우 유용.
  • 유지되는 연결 : 연결이 지속되므로 데이터 전송 속도가 빠르고 연결에 대한 부담 적음.

동작 방식

  • 핸드셰이크 : HTTP 요청을 통해 서버에 연결을 요청하고 서버가 승인하면 HTTP연결을 웹소켓 연결로 전환.
  • 연결 유지 : 연결이 성립되면 클라이언트와 서버는 지속적인 연결을 통해 데이터 교환 가능.
  • 양방향 데이터 전송 : 클라이언트나 서버가 언제든 데이터를 보낼 수 있음.(이벤트 기반으로 이루어짐.)
  • 연결 종료 : 더이상 통신할 필요가 없을 때 연결 종료 가능.(양쪽에서 끊을 수 있음.)

웹소켓 vs HTTP

특징HTTPWebSocket
통신 방식클라이언트 -> 서버 (단방향)클라이언트 <-> 서버 (양방향)
연결 지속성요청 후 연결 종료연결 유지
데이터 전송 방식요청-응답 패턴자유로운 데이터 송수신

0개의 댓글