분류 전체보기

    [PGM_42890] 후보키 (java)

    [PGM_42890] 후보키 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42890 코딩테스트 연습 - 후보키 [["100","ryan","music","2"],["200","apeach","math","2"],["300","tube","computer","3"],["400","con","computer","4"],["500","muzi","music","3"],["600","apeach","music","2"]] 2 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 완전탐색 1. 문제 이해 DB에 대한 릴레이션이 주어지면 그에 해당하는 후보키가 총 몇개가 존재하는지 찾아내는 문제이다. 2. 접근방법 1) 재귀를 활용하여 키가 될 수 있는 조합을 구해준다. ..

    자바 쓰레드 Callable과 Future

    자바 쓰레드 Callable과 Future

    Callable과 Future Runnable로 동작을 실행할 때 return받는 값이 없다. 따라서 쓰레드를 처리하고 그 결과로 값을 얻어야한다면 Runnable을 사용하면 안된다. Callable은 제너릭타입을 리턴타입으로 갖고 있기 때문에 return타입이 필요하다면 Callable사용하면 된다. Future는 이렇게 동작하는 비동기 작업의 현재상태를 조회하거나 결과를 가져올 수 있는 역할을 수행한다. ExecutorService ex = Executors.newFixedThreadPool(3); Callable hello = () -> { Thread.sleep(5000L); return "Hello"; }; Future future = ex.submit(hello); System.out.prin..

    자바 Excuter로 쓰레드 처리하기

    자바 Excuter로 쓰레드 처리하기

    Excutors 엄청나게 많은 쓰레드를 개발자가 관리하는 것은 사실상 불가능하다. 따라서 Executor를 활용하여 쓰레드를 관리하게 된다. Executer는 ExcutorServie와 ScheduledExecutorService가 있다. ExcutorService는 쓰레드를 만들어주고 동작하는 역할만 수행한다면, ScheduledExecutorService는 쓰레드들을 각자 얼마나 뒤에 실행할지를 입력할 수 있어, 스케쥴링하여 실행해준다. ExecutorService //사용되는 runnable 메소드 private static Runnable getRunnable(String message) { return () -> { System.out.println(message + ":" + Thread.cu..

    자바 쓰레드의 기초

    자바 쓰레드의 기초

    Thread 기초 쓰레드를 만드는 방법 Thread thread = new Thread(()->{ System.out.println("Hello Thread"); }); 쓰레드를 만드는 방법은 new Thread()를 할 때 Runnable 함수형 인터페이스를 넣어줌으로써 만들어줄 수 있다. 쓰레드 start thread.start(); 쓰레드를 생성하여 실행하기 위해서는 start()를 사용해주면 된다. 쓰레드 sleep thread.sleep(1000); 쓰레드에서 잠시 리소스를 빼앗기 위해서 sleep을 할 수 있다. 그렇게 되면 쓰레드가 하던 일을 잠시 멈추고 리소스를 다른 쓰레드에서 넘겨주게 된다. 쓰레드 interrupt Thread thread = new Thread(()->{ while (..

    [PGM_72412] 순위 검색 (java)

    [PGM_72412] 순위 검색 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/72412 = left){ mid = (right + left)/2; if(scores.get(mid) >= score) break; left = mid + 1; } for(;mid != -1 && scores.get(mid) >= score; mid--); return scores.size() - mid-1; 이분탐색을 수행해주는 코드이다. 쿼리로 주어지는 스코어의 값 이상을 찾아주는 것이기 때문에 조건에 맞는 큰 값을 먼저 찾아주고 그 조건을 만족하는 가장 작은 값이 있는 위치까지 옮겨주어야한다. 그 뒤 들어있는 데이터의 개수 전체에서 for문을 돌아 조건을 만족하는 가장 작은 값이 있는 위치의 값을 ..

    Java8의 시간 API 알아보기(LocalDateTime, Instant 등)

    Java8의 시간 API 알아보기(LocalDateTime, Instant 등)

    Date/Time API 과거 API의 문제점 시간 API로는 Date와 GregorianCalendar가 있다. 이름이 이상하다. 분명 Date인데, 시간을 가져올 수 있다. Date의 시간을 출력해보면 long타입의 숫자가 나온다.(이는 자바의 epoch로1970년 1월 1일 00시 기준으로 현재까지의 초를 의미한다. -> 먼가 성능을 측정할 때 쓰일 것 같은 기계적인 시간이다.) mutable하다. 시간에 값을 넣어 변경시킬 수 있다.(서비스에 장애를 일으키는 굉장히 큰 원인) 오늘날의 API 오늘날의 API는 값을 변경할 수 없으며 만약 변경을 하려고 하면 새로운 객체를 반환해주는 방법으로 변경이 이루어진다. 즉 Immutable하다. LocalDateTime 사람들이 주로 사용하는 시간을 의미한..

    코테 준비를 위한 코테북 제작기 ( Feat. Vuepress)

    코테 준비를 위한 코테북 제작기 ( Feat. Vuepress)

    코테랑 Vuepress랑 무슨 연관관계가있어? 코테랑 Vuepress는 아무 연관관계도 없다. 코테를 준비하며 푼 문제들과 풀이를 공유하고 유형별로 정리하여 다른 사람들이 준비할 때 도움이 되었으면 하는 바램으로 코테북을 제작을 하게 되었다. 블로그 레포​와 Vupress로 제작된 블로그에 한번 구경오셔서 저의 코드도 지적해주시고 코테를 준비하면서 좋다고 생각되는 문제들도 공유해주시면 감사하겠습니다!🙇🏻‍♂️ Vuepress와의 만남 Vuepress의 첫 만남은 TIL을 제작하기 위해 준비를 할 때였다. 블로그 형식으로 TIL을 제작하고 싶어 찾아보다가 진유림님의 TIL을 만나게 되었다. 이거다! 생각된 나는 무지성 fork를 하였다. 나의 TIL 제작을 위해 코드를 하나하나 까보며 적용을 하기 위해 시..

    [PGM_12985] 예상 대진표 (java)

    [PGM_12985] 예상 대진표 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/12985 코딩테스트 연습 - 예상 대진표 △△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 수학 1. 문제 이해 토너먼트로 경기를 진행하게 된다. 이 때 토너먼트 게임은 1 vs 2, 3 vs 4, 5 vs 6 ... 로 진행되며 1 vs 2의 승자와 3 vs 4의 승자가 다음 토너먼트에서 경기를 진행하는 방식이다. 토너먼트를 진행하는 사람의 수 n과 두 명의 선수의 번호 a, b..

    Optional을 알아보자!

    Optional을 알아보자!

    Optional이란? null을 리턴받아 사용하면 nullPointException이 발생한다. if(xx != null)와 같은 조건문으로 null을 체크해서 사용하면 해결할 수 있음. 하지만 매번 그렇게 하기가 번거로움. 두번째로 null을 return받을 상황에 Exeception을 던져줄 수 있음.(이 경우는 비효율적인 리소스를 사용해야함.) Optional을 활용하여 null에 대한 처리를 할 수 있다. 어디서 쓰는가? public Optional getProgress() { // Optional로 감싸서 보내준다. return Optional.ofNullable(progress); } 되도록이면 return되는 위치에서 사용하면된다. 사용하면 안되는 곳 : Map의 key(Map의 key는 n..

    [PGM_42577] 전화번호 목록 (java)

    [PGM_42577] 전화번호 목록 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42577 코딩테스트 연습 - 전화번호 목록 전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다. 전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다. 구조 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 정렬 1. 문제 이해 서로 다른 전화번호에 대한 배열이 주어진다. 전화번호의 접두어에 대한 개념을 이해하기 위해 예를 들어보겠다. 111, 1113, 1424 와 같이 번호가 주어졌다고 하자. 이 때 2번째 전화번호인 1113이 111을 앞에서 포함하고 있다. 그렇다면 111은 1113에 접두어라고 할 수 있다...

    [PGM_87946] 피로도 (java)

    [PGM_87946] 피로도 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/87946 코딩테스트 연습 - 피로도 XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 완전탐색(순열) 1. 문제 이해 - 던전을 도는 xx게임은 피로도를 소모하게된다. 던전에 대한 피로도는 최소피로도와 소모피로도가 있다. 최소 피로도는 던전을 돌기위한 최소의 피로도이며 소모피로도는 던전을 돌았을 때 소모되는 피로도이다. 던전들의 최소피로도 그리고 소모피로도에 대한 값의 정보와 피로도가 주어졌을..

    [PGM_1844] 게임 맵 최단거리 (java)

    [PGM_1844] 게임 맵 최단거리 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/1844 코딩테스트 연습 - 게임 맵 최단거리 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 BFS 1. 문제 이해 (0,0)을 시작점으로 하여 정 반대편에 위치한 (n,m)으로 이동하는 최단거리를 구하는 문제이다. 입력으로 이동할 수 있는지 없는지의 여부의 map이 주어진다. 만약 (n,m)으로 이동할 수 없는 경우에는 -1을 return하여주면 된다...

    Java8의 Stream을 알아보자!

    Java8의 Stream을 알아보자!

    Stream Stream은 자바8에서 가장 주목받은 기술 중 하나이다. 데이터를 병렬적으로 처리함에 있어 굉장히 효과적인 스트림에 대해 알아보겠다. 스트림의 특징 스트림은 데이터를 저장하는 저장소가 아니고, 데이터를 처리하는 방법이다. 스트림을 거쳐 데이터를 처리했다고 하여 데이터가 변경되지는 않는다. names.stream().map(String::toUpperCase); 이처럼 스트림을 활용해 대문자로 변경하는 코드를 작성했다고 해서, names의 데이터들이 모두 대문자로 변경되지않는다. 이 결과는 스트림으로 나오게 되며 데이터에 직접 영향을 미치지 않는다. 스트림의 파이프라인 스트림은 중계오퍼레이션과 종료 오퍼레이션으로 구성된다. 중계 오퍼레이션은 리턴값이 스트림이고, 종료 오퍼레이션은 스트림이 아..

    [PGM_42860] 조이스틱 (java)

    [PGM_42860] 조이스틱 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42860 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 브루트포스 1. 문제 이해 입력으로 알파벳으로 이루어진 문자가 주어지면, 조이스틱을 움직여 그 문자를 만들 때 최소한으로 조이스틱을 움직이는 경우를 구하는 문제이다. 조이스틱은 위,아래 그리고 좌,우로 움직일 수 있으며 위와 아래로 움직이는 경우 알파벳이 변경되고 좌우로 움직이면 해당 문자의 위치..

    [PGM_42839] 소수 찾기

    [PGM_42839] 소수 찾기

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42839 코딩테스트 연습 - 소수 찾기 한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 완전탐색, 순열 1. 문제 이해 String으로 숫자에 대한 문자열이 입력으로 주어지고, 그 문자열에 있는 숫자들을 한 글자씩 취급하여 새로운 조합의 숫자를 만들었을 때 소수인 경우를 구하는 문제이다. 2. 접근방법 문제를 해결하기 위해 주어지는 숫자를 순열로 나타낼 수 있는 경우의 수를 모두 만들어주..

    [PGM_42746] 가장 큰 수 (java)

    [PGM_42746] 가장 큰 수 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42746 코딩테스트 연습 - 가장 큰 수 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 정렬 0과 양의정수의 배열이 주어졌을 때 그 값들을 이어붙여서 가장 크게 만들 수 있는 수를 찾아주는 문제이다. 이 문제를 해결하기 위해 배열에 있는 값들을 정렬하여 이어붙이는 방법을 사용하였다. 단순히 오름차순 혹은 내림차순의 정렬이 아니라 문자열의 ..

    [PGM_42587] 프린터  (java)

    [PGM_42587] 프린터 (java)

    문제링크 https://programmers.co.kr/learn/courses/30/lessons/42587 코딩테스트 연습 - 프린터 일반적인 프린터는 인쇄 요청이 들어온 순서대로 인쇄합니다. 그렇기 때문에 중요한 문서가 나중에 인쇄될 수 있습니다. 이런 문제를 보완하기 위해 중요도가 높은 문서를 먼저 인쇄하는 프린 programmers.co.kr 문제풀이 👨🏻‍💻 핵심 스킬 👨🏻‍💻 Queue 우선순위가 가장 큰 문서부터 먼저 프린터를 하는 문제이다. 만약 우선순위가 대기열에 있던 프린터중에서 제일 높지 않다면 가장 뒤로 넘겨서 처리해주어야한다. 나는 이 문제를 해결하기 위해 Queue를 사용하였다. 문서를 프린터하기 위해 대기열에서 빼는 방법은 순서대로 빼주어야하며, 만약 우선순위가 가장 높지 않..

    인터페이스의  default와 static 메소드 java8

    인터페이스의 default와 static 메소드 java8

    java8의 인터페이스 default Method java8에서 새로 추가된 기능으로 인터페이스에 기본 메소드를 정의할 수 있게 되었다. 기본메소드를 정의하는 이유는 인터페이스를 구현하는 구현체들이 공통된 역할을 수행하는 메소드를 사용하기 위함이다. default로 추가해줌으로써 원래 인터페이스를 구현하고 있던 구현체에서 새로운 메소드를 정의할 필요가 없어진다. Default Method 구현 방법 public interface Foo { String getName(); default void printUpperName() { System.out.println(getName().toUpperCase()); } } 위 처럼 default를 활용해 메소드를 interface에서 구현해 줄 수 있다. 이 인터..