갑자기 떠오른 노래가 명곡이 아닐까요?
그래서 갑자기 떠오른 명곡을 추천드립니다.
성시경 - 거리에서 입니다.
오늘의 코드 카타는 숫자 변환하기입니다.
근데 아쉽게도, 아직 못 풀었습니다. 제가 쓴 답은 다음과 같습니다.
class Solution {
fun solution(x: Int, y: Int, n: Int): Int {
var answer: Int = -1
var num = x
// 3진법으로 만들어서
var trit = 0
if(x == y) return 0
while(true) {
// 3번 다 y보다 이상이면 나가는 변수
var isCannot = 0
repeat(3) {
num = x
val tritStr = trit++.toString(3)
for(i in tritStr) {
when(i) {
'0' -> num += n
'1' -> num *= 2
else -> num *= 3
}
}
if(num == y) return tritStr.length
//if(num == y && answer > num) answer = tritStr.length
else if(num > y) isCannot++
}
if(isCannot == 3) break
}
return answer
}
}
3진법을 써서 모든 구간을 돌아보는 건데요.
아쉽게도 끝내는 방법을 찾는 것에서 막혀 있습니다.
풀게 되면 이후 TIL에서 작성해보겠습니다.
오늘은 SOLID 원칙에 대해서 강의를 들었습니다.
제가 이전에 하던 개인 프로젝트에서도 가장 고민이 되던 부분이었는데, 마침 오늘 이 강의를 듣게 됐습니다.
SOLID 원칙은 객체지향 프로그래밍에서 준수해야 하는 5가지 원칙을 말합니다.
S: SRP(단일 책임 원칙)는 말그대로 하나의 클래스는 단일 책임만 져야 한다는 뜻입니다.
단일 책임을 지게 되면, 다양하게 조합하여 사용할 수 있기에, 좋은 객체지향 프로그래밍을 할 수 있습니다.
O: OCP(개방-폐쇄 원칙)는 확장에는 개방적이어야 하지만, 수정에는 폐쇄적이어야 한다는 뜻입니다.
특정 객체를 한 곳에 몰아둔다던지 하는 것보다, 여러 인터페이스와 클래스를 만들어두는 것이 확장성에 더 도움됩니다.
L: LSP(리스코프 치환 원칙)는 서브 타입이 기반 타입으로 대체돼, 동작이 가능해야 한다는 뜻입니다.
I: ISP(인터페이스 분리 원칙)는 기능이나 특성마다 인터페이스를 분리해야 한다는 뜻입니다.
모든 걸 하나의 인터페이스에 몰아넣지 않고, 여러 개로 추상화시켜 유연성을 높일 수 있습니다.
D: DIP(의존관계 역전 원칙)는 고수준의 모듈이 저수준의 모듈에 의존해선 안 되며, 추상화가 세부사항에 의존해서는 안 된다는 뜻입니다.
저수준 모듈에 의존하게 되면, 고수준 모듈을 하나 짤 때마다 계속해서 수정이 필요하게 됩니다.
반면, 이 관계가 역전되면, 확장만으로도 쉽게 모듈을 추가할 수 있게 됩니다.
모든 원칙들은 비슷한 말 같습니다.
왜냐하면, 이는 결국 추상화와 다형성에 대해 어떻게 다룰지 알려주는 내용이기 때문입니다.
하지만, 이를 생각하고 객체를 구상하다 보면, 확실히 더 좋은 코드를 짤 수 있습니다.
오늘은 이외에는 전부 프로젝트 구상에 대한 회의였습니다.
내일부터는 프로젝트를 진행해서 빨리 끝내야 할 것 같습니다.
내일은 코드카타를 풀고 싶네요.
끝.