문제 설명 자연수를 원소로 갖는 공집합이 아닌 두 집합 A와 B가 있다. 이때, 두 집합의 대칭 차집합의 원소의 개수를 출력하는 프로그램을 작성하시오. 두 집합 A와 B가 있을 때, (A-B)와 (B-A)의 합집합을 A와 B의 대칭 차집합이라고 한다. 예를 들어, A = { 1, 2, 4 } 이고, B = { 2, 3, 4, 5, 6 } 라고 할 때, A-B = { 1 } 이고, B-A = { 3, 5, 6 } 이므로, 대칭 차집합의 원소의 개수는 1 + 3 = 4개이다. 입출력 예 입력 첫째 줄에 집합 A의 원소의 개수와 집합 B의 원소의 개수가 빈 칸을 사이에 두고 주어진다. 둘째 줄에는 집합 A의 모든 원소가, 셋째 줄에는 집합 B의 모든 원소가 빈 칸을 사이에 두고 각각 주어진다. 각 집합의 원소..
Architecture 아키텍쳐를 사용하는 이유 일관적인 코드작성 (유지보수, 협업 능률 상승) 생산성 향상 테스트의 용이성 어플리케이션의 개발 방향성을 잡아줌 (동일한 목표) 아키텍쳐의 종류 MVC: model + view + controlller MVP: model + view(viewController) + presenter MVVM: model + view(viewController) + viewmodel MVVM + DataBinding MVI: model + view + intent MvRx(framework-airbnb), Flux(framework-facebook), Ribs, etc.... MVP architecture mvp 아키텍쳐 view - presenter - model 로 분리..
문제 설명 정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오. 명령은 총 다섯 가지이다. 1 X: 정수 X를 스택에 넣는다. (1 ≤ X ≤ 100,000) 2: 스택에 정수가 있다면 맨 위의 정수를 빼고 출력한다. 없다면 -1을 대신 출력한다. 3: 스택에 들어있는 정수의 개수를 출력한다. 4: 스택이 비어있으면 1, 아니면 0을 출력한다. 5: 스택에 정수가 있다면 맨 위의 정수를 출력한다. 없다면 -1을 대신 출력한다. 입출력 예 입력 첫째 줄에 명령의 수 N이 주어진다. (1 ≤ N ≤ 1,000,000) 출력을 요구하는 명령은 하나 이상 주어진다. 둘째 줄부터 N개 줄에 명령이 하나씩 주어진다. 출력 출력을 요구하는 명령이 주어질 때마다 명령의 결과를 ..
in 키워드 (GENERIC) in 키워드에 대해 알려면 먼저 제네릭에 대해 알아야한다. 제네릭이란? 제네릭은 클래스 내부에서 사용할 자료형을 나중에 인스턴스를 생성할 때 확정한다. 제네릭이 나오게 된 배경은 자료형의 객체들을 다루는 메소드나 클래스에서 컴파일 시간에 자료형을 검사해 적당한 자료형을 선택할 수 있도록 하기 위해서 등장하였다. 제네릭을 사용하면 객체의 자료형을 컴파일 시에 체크하기 때문에 객체 자료형의 안정성을 높이고 형 변환의 번거로움이 줄어든다. 제네릭을 사용하기 위해 앵글 브래킷() 사이에 형식 매개변수를 사용해 선언하고 매개변수는 하나 이상 지정할 수 있다. 제네릭에는 가변성이란 것이 있는데 가변성이란 매개변수가 클래스 계층에 영향을 주는 것을 뜻한다. 가변성에는 공변성, 반공변성,..
constraint layout란?, 다른 레이아웃과 비교해서 장점은? ConstraintLayout은 각 요소를 부모나 다른 요소에 상대적으로 배치하는데 사용되는 제약 조건을 활용한다. 이는 정확한 위치 지정을 통해 UI를 세밀하게 제어할 수 있게 해준다. 이로써 발생하는 장점에는 다음과 같은 것들을 생각해볼 수 있다. 유연성 및 성능 개선- 다양한 화면 크기와 해상도에 대해 유연하게 대응할 수 있다. 이는 앱이 다양한 디바이스에서 일관된 모양을 유지하면서도, 더 나은 성능을 제공할 수 있도록 도와준다. 간결한 계층 구조 - 기존의 다른 레이아웃과 비교해서 계층 구조가 더 간결합니다. 계층 구조가 단순해지면서 레이아웃의 계산이 빨라지고 메모리 사용이 효율적으로 개선된다. 레이아웃 중첩 최소화 - 중첩된..
형 변환 코틀린은 정적 타입 언어이기 때문에 컴파일 시에 변수의 타입이 결정되며, 이를 명시적으로 변경하려면 형 변환을 사용해야 한다. 안전한 캐스팅 ‘as?;’ - as? 연산자를 사용하여 형 변환을 한다. 형 변환이 불가능하다면 null을 리턴한다. 안전하지 않은 캐스팅 ‘as’ - as 연산자를 사요한다. 강제 형 변환을 시도하며, 형 변환이 불가능하다면 ‘ClassCastException’ 예외를 발생시킨다. 형 변환은 보통 서로 다른 자료형 간에 데이터를 교환하거나 연산을 수행하기 위해 사용된디. 하지만 형 변환이 언제나 가능한 것은 아니며, 호환되지 않는 자료형 간에 형 변환을 시도하면 예외가 발생할 수 있다. 따라서 형 변환을 필요할 때에는 안전한 형 변환을 시도하고, 예외가 발생하지 않을 ..
안티 패턴 안티 패턴이란? 안티패턴(anti-pattern)은 소프트웨어 공학 분야 용어이며, 실제 많이 사용되는 패턴이지만 비효율적이거나 비생산적인 패턴을 의미한다. 안티패턴은 1995년 앤드루 케이니그가 디자인 패턴을 참고하여 처음 사용한 말이다. 내가 사용한 안티 패턴 viewModelScope.launch(Dispatchers.IO) { val travelers = homeRepository.getCalculationTravelers( responseCount = 1000, startDate = getPastDateString.first, endDate = getPastDateString.second ) when (travelers) { // APIResponse가 안티 패턴으로 적용 됨 is A..
Firebase BOM dependencies { // ... // Import the Firebase BoM implementation platform('com.google.firebase:firebase-bom:X.X.X') // BoM을 사용하기 때문에 Firebase들의 버전을 명시할 필요가 없다. // 파이어베이스 컴포넌트 추가 implementation 'com.google.firebase:firebase-auth' implementation 'com.google.firebase:firebase-firestore' } 파이어베이스 공식문서를 따라가다보면 디펜던시를 추가하는 부분이 있다. 여기서 파이어베이스 컴포넌트 이외에에, firebase-bom이란 것을 추가시키는데 이건 어떤 것을 의미하는..
원인 및 시도 로컬에서만 관리되는 키 값(local.properties)이 있는데, 이것은 gitignore를 통해 github에 올라가지 않는다. build.gradle에서는 local.properties에 있는 키 값을 가져와 사용을 해야 하는데, github action을 통해 빌드를 하면 local.properties파일이 없기 때문에 정상적인 빌드가 되지 않는다. 그래서 github 상에서 secret으로 값을 주입을 해서 사용해야 되는데 키 값이 제대로 주입이 안되는 현상이 발생하여 build.gradle에서 키 값을 찾지 못해 null로 리턴하는 현상을 발견하였다. A problem occurred evaluating project ':app'. > Parameter specified as ..
인앱 업데이트 표시 플레이스토어 출시 후, 앱 버전을 올리게 되면 사용자는 앱을 업데이트해야 원활한 앱 사용이 가능하다. 하지만 기본적으로는 앱내에서 업데이트를 알려주지 않기 때문에, 플레이스토어에서 직접 확인하지 않는 한 업데이트 내역을 알아차리긴 힘들다. 여기서 구글의 인앱 업데이트를 전송할 수 있도록 하는 라이브러리가 있다. AppUpdateManager이다. 이걸 활용하면 간단하게 앱 내에서 업데이트를 확인하고 그에 따라 알림을 띄워 볼 수 있다. // update check (app - build.gradle) implementation 'com.google.android.play:app-update-ktx:2.1.0' // 앱 시작 시 앱 버전을 체크함 (activity or fragment)..