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

김선우·2024년 10월 7일
post-thumbnail

알고리즘 문제 풀기

둘만의 암호

문제 설명

두 문자열 s와 skip, 그리고 자연수 index가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.

문자열 s의 각 알파벳을 index만큼 뒤의 알파벳으로 바꿔줍니다.
index만큼의 뒤의 알파벳이 z를 넘어갈 경우 다시 a로 돌아갑니다.
skip에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 s = "aukks", skip = "wbqd", index = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 'b'와 'd'는 skip에 포함되므로 세지 않습니다. 따라서 'b', 'd'를 제외하고 'a'에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 'h'가 됩니다. 나머지 "ukks" 또한 위 규칙대로 바꾸면 "appy"가 되며 결과는 "happy"가 됩니다.

두 문자열 s와 skip, 그리고 자연수 index가 매개변수로 주어질 때 위 규칙대로 s를 변환한 결과를 return하도록 solution 함수를 완성해주세요.

제한사항

5 ≤ s의 길이 ≤ 50
1 ≤ skip의 길이 ≤ 10
s와 skip은 알파벳 소문자로만 이루어져 있습니다.
skip에 포함되는 알파벳은 s에 포함되지 않습니다.
1 ≤ index ≤ 20

풀이 코드

function solution(s, skip, index) {
    const alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
    "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
    "u", "v", "w", "x", "y", "z"].filter(c => !skip.includes(c));

    var answer = s.split("")
    .map((a) => alphabet[(alphabet.indexOf(a) + index) % alphabet.length])
    .join("");;
    
    return answer;
}

풀이 과정

alphabet 배열 생성 후 filter 함수를 사용해서 skip문자를 제거한 배열을 반환 받고 map 함수를 사용해 현재 알파벳 + index에 위치한 값을 반환한다.

filter()

배열의 요소를 순회하면서 콜백 함수를 사용해 원하는 조건에 따라 필터링하는 함수
=> 위 문제의 경우 skip에 포함되어있는 값을 제외하고 반환.

아키텍처 패턴 (Architecture Pattern)

소프트웨어의 구조를 구성하기위한 가장 기본적인 토대를 제시.

  • 각각의 시스템들과 그 역할이 정의되어 있고, 여러 시스템 사이 관계와 규칙등이 포함되있음.
  • 검증된 구조로 개발을 진행하므로 안정적인 개발 가능.
  • 복잡한 도메인 문제를 해결할때 사용시 모델이나 코드를 더 쉽게 변경할 수 있는 측면에서 큰 이익을 볼 수 있음.

대표적인 아키텍처 패턴

MVC 패턴(Model View Controller Pattern)

  • 사용자 인터페이스(UI)가 필요한 어플리케이션에서 많이 사용되는 패턴
  • 모델(Model): 데이터와 비즈니스 로직을 담당
  • 뷰(View): 사용자 인터페이스(UI)를 담당
  • 컨트롤러(Controller): 클라이언트의 요청을 모델과 뷰로 전달해주는 역할을 담당

계층형 아키텍처 패턴(Layered Architecture Pattern)

  • 시스템의 서로 다른 기능을 여러 계층(Layer)으로 분할하는 패턴
  • 일반적으로 컨트롤러(Controller), 서비스(Service), 저장소(Repository) 계층으로 분리됨

클린 아키텍처 패턴(Clean Architecture)

  • 소프트웨어를 내부 도메인으로 향하는 의존성을 가지는 여러 계층으로 분리하는 패턴
  • 클라이언트의 요청 처리, 데이터베이스 조작, 외부 시스템과의 통신은 외부 계층에서 처리
  • 소프트웨어의 유지보수성과 확장성을 향상시키는 것이 주요 목표

마이크로 서비스 아키텍처 패턴(Microservices Architecture Pattern)

  • 시스템을 작고, 독립적으로 배포 가능한 서비스로 분할하는 패턴
  • 하나의 시스템에서 다양한 언어와 프레임워크를 도입할 수 있는 패턴
  • 서비스 간의 통신은 API 또는 이벤트 기반 아키텍처(EDA, Event Driven Architecture)를 통해 통신함.

아키텍처 패턴을 도입하기 전에 생각해야 할 것

  • 아키텍처 패턴이 주는 이점과 비용에 대한 확실한 이유
  • 해당 아키텍처 패턴을 채택시 얻을 수 있는 장단점을 명확하게 인지
  • 여러 계층 추가를 위해 들이는 노력과 시간을 투자할 만한 가치가 있을정도로 어플리케이션과 도메인이 복잡한 경우에만 도입
    => 가벼운 어플리케이션에 복잡한 아키텍처 패턴을 도입하는건 의미 없는 코스트가 소모될 수 있음.

계층형 아키텍처 패턴(Layered Architecture Pattern)

시스템을 여러 계층으로 분리하여 관리하는 아키텍처 패턴.

  • 사실상 표준 아키텍처 - 단순하고 대중적이고 비용이 적게듬. => 어떤 아키텍처 패턴을 써야할 지 모르겠을 때 무난하게 선택할만함.
  • 각 계층을 명확히 분리해서 유지하고 각 계층이 자신의 바로 아래 계층에만 의존하게 만드는 것

계층화

핵심 : 각 계층이 높은 응집도를 가지면서, 다른 계층과는 결합되를 최소화 하는 것. => 상위 계층은 하위 계층을 사용 가능하지만 하위 계층은 자신이 어떤 상위 계층에 속하는지 알 필요없이 독립적으로 동작해야함.

장점

  • 관심사를 분리해서 구현하려는 코드를 명확하게 인지 가능
  • 각 계층이 서로 독립적이고 의존성이 낮아 모듈 교체시 코드 수정이 용이
  • 계층별로 단위 테스트를 작성할 수 있으 테스트 코드를 조금 더 용이하게 구성가능

3계층 아키텍처 (3-Layered Architecture)

구성

  1. 컨트롤러(Controller) : 어플리케이션의 가장 바깥 부분으로 요청/응답을 처리함.
    => 클라이언트의 요청을 수신 후 서버에서 처리된 결과를 반환

      - 클라이언트에게 요청을 받음.
      - 요청에 대한 처리를 서비스에게 위임.
      - 클라이언트에게 응답을 반환





  2. 서비스(Service) : 어플리케이션의 중간 부분으로 API의 핵심적인 동작이 많이 일어남.
    => 비즈니스 로직이 수행되는 부분.

      - 사용자의 요구사항을 처리 => 현업에서는 서비스    코드가 계속 확장되는 문제가 발생할 수 있음.
      - DB정보 필요시 저장소에 요청.

  3. 저장소(Repository) : 어플리케이션의 가장 안쪽 부분으로 데이터베이스와 맞닿아 있음.
    => 데이터베이스와 통신

      - 데이터베이스 관리(연결, 해제, 자원관리) 역할을     담당.
      - 데이터베이스의 CRUD 작업을 처리.

진행 과정(로직 수행 과정)

  1. 클라이언트가 어플리케이션에 요청을 보냄.
  2. 요청을 URL에 알맞은 컨트롤러가 수신받음.
  3. 컨트롤러가 요청을 처리하기 위해 서비스를 호출.
  4. 서비스가 필요한 데이터를 가져오기 위해 저장소에게 데이터를 요청.
  5. 서비스가 저장소에서 가져온 데이터를 가공해서 컨트롤러에게 데이터를 전달.
  6. 컨트롤러가 서비스의 결과물을 클라이언트에게 전달.

0개의 댓글