이구 졸리다.. 내일 처음으로 후 맛집 프로젝트 팀원들과 식사 자리를 가진다.. 얼른 글을 쓰고 자보자.. 수박수박수박수박수박수? StringBuilder().apply { repeat(n) { append(if(it % 2 == 0) "수" else "박") } }.toString() 내 처음 풀이는 이러했다. 전달받은 파라미터 n이 짝수인지, 홀수 인지 판단해서, StringBuilder에 append를 반복해주는 코드이다. 이 코드도 정답이었지만, 답안에서 CharArray를 사용한 방법이 더 깔끔하고, 효율이 좋아 코드를 가져왔다. //수박수박수박수박수박수? class WaterMelonWaterMelon { fun solution(n: Int): String = String(CharArray(n..
주말이라도 예외는 없다. 문제를 풀어보자. 나누어 떨어지는 숫자 배열 //나누어 떨어지는 숫자 배열 class DivisibleArrayOfNumbers { fun solution(arr: IntArray, divisor: Int): IntArray = arr.filter { it % divisor == 0 } .sorted() .toMutableList() .also { if(it.isEmpty()) it.add(-1) }.toIntArray() } 이 문제는 약간의 답을 참고하여 풀었다. also의 재발견... also로 객체 자체를 전달받아.. 코드를 한 줄로 스무스하게 만들 수 있는 좋은 메서드이다. divisor로 나누어지는 요소들을 필터링하고, 오름차순으로 정렬한 다음, 수정할 수 있는 mut..
배고프다.. 다이어트는 너무 힘들다. 문제를 풀어보자. 두 정수 사이의 합 class Solution { fun solution(a: Int, b: Int): Long { var result = 0L when { a == b -> result = a.toLong() a for(n in a .. b) result += n a > b -> for(n in b .. a) result += n } return result } } 두 정수 사이의 합을 구하는 문제이다. a와 b를 파라미터로 받고 대소 관계를 따져서 그에 맞는 for문을 돌려주어 문제를 해결하였다. 그런데 이 코드보다 더 효율적인 코드를 찾았다. class SumBetweenTwoIntegers { fun solution(a: Int,..
하루 시작에 머리를 맑게 해 주는? 코딩 테스트를 풀고 정리해본다. 우선 나머지가 1이 되는 수 찾기이다. 나머지가 1이 되는 수 찾기 //나머지가 1이 되는 수 찾기 class FindANumberWhoseRemainderIs1 { fun solution(n: Int): Int { var x = 1 while(true) if(n.rem(++x) == 1) break return x } } 문제는 입력받은 n 값을 나누어 나머지 1인 최솟값을 구하는 문제였는데, 원하는 값이 나올 동안 while문을 돌려 1씩 증가시켜 값을 얻었다. 증감 연산자를 전위형으로 하였고, n을 나누어줄 때 rem 메서드를 사용하였다. rem 메서드는 나머지를 구해주는 메서드이다. 여기서 한 가지 배운 사실이 있다. 숫자끼리에 ..
프로그래머스 입문자 시선으로 볼 때는 아직까지 비교적 쉬운 문제들이 마주하고 있다. 연습문제 느낌인데, 이런 거라도 풀면서 자신감도 늘리고, 코틀린 기능을 익히는 느낌으로 임하는 중이다. 첫 번째 문제는 파라미터로 입력받은 long타입에 수를 내림차순으로 반환하는 문제이다. 정수 내림차순으로 배치하기 //정수 내림차순으로 배치하기 class PlacingIntegersInDescendingOrder { fun solution(n: Long): Long = n.toString() .toCharArray() .sortedDescending() .joinToString("") .toLong() } 이 문제 같은 경우는 전달받은 long값을 문자열로 변환하고, 정렬을 위해 char 배열로 변환해준다. 그리고 내..
자바로만 코딩 테스트를 하다가 코틀린으로 하니.. 너무 수월한 내장함수들이 많은 듯하다.. 자바에서는 Arrays나, Collections 클래스를 많이 이용하고, 그에 맞게 namespace를 import 해주었는데, 코틀린은 내부에 적절하게 위에 코드에서 구현할 수 있는 메서드를 가지고 있어서 굳이, import하지 않고, 간편하게 구현할 수 있었다. 아래 문제를 보자. 자연수 뒤집어 배열로 만들기 //자연수 뒤집어 배열로 만들기 class FlipNaturalNumbersToFormAnArray { fun solution(n: Long): IntArray = n.toString() .reversed() .map { it.toString().toInt() } .toIntArray() } 파라미터로 받..
지금껏 Java로만 코딩 테스트를 풀었지만, 안드로이드 개발할때 코틀린만 쓰기도 하고, 오히려 코틀린 코딩테스트로 더 효율적인 코드로 알고리즘을 구현할 수 있지 않을까라는 생각, 게다가 보통 여러 회사들이 자바로 보통 테스트하지 않을까 생각했지만, 오히려 코틀린으로 코테를 보는 곳이 더 안드로이드에 대해 빠삭하지 않을까라는 로너 님의 의견을 듣고 마음이 흔들려 오늘부터 Java에서 코틀린으로 전환하기 했다. 삘타서 오늘 프로그래머스 문제로 5개의 문제를 풀어보았다. 첫 번째 문제는 짝수와 홀수 //짝수와 홀수 class EvenAndOdd { fun solution(num: Int): String = if (num % 2 == 0) "Even" else "Odd" } 짝수라면 Even을 홀수면 Odd를 ..
컴포즈를 공부하는 중이라 내용이 정확하지 않고, 부실할 수 있다는 점 양해 바랍니다. 오늘은 간단히 compose에서 사용하는 viewPager 기능과 유사한 기능을 사용함을 써, 앱을 처음 시작할 때 사용자에게 소개하는 가이드 화면을 예시로 만들어 보려고 합니다. 예시로 검은색 화면을 두었습니다. 가이드 화면이 있고, 옆으로 슬라이드 하게 되면 아래 왼쪽에 큰 하얀색점이 작아지고, 오른쪽 점이 커지게 하여, 가이드 페이지의 위치와 개수를 표현하게 됩니다. 사실 여러 viewPager를 찾는 중에 첫 번째 방법은 HorigontalPager라는 페이저 라이브러리였는데, 이러한 편리한 라이브러리도 있구나 정도로 생각을 했고, 두 번째 방법은 굳이 라이브러리를 사용하지 않고도, 만들 수 있는 법이 있었습니다..
처음 코딩 테스트 입문 때 11단계까지만 풀자 했는데.. 조금 늦었지만, 다 풀었다!! 라고 생각하는 순간 재귀와 정렬 쪽에서 문제가 추가되었다. 자주 문제가 추가되는 것 같긴 하다. 저것만 풀고 다음 단계로 넘어가자. 백준을 더 풀거나 프로그래머스 문제도 풀 생각이다. 저 11단계까지 문제가 무려 89문제나 된다.. ㅎㄷㄷ 아직 부족하다는 느끼지만, 더 풀어봐야 할 거 같다. 25501 문제는 거저 주는 느낌이 강했다. 코드를 살펴보자. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test25501 { public static void main(String[]..
쉬우면서도 어려운 문제였다. 나 같은 경우는 한 배열로 두 번의 Arrays.sort함수를 사용했다. 코드를 보자. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Test18870 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseI..
너무 졸리다.. 시골 와서 한 문제만 더 한 문제만 더 이러다가 2문제 째이다.. 이제는 문제 풀면서 졸고 있어서.. 한계이다.. 정렬 문제가 나한테 잘 맞는 것 같다.. 자신 있게 잘 풀어나가지는 것 같았다. 아래 코드를 봐보자. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; public class Test1181 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(Syste..
이전 시간에 좌표 정렬하기 문제에서 y로 바뀐 것 말고는 바뀐 게 없다. 이번에는 저번 문제에서 인터넷에서 찾아본 아래 코드 방법으로 배열을 정리해보면서 풀어보려고 한다. Arrays.sort(arr, (e1, e2) -> { //y값이 같으면 x로 순서 정렬 if(e1[1] == e2[1]) { return e1[0] - e2[0]; } //그게 아니면 y로 순서 정렬 return e1[1] - e2[1]; }); 좌표 정렬하기 1 문제의 링크이다. 2022.09.09 - [Programing/CodingTest] - CodingTest #24 Java 11650 (좌표 정렬하기) 문제 풀이 CodingTest #24 Java 11650 (좌표 정렬하기) 문제 풀이 추석이다.. 아고 언제 내려가나.. ..
추석이다.. 아고 언제 내려가나.. 문제 하나 풀어보았다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; public class Test11650 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(br.readLine()); StringTokeniz..
오늘 추석이라 회사에서 점심먹고 퇴근하라고 한다. 개이득!!! 오늘 푼 문제는 소트인사이드이다. Primitive type을 Wrapper type으로 바꾸는 것만 신경쓰면 정말 쉬운 문제였다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Comparator; public class Test1427 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamRead..
3번째 flow 예제 공부를 마쳤다. stateflow, sharedflow, channel에 대한 예제를 꾸렸지만, 모두 클릭 리스너를 달아 데이터를 가져오는데 그친 간단한 예제이지만, 기능보다는 각각의 특징과 공부한 내용들로 주를 이루었다. 우선 코드를 보자. MainViewModel.kt class MainViewModel : ViewModel() { //StateFlow private val _uiState = MutableStateFlow(UiState.Loading) val uiState: StateFlow = _uiState.asStateFlow() //SharedFlow //설정할 수 있다는 것만 보여주기 위함 //아래 설정은 다 기본값 private val _uiShared = Mutab..
flow에는 종료 시점에 후처리 할 수 있는 onCompletion이 존재한다. 우선 코드의 상황은 다음과 같다. useCase를 통해서 서버에 요청하여 list를 불러오는 viewModel의 코드 부분이다. class MainViewModel(private val useCase: UseCase) : ViewModel() { private val _blogList = MutableStateFlow(UiState.Loading) val blogList : StateFlow = _blogList.asStateFlow() private var isLast = false init { viewModelScope.launch { flow{ emit(useCase.getBlogList().toUiBlogList())..
평소처럼 run버튼을 누르고 앱을 실행했는데, 앱이 켜지지 않는 무반응 상태가 되었다. 디버그 모드로도 실행을 해보니 Waiting for application to come online:~~~~ 이런 글만 나오면서 빨간 에러가 뜨는 것이었다. 구글에 서치 해보니.. Device Manager에 들어가 해당 에뮬레이터를 wipe data 해주라는 것이었다. 아쉽게도 해결이 되지 않았는데, manifest에 들어가서 해당 액티비티에 exported를 true로 바꾸어주니 해결되었다!! 정말 알다가도 모르겠는 안드로이드 스튜디오이다...
하루에 한번씩 푸는 코딩테스트다. 요즘 프로젝트랑 같이 하느라 정신이 없지만.. 최대한 하루에 하나씩 해나가보려고 한다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Collections; import java.util.StringTokenizer; public class Test25305 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(Sy..
지금은 해결되고 캡처한 것이지만, 모든 코드에 빨간줄이 그어졌다... 해결법은... 윈도우나 맥에 사용자 폴더 안에 있는. gradle 폴더를 삭제하고 cleanProject -> RebuildProject -> Invalidate Caches Restart를 해주면 된다!! 그러면. gradle를 처음부터 다시 삭제하고 깔아주면서 해결이 된다. 갑자기 이런 오류가 뜬 요인은 잘 모르겠다.. 만약 위에 방법이 안된다면, 두번째 방법을 사용해보자. 안드로이드 스튜디오를 잠시 꺼주고, 해당 프로젝트 파일 안에 있는 .idea 파일을 삭제하고 다시 실행해본다. 나같은 경우는 두번째 방법으로 해결되었다.
상황은 이렇습니다. 다음과 같이 3개의 EditText가 있고, 이 EditText의 글씨가 모두 써졌으면, 아래 버튼이 활성화되게끔 하려고 합니다. 우선 저는 상태에 따른 모델 값이 필요하다고 생각하여 다음과 같이 UiState를 만들었습니다. UiState.kt data class UiState( val type: EditType? = null, var editState: EditState = EditState.EMPTY ) { enum class EditState { EMPTY, WRITTEN } enum class EditType { NAME, ADDRESS, PHONENUM } }ㅇ UiState는 type: EditType -> EditText의 들어갈 내용에 대한 타입입니다. (NAME, A..
데이터 형식 모델 피드백 이후 변경 사항입니다. 우선 blog 부분입니다. 기존에는 Blog라는 클래스를 두고, 두 개의 클래스 DaumBlog, NaverBlog의 상속시켜 코드를 짰지만, Blog 클래스 자체적인 프로퍼티인 BlogType enum 타입을 통해 Daum과 Naver를 구분 짓도록 변경하였습니다. Blog.kt import kr.loner.shared.BlogType /* * 블로그 데이터 클래스입니다. * id : 고유값 * title : 블로그의 타이틀명입니다. * info : 블로그에 대한 설명글 입니다. * img : view의 표시될 하나의 이미지입니다. * blogUrl : 아이템을 눌렀을 때, 웹뷰로 전달할 url입니다. * type : blog의 종류를 결정하는 타입 값입..
네트워크 통신 즉, 하나의 컴퓨터에서 다른 컴퓨터로 객체를 보낼때 그 자체를 보내는데에는 어려움이 있다. 보낼 객체가 통신이 가능하게 변환해 주어야 하는데 우리는 이러한 작업을 직렬화라고 하고, 이렇게 받은 직렬화된 파일을 다시 객체로 변환해주는 것을 역 직렬화라고 한다. 직렬화에는 여러 종류가 있다. 첫 번째는 gson이다. 간단하게 장점이라면, Json으로 또는 그 반대로 변환 가능한 간단한 메서드인, toJson() 와 fromJson()를 제공 Java Generics의 광범위한 지원 개체에 대한 사용자 지정 표현 허용 등이 있다. 두번째는 moshi 이다. moshi 같은 경우는 Gson이 하지 않는 몇 가지를 최적화 한다고 합니다. 첫번째는 코틀린의 지원 @HexColor int와 같은 한정자..
2231 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Test2231 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String N = br.readLine(); int valueLength = N.length(); int value = Integer.parseInt(N); int result = getInitialNum(value, valueLength); Syste..
3003 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Test3003 { static int[] correct = { 1, 1, 2, 2, 2, 8 }; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine(), " "); S..
rxjava와 레트로핏을 다음과 같이 사용하였다. CompositeDisposable 객체를 만들고, 다음과 같이 네트워크를 호출하였다. val disposable = CompositeDisposable() disposable.add( RetrofitClient.getRetrofitInstance(application) ?.getProductList( user?.authCompanyCode, getAuthKey(application), user?.mobileUid, user?.sessionId, pageNo, pageSize, "desc" )?.subscribeOn(Schedulers.newThread()) ?.observeOn(AndroidSchedulers.mainThread()) ?.subscrib..
요즘은 회사도 바쁘고, 사이드도 진행하느라, 바쁘지만, 그동안 잊고 안 했던 코딩 테스트를 다시 해보려고 한다. 오랜만에 해보니 역시 살짝 감을 잃은 느낌이다. https://st-lab.tistory.com/97 [백준] 2798번 : 블랙잭 - JAVA [자바] www.acmicpc.net/problem/2798 2798번: 블랙잭 문제 카지노에서 제일 인기 있는 게임 블랙잭의 규칙은 상당히 쉽다. 카드의 합이 21을 넘지 않는 한도 내에서, 카드의 합을 최대한 크게 만드는 게임이다. 블 st-lab.tistory.com 스트렌져님의 블로그를 참고하였다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr..
최근에 새로운 앱을 만들기 위해 고군분투 중이다. 기존 앱에 서버에서 받는 api의 원시 데이터는 xml을 사용했는데, 이번 앱은 json을 사용하게 되었다. 다행이 인터넷에 자료가 많아 데이터를 보내는데 문제가 없었다. 그렇지만, 이미지를 보내는 과정에서 어려움이 생겼다. 서버 개발자분이 Multpart를 통해서 서버로 이미지를 보내달라고 요청하셨다. 멀티파트?? 구글에 쳐본 결과 멀티파트란? - HTTP 요청의 한 종류로서 서버에 파일이나 데이터를 보내기 위한 요청 방식이다. - 보통은 큰 용량의 바이너리 데이터 전송에 적합하다. 한마디로 큰 이미지 파일 등을 서버로 넘겨줄 때 적합한 방법이다. 레트로핏을 이용해서 사용해보자 (물론 레트로핏 종속성과 실행법은 모두 알고 있다는 전제로 설명하겠다.) 데..
제목 : 몸이 가벼워 진다. 확실히 회사에서 일거리가 좀 생기니 요즘 정말 재밌어 진다. 유튜브 프리미엄도 끊고, 책만 보니, 생각 보다 재밌어서 일 끝나고 책 볼 생각에 신나기 까지한다. 앞으로 다가오는 7월 10일부터 헬스장을 다니기로 했는데, 꾸준히 다녔으면 한다. 공부할 의지도 다시 생기면서 기분이 좋다. 그래도 번아웃을 막기 위해 일주일에 한번 피시방과 매일 한시간 정도 게임을 해주고 있다. 이것마저 하지 않는다면.. 큰일나는 것은 아니지만, 나한테도 여가가 필요하다고.. 생각이 든다. 운동도 열심히 하고, 공부도 열심히 해서 내 가치를 올려보자..!! 어제 친구와 술을 먹으면서 대화를 나누었다. 문득 친구의 얼마나 돈을 모았냐는 말에.. 살짝 위축이 되었다. 나는 사실 그렇게 돈을 많이 모으지..
제목 : 취했다. 으아.. 취했다.. 오랜만에 세민이랑 한잔했다.. 물론 세민이는 술을 마시지 않아서 나만 마셨다. 나도 처음 알았다. 내 주량이 2병에서 2병 반 정도라는 것을 알았지만, 혼자서도 2병을 먹을 수 있다니.. 술 상대가 없어도 두병을 마실 수 있다는 사실이 놀라웠다. 오늘 기쁜 점이 있었다. 최근에 회사에서 주문했던 클로즈잇에 개발이 거의 끝났다고 볼 수 있다. 이제 서버에서 API연동만 끝나면 내 작업도 마무리로 이어진다. 다시 여유롭게 코딩테스트도 하고, 안드로이드 공부도 따로 하고 싶다. 솔직히 말하면 코딩테스트보다 안드로이드 공부를 더 하고 싶다. 안드로이드 공부가 더 재밌다. 코딩테스트를 풀면, 솔직히 못 푼 날이 더 많지만, 정답일지 모르는 답변을 블로그 글로 작성하기 조금 꺼..
오늘 회사에서 하루 종일 삽질한 문제이다. 나 같은 경우는 리사이클러뷰 안에 리사이클러뷰를 사용하는 중복 리사이클러뷰를 구현하고 있었는데, 글라이드 라이브러리를 통해서 이미지를 디스플레이하였다. 그런데 문제는 arrayList에서 0인덱스 자리에만 이미지가 출력되면 좋겠지만, 9인 덱스 자리에서도 똑같은 이미지가 출력되는 것이었다. 아이템의 개수를 증가하니, 9 배수 자리의 인덱스 값에서만 같은 이미지가 계속 출력되는 것이었다. 리사이클러뷰 어뎁터를 갱신할 때는 DiffUtil을 사용하고 있었는데, 혹시나 리사이클러뷰가 두 개이니 각각의 리사이클러뷰를 갱신하지 못해서 생긴 문제인가 생각이 들었다. (리사이클러뷰 하나만 갱신을 진행하고 있는 상태) 물론 이게 문제가 아니었다.. 이것 때문에 막혀서 시간을 ..