[JAVA] 2632 - 피자판매 💛2 : 값이 아닌 경우의 수를 저장하자. + 원형 자료구조는 선형 자료구조로 피자!
·
Problem Solve
들어가며https://www.acmicpc.net/problem/2632A피자와 B피자가 여러 크기를 가진 여러 조각으로 나누어져있다. 이때 구매자가 원하는 N의 값을 만족하는 피자를 A에서 혹은 B에서 혹은 A,B에서 가져올 수 있다. 그때 구할 수 있는 모든 경우의 수를 구하면 되는 문제이다.본문으로정석적인 풀이는 모든 합의 경우의 수를 구하면 되지 않을까란 생각이 듦과 동시에 그러면 안된다는 생각이 들어야한다 ㅎㅎ. 그러면 정렬 후 투포인터로 하나씩 고르면 되지 않을까 싶은데,, 문제에서 "2조각 이상 판매할 때는 연속된 피자를 골라야한다" 라고 명시되어 있다. 이 조건 하나때문에 투포인터로 구현하기가 매우 어려워진다. 생각을 이어나가다 보면 각 피자의 값을 하나씩 고르는 방식으로는 구현이 너무너무..
[JAVA] 1700 - 멀티탭 스케줄링 💛1 : OS시간에 배웠던 Page Replacement 알고리즘 적용문제 (Optimal Page Replacement)
·
Problem Solve
들어가며https://www.acmicpc.net/problem/1700콘센트 구멍의 갯수 N개와, 앞으로 어떤 전기용품을 콘센트에 꽃을 것인지에 대한 순서 정보 K개가 주어진다. 이때 하나씩 플러그를 빼는 최소의 횟수를 정답으로 출력하는 문제다.본문으로딱 읽었을 때 좀 막막했다. 그리디하게 선택하는 문제인 것은 느낌이 오는데, 그리디의 대표 풀이법인 정렬, PriorityQueue를 적용할 부분이 보이지도 않았다. 그리고 가장 막막한것이 무엇을 먼저 빼야 부분 최적해인지 판별해내는 아이디어를 떠올리는 것 자체가 어려웠다.처음 생각했던 것은 기존 콘센트를 뽑아야하는 순간이 왔을때, 각 주어지는 종류와 순서를 저장하는 구조체 클래스를 만들어서 그것을 저장하는 인접리스트를 구현하고자 해봤는데... 구현자체가..
[JAVA] 14391 - 종이 조각 💛3 : 문제에서 주어지는 단어에 현혹되면 미궁으로 빠지는 문제. 본질을 위한 풀이를 작성하라!
·
Problem Solve
들어가며https://www.acmicpc.net/problem/14391주어지는 사각형을 원하는 1 * Y 혹은 X * 1로 잘라서 모든 직사각형의 합의 최댓값을 구하면 되는 문제이다. 딱 읽었을 때는.. 음~ 완탐문제 같은데..? 라는 생각을 가지고 풀이에 들어갔다... 재귀적 흐름을 코드를 나타내기 너무너무 어려웠던 문제기에 글을 써본다.본문으로일단 처음에는 가로의 경우의 수를 다 채운다음 남은 빈곳을 세로 경우의 수로 채워야겠다! 라고 생각하고 아래 풀이를 작성했다...(자세히는 보지 않아도 된다. 출력도 안되는 코드이다.. 그냥 이렇게 생각했었다.. 정도로 보면 된다.)public class Main { static int Y, X, ret; static String[][] maps;..
[JAVA] 14890 - 경사로 💛3 : 연습이 많이 필요한 빡구현 문제
·
Problem Solve
들어가며https://www.acmicpc.net/problem/14890문제를 간단하게 요약하자면, 행과 열이 각각 문제없이 지나갈 수 있는지 카운팅해서 그 지나갈 수 있는 길의 갯수를 출력해주면 되는 문제였다. 높이가 일정하다면 그냥 통과할 수 있는 길이지만, 3 3 2 2 3 3 같은 경우 길이가 2인 경사로를 두어서 지나갈 수도 있다.그래서인지 문제를 처음에 읽었을 때는 완탐 문제인줄 알고 풀이에 들어갔다. 구현하면서 시간 복잡도가 무조건 터질 거 같고 계속 이게 맞나? 라는 생각으로 구현을 이어갔다.(코테에서 이러면 그냥 망할듯... 문제 잘 읽자). 너무 이상해서 문제를 다시 이해해보니, 행과 열을 건널 수 있는지 따로 확인하는 문제였다!!본문으로아래는 정답 코드이다. 2시간동안 디버깅해봤는데..
[모던 자바 인 액션] 자바 생태계로 Deep Dive - (1)
·
Book
들어가며자바 공부를 계속 진행하다 보면 우리가 흔히 쓰는 일반 for문이 아니라 람다 표현식, 스트림, 컬렉션 API 등으로 이루어진 코드를 많이 접하게 된다. 더불어 AI들도 특히 Stream()문법으로 로직을 깔끔하게 제공해주기도 한다. 처음에는 많이 낯설었지만, 지금은 오히려 더 깔끔해보이기도 하고 성능까지도 좋다고 알고있다. 하지만 왜 좋은지 확신을 못하고, AI가 구현해준 자바 8 이후의 로직은 조금만 길어져도 와닿지 않는다. 시간이 없을때는 이해 못한 코드를 결과만 체크하고 PR을 올린 적도 있는 것 같다. 이런 것이 바이브하다고는 하지만 난 아직 이런 찝찝한 느낌이 너무 싫다.그래서 "자바 8 이후로 어떤 혁신이 있었기에 자바가 이렇게까지 유명해질 수 있었는가!" 를 잘 서술해놓은 모던 자바..
[JAVA] 자바 중첩 클래스(Nested Class), 지역클래스의 변수 캡처(Capture)와 함께 정리하며 람다의 출생 이유까지 알아보기
·
Java & Kotlin
들어가며클래스 안에 클래스를 두는 것을 중첩 클래스라고 하는데, 정의 자체만 알고 이를 어떨 때 사용하고 어떤 방식으로 클래스를 중첩시키는지 명확하게 알고 있지 않다. 그래서 이번 기회에 깊게 정리해보고자 한다!본문으로보통은 코테 문제에서 Node 구조체가 필요할 때 내부에 static class를 두었던 기억이 있다. 이때는 자바의 메인함수는 static이니 Node클래스도 static으로 올려야 활용할 수 있으니.. 그렇게 하자! 정도로 외우고 작성했었다.public class Main { static class Node { int x; int y; Node(int x, int y) { this.x = x; this.y..
[JAVA] split() 메서드 정복하기 (나는 왜 split(delimiter, -1)을 썻을까?)
·
Java & Kotlin
들어가며문자열을 쪼개야겠다 생각이 들면 split() 메서드가 떠오르기 마련이다. 우아한테크코스 프리코스 1주차 문제도 split() 메서드를 절묘하게 이용해야하는 문제였다. 그래서 이번 기회에 split() 메서드에 대해서 깊게 알아보고, 내가 코드에 인자로 -1을 넣은 이유도 블로그에 작성해볼까 한다. 본론으로자바의 String.split()은 정규식(regex) 을 기준으로 문자열을 잘라 문자열 배열을 반환한다.시그니처String[] split(String regex)String[] split(String regex, int limit)여기서 첫 번째 인자 regex는 정규표현식이다.두 번째 인자인 limit은 결과 배열의 길이/후행 빈 토큰 처리에 영향을 준다.limit > 0 : 최대 limit..
[JAVA] 정적 팩토리 메서드(Static Factory Method)란? (버거 먹고싶은 작성자와 스프링의 반환 방식을 곁들인)
·
Java & Kotlin
들어가며현재 우아한테크코스 8기 1주차 문제를 열심히 풀어보는 중이다! 1주차라 그런지 문제 자체의 난이도는 크게 어렵지 않다(?). 그래서 앞으로 어려워질 것을 대비해서 자바의 객체지향을 적극 활용할 수 있게끔 다양한 개념들을 적용해보며 구현중이다. 그 개념들을 내 것으로 만들 수 있게 자세하게 정리해본다!! 그중 가장 첫번째로 적용해본 개념이 정적 팩토리 메서드이다. 사실 전 기수의 코드들을 참고하며 작성하면서 되게 좋은 객체 생성 방법이다...!! 하고 썻었는데, 알고보니 엄청 유명한 객체 생성 패턴이었다. 이 개념을 적용해보면서 "객체 생성의 역할 자체가 중요한 경우" 라면 정적 팩토리 메서드를 고려해볼만 하구나!를 느꼈다. 정적 팩토리 메서드가 무엇인지 자세하게 적어보며 단점까지 알아보자!! ..