>알고리즘 문제
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>멤버가 너무 많으므로 카테고리별로 묶어서 데이터 클래스로 만들기(예를 들어 항공기 정보)
>팀프로젝트(입문주차)
'코틀린-안드로이드' 카테고리의 다른 글
41일차)알고리즘 문제(다리를 지나는 트럭, 호텔 방 배정), 팀프로젝트 (0) | 2024.07.04 |
---|---|
40일차)알고리즘 문제(2개 이하로 다른 비트), 팀 프로젝트 (0) | 2024.07.03 |
38일차)알고리즘 문제(롤케이크 자르기, 트리 트리오 중간값, 등대, 미로 탈출, 가사 검색), 코드카타 리뷰(대각선 공식,BigDecimal,setScale), 입문 과제 해설강의, git&github강의 (0) | 2024.07.01 |
37일차)알고리즘 문제(뒤에 있는 큰수) (0) | 2024.06.30 |
36일차)알고리즘 문제(모음사전, 안티세포**중요!!) (0) | 2024.06.29 |