코틀린-안드로이드

39일차)알고리즘 문제(숫자 변환하기), 챌린지반 2회차 강의(OOP설계), 팀프로젝트(입문주차)

songyooho 2024. 7. 2. 23:49

>알고리즘 문제

1. 문제

문제 설명

자연수 x를 y로 변환하려고 합니다. 사용할 수 있는 연산은 다음과 같습니다.

  • x에 n을 더합니다
  • x에 2를 곱합니다.
  • x에 3을 곱합니다.

자연수 x, y, n이 매개변수로 주어질 때, x를 y로 변환하기 위해 필요한 최소 연산 횟수를 return하도록 solution 함수를 완성해주세요. 이때 x를 y로 만들 수 없다면 -1을 return 해주세요.


제한사항
  • 1 ≤ x ≤ y ≤ 1,000,000
  • 1 ≤ n < y

2. 솔루션

class Solution {
    fun solution(x: Int, y: Int, n: Int): Int {

        
        val dp=IntArray(y+1){Int.MAX_VALUE} //dp[현재값]=최소 연산 횟수
        dp[x]=0
        
        for(i in 0..y-1){
            if(dp[i]==Int.MAX_VALUE) continue
            if(i+n<=y) dp[i+n]=minOf(dp[i+n],dp[i]+1)
            if(i*2<=y) dp[i*2]=minOf(dp[i*2],dp[i]+1)
            if(i*3<=y) dp[i*3]=minOf(dp[i*3],dp[i]+1)
        }
        
        if(dp[y]==Int.MAX_VALUE) return -1
        else return dp[y]

    }
}

-dp[현재값]=최소연산횟수

-dp[i]를 가지고 i+n,i*2,i*3의 최솟값을 갱신하는 방식으로 해서 구함

 

 

 

>챌린지반 2회차 강의(OOP설계)

객체지향 프로그래밍(OOP-Object Oriented Programming)

SOLID원칙 - OOP 설계원칙
<1>SRP: Single Resposibility Principle
-단일책임원칙: 각 클래스는 하나의 책임만 가짐
-예시: 커피머신 클래스=>커피 머신에서 물끓이기, 커피콩갈기, 커피 내리기 기능이 있으면 각 기능별로 클래스를 만들고 커피머신 클래스는 클래스들을 인스턴스로 가져오는것
=>즉 각 기능별로 클래스를 만들어줌
<2>OCP: Open Closed Principle
-개방 폐쇄 원칙: 저수준과 고수준 모듈을 분리해서 저수준 모듈만 바꿔 고수준 모듈에 넣는 식으로 실행시킬 수 있음
=>고수준 모듈수정할 필요 없이 저수준모듈만 수정하거나 바꿔넣는식으로 만들 수 있음
<3>LSP: Liskov Substitution Principle
-리스코프 치환 원칙: 부모와 자식 클래스가 있을때 어떤 기능을 실행시킬때 부모클래스의 인스턴스를 받는데 거기에 자식클래스를 넣어도 문제없어야 한다.
<4>ISP: Interface Segregation Principle
-인터페이스 분리 원칙:인터페이스를 상속받을 클래스들에서 각각 필요한 인터페이스 메소드가 일부분인 경우 인터페이스를 메소드별로 분리해준다.
=>필요한 인터페이스들을 여러개 상속 받으면 되므로 기능별로 인터페이스를 분리
<5>DIP: Dependency Inversion Principle
-의존성 역전 원칙: 고수준 모듈이 저수준 모듈에 의존하면 안된다=>추상화는 세부적인부분에 의존하면 안되고 역만 가능
-공통부분이 있으면 고수준 모듈로 빼둔뒤에 거기에 저수준 모듈을 인자로 받는 식으로 설계
-예시: 
<1>에스프레소 머신, 커피 머신, 티 머신 등이 있을때 셋은 공통으로 추출과정이 있음
<2>추출을 고수준 모듈로 빼준뒤에 에스프레소, 커피, 티등의 클래스 인스턴스를 인자로 받는 추출 클래스를 만들음
<3>세부 사항이 저수준 모듈, 공통 부분으로 묶는 기능이나 카테고리가 고수준 모듈
<4>저수준 모듈을 고수준 모듈 내에서 일일히 멤버로 선언을 하면 의존성 역전 원칙 위배
<5>고수준 모듈은 저수준 모듈을 인자로 받게 해서 고수준 모듈이 저수준 모듈에 의존하지 않도록 해야함
-코드 예시 강의 확인하기(36분)

과제-공항 전광판
<1>클래스로 만들기
<2> 출발(depart)프로퍼티: 전광판에 나올필요 없는 것은 privated
-id: 항공편 고유 아이디. privated
-항공기고유코드 privated
-예정시간: 
-변경시간:var
-도착지:
-항공사코드:
-편명: 편명은 중복이 될 수 있음(항공기 명이 아님)
-공동 운항: 항공편 티켓을 판매하는 협력 항공사(여러개 가능)
-체크인 카운터: 여러개 가능, var
-탑승구:var
-현황(탑승, 결항 등):var
-항공편 만들어진 시간 privated
-수정된 시간 privated,var

<3>도착(arrival)프로퍼티
-id: 항공편 고유 아이디. privated
-항공기고유코드 privated
-예정시간: 
-변경시간:var
-출발지:
-항공사코드:
-편명: 편명은 중복이 될 수 있음(항공기 명이 아님)
-공동 운항: 항공편 티켓을 판매하는 협력 항공사(여러개 가능)
-현황(탑승, 결항 등):var
-항공편 만들어진 시간 privated
-수정된 시간 privated,var

<4>둘의 부모클래스: 중복되는 부분은 빼서 부모 클래스 만들기
<5>멤버가 너무 많으므로 카테고리별로 묶어서 데이터 클래스로 만들기(예를 들어 항공기 정보)

 

 

 

>팀프로젝트(입문주차)

https://appdevelopjava.tistory.com/51