반응형

분류 전체보기 316

[프로그래머스,java] Level3: 불량 사용자

문제분석 문제목표: 불량 사용자 리스트를 확인하여 해당 사용자와 일치하는 경우의수를 구해주세요. 문제를 읽어보고 프로그램관점으로 한번 생각해보니 완전탐색 문제임을 파악했다. DFS문제임을 알았다면 괜찮지만, 문제는 이 부분이다. 제재 아이디 목록들을 구했을 때 아이디들이 나열된 순서와 관계없이 아이디 목록의 내용이 동일하다면 같은 것으로 처리하여 하나로 세면 됩니다. 완전탐색으로 검색된 여러결과들중 순서가 뒤죽박죽인 결과가 만약 내용물이 같으면 제거해야한다. 여기서 좀 많이 고민을 했지만, 아이디어를 하나 생각을해냈다. visited[] 배열을 이용하여 하나의 체크문자열을 만드는것이다. 예를들어, 유저가 5명 불량 리스트가 3명이라면 visited[]가 true면 O , false면 X를 넣는다. 이렇게..

[프로그래머스,Java] Level3 : 여행 경로

문제분석 문제목표: 티켓을 전부 사용하여 여행경로를 구해주세요 단, 중복된 여행경로가있을경우 알파벳순서가 앞서는 경로를 우선하라. 일반적인 DFS를 작성하는법을 기본으로 알아야하고, 추가로 생각해야하는 경우는 중복된 여행경로가 있을경우 알파벳 순서가 앞서는 경로를 우선하라 이다. 보통 우선하라 = 정렬 이다. 정렬을 하려면 sorting을 해야하는데 필자는 경로를 모두 String으로 작성한뒤 sorting을하고 3글자씩 자르기로했다. dfs()의 탈출조건과, 백트래킹이다. 백트래킹에대해 조금 더 분석하자면, dfs를 진행할때마다 출발지점 start, 깊이 level , 여행경로 path를 갱신해줘야한다. 따라서 탈출조건은 level이 티켓+1 이면 모든 경로를 돌은것이므로, 경로를 저장하고 반환한다. ..

[프로그래머스,Java] Level3: 단어 변환

문제분석: 목표: begin 단어와 end 단어가 있으며, 단어는 한문자씩 바꿔가며 교체가가능하며, End 단어로가는 최소 경로 단계를 구하세요. 이 문제는 완전 탐색이다. 최소 경로 단계를 구하는 문제이므로, BFS가 좀 더 바람직한 풀이방식인것같다. 그런데 DFS 구현 난이도가 훨씬쉽다.. DFS와 BFS 둘다 구현하는 코드를 작성해보겠다. DFS, BFS 공통부분: 문제의 조건중 단어가 1개만 바꿀수있으니 바꿀수있는지 검사하는 isChanged를 작성한다. DFS 접근법: DFS는 기본적으로 백트래킹을 사용하면서 Level(Depth 깊이)의 값을 표현할수가있다. DFS의 전략은 result의 크기를 매우크게잡아 목표값을 찾으면 result의 값을 Math.Min으로 갱신을한다. 이러면 최소경로가 ..

[프로그래머스,Java] Level3: 선입 선출 스케줄링

문제분석 목표: 작업들을 순서대로 넣으며 작업하다가 맨 마지막에 작업을 맡게되는 코어를 구하세요. 문제를 읽어보면 최적의 시간을 구하는 문제가 아니다. 0초에 코어가 비어있다면 무조건 작업을 넣어놓기때문이다. [1, 1, 100] 의 코어가 있고 4개의 작업이있다면 100의코어에 그냥 집어넣는꼴이다. 이를 감안하고 접근을해야한다. 문제접근 1: 문제설명서대로 풀기 0초에 모든 작업을 넣고 1초에 다시 작업이 가능한지 확인하고 2초에 다시 작업이 가능한지 확인하고 . . . 마지막 작업이 들어가면 그 코어를 반환하는 로직이다. 이렇게 구현하면 매 초마다 모든 코어를 돌려봐야하므로 O(n)만큼 든다. -> 정확도는 잘 나오지만 효율성 에러가 뜬다. 문제 접근 2: 효율성 해결 아마 효율성 에러가 뜨는 원인은..

[프로그래머스,JAVA] Level3: 입국심사

문제분석: 입국심사 게이트가 있는데 게이트마다 심사하는 시간이 다르다. 그리고 그 심사하는 시간이 최소가되는 시간을 구해달라 라는 문제다. 제한사항을 보면 사람과 심사시간의 주어진 수가 심상치않게 크다. 이 문제는 이분탐색을 사용해야만한다. 이분탐색이 무엇이냐? UP 앤 Down 게임이라고 생각하면 쉽다. 1~ 100 중에서 출제자는 랜덤한 숫자를 하나 고른뒤 맞추는 사람은 1~100숫자중에 랜덤한 숫자를 하나고르는 행위다. 만약 맞추는 사람이 50을 부르면, 출제자의 숫자가 1~49이면 Down , 51~100이면 UP을 외쳐야한다. 이 과정을 출제자의 숫자가 나올때까지 계속 반복하는 게임이다. 이분탐색이 이 알고리즘과 100%동일하다. UP 앤 DOWN의 원리대로 한번 구현해보자. 최소값을 0, 최대..

Querydsl 기능 (2)

Querydsl 서브쿼리 작성법이다. 서브쿼리를 작성하는법은 기존 네이티브SQL과 흡사하다. Querydsl의 Case작성방법이다. 간단한 Case문은 when()에다 조건문을, then() 에 결과를 넣으면된다. 그 밖의 결과값은 otherwise()를 사용한다. 좀더 복잡한 쿼리를 작성하고싶을땐 CaseBulder를 사용한다. CaseBuilder에는 between , gt, goe , lt, lot , ne , in, notin 등등 다양한 조건에대해 결과값을 넣어줄수있다. 쿼리dsl에서 고정적인 문자값 또는 상수값을 넣고싶다면 Expressions.constant()를 사용하자. 또한 조회한 값에 추가로 문자열을 붙이고싶다면 concat()을 사용하요 덧붙히면된다. 이 Querydsl의 기능은 만..

자바/JPA 2022.07.27

Querydsl 기능 (1)

Querydsl의 정렬기능 쿼리dsl 에서 정렬은 orderBy()로 정렬할수있다. 정렬의 조건은 여러개 설정할수있고, 첫 파라미터가 먼저 적용이된다. 사진은 1. 나이순으로 역순 2. 나이이름으로 오름차순이다. 쿼리 dsl 의 페이징기능이다. offset()은 페이지를 읽을 첫 시작점을, limit()는 몇개의 페이지를 읽을지 제한을 거는것이다. 쿼리 dsl에는 sum , avg , max, min, count 와같은 집합기능을 쓸수있다. select에 타입이 다양한 값이 들어오면, 자동으로 튜플형태로 리스트를 반환한다. 이럴땐 튜플을 꺼내와서 값이 정확한지 확인을 해봐야한다. 그룹핑을 할때, 일반 SQL문과같이 gruopBy를 사용한다. 이 쿼리는 잘보면 최적화가 되어있지않다. member -> te..

자바/JPA 2022.07.27

스프링 JPA Querydsl 소개

JPA의 데이터를 넣을때 쿼리문 , 즉 SQL문은 필수적인 요소다. 간단한 데이터 CRUD는 SQL문을 만들 필요가없지만, 다양한 조건과 테이블 병합, 최적화를 하려면 JPQL 과 Querydsl이 필요하다. JPQL vs Querydsl 전자에 써잇는 queryFactory(JPAQueryFactory)를 이용한 쿼리문이 Querydsl 후자에 써잇는 EntityManager를 이용한 createQuery가 JPQL이다. 둘 다 Member테이블에서 이름이 member1 이며, 나이 10을 뽑는 동일한 쿼리다. 둘 중에 추천하는것은 역시 Querydsl 이다. Querydsl의 눈에 띄는 장점은 역시 1.높은 생산성과 낮은 난이도이다. JPQL은 쿼리스트링을 작성할때, 한문자 한문자 일일이 다쳐야한다...

자바/JPA 2022.07.25

[프로그래머스,Java] Level3: 베스트앨범

문제분석: 문제 목표: 장르마다 최대 2곡씩 모아 베스트앨범을 만든다. 규칙1: 가장 많이 플레이된 장르를 우선한다. 규칙2: 장르내에서 가장 많이플레이된 노래를 우선한다. 규칙3: 플레이가 같으면 고유번호가 작은것을 우선한다. 풀이는 다양하게 존재한다. Map을 2개 작성하여, , 를 넣어서 풀어도된다. 근데 필자는 Map 1개로도 이 문제를 풀 수 있을것 같은것이다. 우선 객체 클래스 2개를 만들었다. 장르 클래스 하나 만들었다. 장르는 장르 이름과, 노래들의 리스트를 수록한다. 기본 생성자로 이름과 노래를 입력받아 자료들을 저장한다. 장르 안에 있던 Song 노래의 대한 객체이다. 노래는 각각 고유아이디와 플레이횟수를 가진다. 고유아이디는 노래가 새로 하나가 생설될때마다, Static 변수로 선언된..

스프링(Spring) JSon 역직렬화 문제 (중복배열)

문제 발생: JSon 파일의 정보를 Spring객체로 변환하는도중 중첩배열을 인식하지 못함. 분명히 이름은 잘 입력되는데 address타입과 같은 중첩 배열은 인식을못한다. Jackson 라이브러리를 검색해보고 이 사태를 해결할수있는 방법을 하나 찾았다. 바로 @JacksonCreater 사용하는것이다. 문제해결 @JsonCreator는 Json -> 자바객체로 역직렬화 해주는 어노테이션이다. 반대로 자바객체 -> Json으로 바꾸는건 직렬화 라고한다. 여기서 받는 파라미터는 각각 JsonProperty로 이름을 연결해준다. 실제로 잘 입력된다. 이외에도 JackSon 파일에 관해서 궁금한게있으면 JackSon 라이브러리를 참고하자. 아래링크는 JSon 라이브러리 번역을 잘해놓은 블로그 링크다. http..

반응형