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

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

알고리즘 문제 풀어보기

숫자 짝꿍

문제 설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다.

예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.)
두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항

3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
X, Y는 0으로 시작하지 않습니다.
X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

풀이 코드

function solution(X, Y) {
    var answer = ''
    X = X.split("")
    Y = Y.split("")
    for(i = 0 ; i < 10 ; i ++) {
        const curX = X.filter(a => Number(a) === i).length
        const curY = Y.filter(a => Number(a) === i).length
        answer+=String(i).repeat(Math.min(curX, curY))
    }
    if(answer === '') return "-1"
    if(Number(answer) === 0) return "0"
    return answer.split("").sort((a,b) => Number(b)-Number(a)).join("")
}

풀이 과정

입력 받은 문자 X와 Y를 ""로 나누어 배열로 변환 후 0~9까지 반복하는 반복문을 만듦. => X와 Y에서 반복문의 i값과 일치하는 문자가 몇개인지 카운트해서 curX와 curY에 저장. => i를 문자열로 변환 후 curX와 curY중 최솟값만큼 반복해 answer에 추가. => 반복문 종료 후 answer이 비었으면 -1 return, answer을 숫자로 변환했을때 0 이면 0 return. => 둘다아니면 answer을 숫자로 변환해 내림차순으로 변경하고 다시 문자로 변환해서 return.

객체지향 프로그래밍

객체

현실 세계의 물체나 개념을 소프트웨어 세계로 옮긴 것. 여러 속성과 행동(메서드)로 구성.
서로 메서드 호출을 통해 메시지를 주고 받아 협력.

객체 지향

소프트웨어 개발에서 주요 구성 요소를 기능이 아닌 객체로 삼으며 어떤 객체가 어떤 일을 할 것 인가에 초점을 맞춤.
=> 객체를 도출, 각각의 역할을 정확히 정의하는 것에 초점을 두는 방법론.
복잡한 시스템도 효과적으로 분해및 구성 가능 / 개발자가 손쉽게 이해하고 효율적으로 관리 가능.

객체지향 프로그래밍

상태와 그 데이터를 조작하는 프로세스가 같은 모듈 내부에 배치되는 프로그래밍 방식.

핵심 원칙

캡슐화(Encapsulation)

객체 내부의 세부적인 사항을 감추는 것, 중요한 정보를 외부로 노출시키지 않게 하는 것.
JS는 완벽한 캡슐화를 지원하지 않음.

상속(Inheritance)

하나의 클래스가 가진 특징(함수, 변수 및 데이터)을 다른 클래스가 그대로 물려받는 것.
=> 상위 클래스의 특징을 하위 클래스에서 물려받아 코드 중복을 제거하고 재사용성을 증대시킴.
개별 클래스 -> 상속관계 = 체계화된 구조를 쉽게 파악 가능.
상위 클래스의 데이터와 메서드를 변경하는 것으로 전체 코드에 대한 일관성 유지 가능.

추상화(Abstraction)

객체에서 공통된 부분을 모아 상위 개념으로 새롭게 정의하는 것.
=> 불필요한 세부사항을 생략, 중요한 특징을 강조해서 코드를 간결하고 관리하기 쉽게 만드는 것.(공통적인 특성을 명확하게 파악 가능)

다형성(Polymorphism)

하나의 객체가 다양한 형태로 동작하는 것.
=> 객체가 가진 특성에 따라 같을 기능이 다르게 재구성 되는 것.
역할(인터페이스)과 구현을 분리해줌. 오버라이딩을 통해 특정 서비스의 기능을 유연하게 변경하거나 확장할 수 있게함.

객체 지향 설계 5원칙(SOLID)

SOLID 원칙을 따르면 시간이 지나도 유지 보수와 확장이 쉬운 시스템을 구축 가능.

단일 책임의 원칙 (Single Responsibility Principle, SRP)

하나의 객체는 단 하나의 책임을 가져야 한다
=> 클래스나 모듈을 변경할 이유가 단 하나이어야함.

개방-폐쇄 원칙 (Open-Closed Principle, OCP)

소프트웨어 엔티티 또는 개체(클래스, 모듈, 함수 등)는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다.
=> 기존 코드에 영향을 주지 않고 소프트웨어에 새로운 기능이나 구성 요소를 추가할 수 있어야 함.

리스코프 치환 원칙 (Liskov substitution principle, LSP)

어플리케이션에서 객체는 프로그램의 동작에 영향을 주지 않으면서, 하위 타입의 객체로 바꿀 수 있어야 한다.
=> 만약 s가 t의 하위 유형이면 프로그램의 기능에 변화를 주지 않고서 t타입의 객체를 s 객체로 대체할 수 있어야 함.

인터페이스 분리 원칙 (Interface segregation principle, ISP)

특정 클라이언트를 위한 인터페이스(문법) 여러 개가 범용 인터페이스 하나보다 낫다.
=> 사용자가 필요하지 않은 것들에 의존하지 않도록 인터페이스는 작고 구체적으로 유지해야한다.
인터페이스 = 특정 클래스가 반드시 구현해야 할 메서드와 속성을 정의하는 일종의 템플릿.

의존성 역전 원칙 (Dependency Inversion Principle, DIP)

프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다.
=> 높은 계층의 모듈이 저수준의 모듈에 직접 의존해서는 안된다.

  • 프로그래머는 구체적인 것에 의존하기보다는 추상적인 것에 의존해야 한다.
  • 고수준 계층의 모듈(도메인)은 저수준 계층의 모듈(하부구조)에 의존해서는 안된다. 둘 다 추상화에 의존해야 한다.
  • 추상화는 세부 사항에 의존하지 않아야 하며, 세부 사항이 추상화에 의존해야 한다.

0개의 댓글