객체 지향 설계 원칙 SOLID라고 부르는 5가지의 설계 원칙이 존재한다. SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open Closed Priciple): 개방 폐쇄 원칙 LSP(Listov Substitution Priciple): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존 역전 원칙 앞 글자에 철자를 따서 SOLID라고 부르는데, 하나씩 정리를 해보자. SRP(Single Responsibility) - 단일 책임 원칙 어떤 클래스를 변경해야 하는 이유는 오직 하나뿐이어야 한다. 클래스는 단 한개의 책임을 가져야한..
디자인 패턴이란 디자인 패턴은 소프트웨어 디자인에서 일상적으로 발생하는 문제에 대한 일반적인 해결책을 말한다. 기존에 존재하는 함수나 라이브러리들로 패턴을 찾아서 프로그램에 복사한다고 하여 패턴이 되는 것은 아니다. 패턴은 특정 코드 족각이 아닌, 특정 문제를 해결하는 일반적인 개념이다. 패턴 세부 사항을 따라 자신의 프로그램에 맞는 솔루션을 구현할 수 있다. 디자인 패턴의 목적 SW의 재사용성과 호환성 그리고 유지 보수성을 보장하기 위함이다. 패턴의 구성 대부분의 패턴들은 사람들이 많은 맥락에서 재현할 수 있도록 형식적으로 설명된다. 패턴의 의도(Intent)는 문제와 해결책을 간략하게 설명한다. 동기(Motivation)는 패턴의 가능성과 문제를 더 설명한다. 클래스의 구조(Structure)는 패턴..
java.lang.IllegalArgumentException: baseUrl must end in /: 라는 오류가 발생했다. 알아보니 retrofit 으로 base url 사용시 나타난 에러이다. 알아보니 공통 클래스를 하나 생성해서 base url 을 지정하고 retrofit 을 통해서 사용했는데 위와같은 에러가 나타났다. base url 의 끝 부분은 반드시 / 로 끝나야 한다고 한다.
2 초 128 MB 8010 3383 2882 46.342% 문제 알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다. 먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다. 예를 들어, 단어 : arrested 세 단어로 나누기 : ar / rest / ed 각각 뒤집기 : ra / tser / de 합치기 : ratserde 단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오. 입력 첫째 줄에 영어 소문자로 된 단어가 ..
2 초 128 MB 16780 9306 8101 56.841% 문제 길이가 N으로 같은 문자열 X와 Y가 있을 때, 두 문자열 X와 Y의 차이는 X[i] ≠ Y[i]인 i의 개수이다. 예를 들어, X=”jimin”, Y=”minji”이면, 둘의 차이는 4이다. 두 문자열 A와 B가 주어진다. 이때, A의 길이는 B의 길이보다 작거나 같다. 이제 A의 길이가 B의 길이와 같아질 때 까지 다음과 같은 연산을 할 수 있다. A의 앞에 아무 알파벳이나 추가한다. A의 뒤에 아무 알파벳이나 추가한다. 이때, A와 B의 길이가 같으면서, A와 B의 차이를 최소로 하는 프로그램을 작성하시오. 입력 첫째 줄에 A와 B가 주어진다. A와 B의 길이는 최대 50이고, A의 길이는 B의 길이보다 작거나 같고, 알파벳 소문자..
Java String 객체는 내장 함수를 정리하자. equals() eqauls()는 두개의 문자열이 동일한 값을 가지고 있는지를 비교하는 함수이다. a == b 와는 다르다. a == b는 문자열 변수의 주소값을 비교하는 것이다. 예시) String a = "test"; String b = a; String c = "test"; String d = new String("test"); String e = "wtf"; System.out.println(a==b);//true System.out.println(a.equals(b));//true System.out.println(a==c);//true System.out.println(a.equals(c));//true System.out.println(b=..
브루트 포스 알고리즘이란? 쉽게 말하면 모든 경우의 수를 무식하게 전부 다 탐색한다는 뜻이다. 전체를 탐색한다는 의미에서 전체 탐색, 완전 탐색이라고 한다. 알고리즘 설계의 가장 기본적인 접근 방법은 해가 존재할 것으로 예상되는 모든 영역을 전체 탐색하는 방법이다. 선형 구조를 전체적으로 탐색하는 순차 탐색, 비선형 구조를 전체적으로 탐색하는 깊이 우선 탐색(DFS, Depth First Search)과 너비 우선 탐색(BFS, breadth first search)이 가장 기본적인 도구이다. 브루트 포스의 장단점 브루트 포스의 장점 알고리즘을 설계하고 구현하기 매우 쉽다. 복잡한 알고리즘 없이 빠르게 구현할 수 있다. 브루트 포스의 단점 알고리즘의 실행 시간이 매우 오래 걸린다. 메모리 효율면에서 매울..
갑자기 이런 화면이 떴다. 무엇이 문제일까.... 찾아보니 Gradle 파일에서 android { ... buildFeatures { viewBinding = true } } 이와같이 viewBinding을 하였을 경우 plugins { id "kotlin-android-extensions" } 를 아래와 같이 고쳤더니 해결이 되었다. plugins { id 'kotlin-parcelize' } kotlin plugin extension이 deprecated 됐다. 그래서 다른 방법으로 처리를 해야한다. 안드로이드 개발자 사이트에 의하면 viewBinding을 통해 마이그레이션을 하라고 하고 있다.