알고리즘 공부 150

파트1. 빈 칸 채우기 - 스택으로 큐 구현

문제 설명 스택 두개를 이용해 Queue 자료구조를 만들었을 때, Queue 자료 구조의 pop(또는 dequeue) 메소드를 구현하려합니다. Queue란 먼저 삽입한 데이터를 먼저 빼내는 자료구조를 뜻합니다. pop 메소드를 만들기 위해 다음과 같이 프로그램 구조를 작성했습니다. 1. 스택2가 비었다면 스택1에 아무것도 남지 않을때까지 스택1에서 pop한 값을 스택2에 push 한다. 2. 스택2에서 pop한 값을 리턴한다. 두 어레이리스트 stack1, stack2가 매개변수로 주어질 때, 두 어레이리스트를 스택으로 이용해 Queue 자료 구조의 pop 메소드를 구현하려합니다. 위 구조를 참고하여 코드가 올바르게 동작할 수 있도록 빈칸에 주어진 func_a, func_b, func_c 메소드와 매개변..

[백준 16929번] Two Dots - java

문제 설명 1. 공의 크기 X,Y 그리고 각 공들이 chr로 주어진다(문자열로 주어진걸 chr로 받는다.) 2. 같은 문자의 공들은 서로 연결 가능하다. 3. 공을 연결하여 사이클이 완성되도록(시작점부터 다른 점을 연결해 다시 시작점까지 연결될수 있도록) 할 수 있는지 구하면 된다. 4. 사이클의 크기는 4이상이 되어야 한다(가장 작은 사이클은 4이다. 연결점이 4개이기 때문) 풀이 과정 1. 기초적인 DFS문제에 적절한 조건을 추가한 문제이다. 난이도가 높은 편은 아니라 금방 이해할 수 있을 것이다. 2. 기존에 수행할 수 있는 DFS에 추가로 count(4이상으로), start Dot를 저장하여 비교하면 된다. 3. 즉 DFS를 수행하여 현재점부터 상하좌우로 이동하는 xTo, yTo를 만든 후, 그 ..

알고리즘 공부 2021.11.27

[백준 1018번] 체스판 다시 칠하기 - java

문제 설명 1. N, M크기의 체스판이 주어진다. 2. 8x8크기로 잘라서 위아래양옆으로 다른 색깔이 와야 한다. 3. 최소한으로 체스판을 칠하려면 어떻게 해야 하는지 구하면 된다. 풀이 과정 1. 간단한 브루트포스 문제이다. 2. 먼저 체스판의 색은 두 개이기 때문에 브루트포스를 진행하기 앞서 bit로 처리하기 위해 boolean값으로 바꾸어 준다. 물론 그냥 시간복잡도를 줄이기 위함으로 굳이 바꾸지 않아도 된다. 3. 전체 크기를 0,0위치를 기준으로 오른쪽, 아래 8칸씩 짤라서 진행한다. 체스판의 최대 X축의 길이가 N이라고 하면 N-8까지 잘라서 구하면 된다. 4. 여기서 나는 조금 새로운 방법으로 문제를 해결했다. -> 자르는 기준이 된 체스판의 기준으로 상하좌우는 그것과 달라야 한다. -> (..

알고리즘 공부 2021.11.21

[프로그래머스] H-Index- java

문제 설명 1. 논문의 인용 횟수가 적혀있는 citations배열이 주어진다. 2. 인용 횟수가 n번 이상인 논문이 n개일 때 최대의 n을 구하면 된다. ex) 3,4,2,3,3 -> 2번인용 1개, 3번인용 3개, 4번인용 1개 풀이 과정 1. 굉장히 간단한 배열 문제이다. 2. citations배열을 정렬해 준다. 참고로 내림차순배열하면 간단한데 나는 그냥 정렬해서 뒤에서부터 진행한다. 3. 어떤 논문이 N번 인용되었다고 하면 그 논문은 N-1번보다, N-2번보다, N-3번......보다 더 많이 인용되었다는 것이다. 4. 말하자면 4, 4, 3, 3, 2, 1, 1, 1 번 인용되었다고 하면 4번인용 -> 2개 3번인용 -> (2개) + 2개 2번인용 -> (2개 + 2개) + 1개 1번인용 -> ..

알고리즘 공부 2021.11.20

[백준 1302번] 베스트셀러 - java

문제 설명 1. 책의 개수와 팔린 책들이 주어진다. 2. 하루 동안 팔린 책들 중 가장 많이 팔린 책을 return하면 된다. 3. 같은 숫자가 팔렸으면 사전순으로 먼저 오는 것이 오늘의 베스트셀러이다. 풀이 과정 1. 해쉬맵과 트리셋을 이용했다. 2. 해쉬맵의 getOrDefault 메소드를 이용하여 해당하는 Key(책이름)의 Value(팔린개수)를 구해주었다. 3. 이후 해쉬맵을 Value기준으로 정렬하여 가장 많이 팔린 순서대로 배치했다. 4. 그 해쉬맵의 최대 개수 Value를 갖는 Key들을 순서대로 가져와서 TreeSet에 저장하면 가장 사전의 앞에 해당하는 값을 구할 수 있다. 코드

알고리즘 공부 2021.11.10

위클리 챌린지 끝 + 유종의 미

이번 10월 31일부로 모든 위클리 챌린지가 마무리되었다. 총 12개의 챌린지를 해결했고, 엄청 쉬운 문제부터 상당히 난이도 있는 문제들까지 나왔다. 아쉬웠던 부분은 로직보다는 구현에 관한 내용이 많아서 알고리즘 생각보다는 구현 방안에 초점이 맞추어져 있던 것 같다. 그래도 매번 연습하면서 아무리 어려워도 최대한 문제를 풀어 보기 위해 노력하였고, 그 결과 전체 풀이를 기간 안에 풀 수 있어 뿌듯했다. 그리고 가장 기뻤던 부분은 마지막주에 유종의 미를 거둘 수 있었던 것... 솔직히 말해서 해당 코드가 특출나게 효율이 좋다던지 독창적인 내용이 있는것 같지는 않았지만... 아무래도 동일한 코드가 여러개 제출된 걸 봐서는 블로그에 올린 글 덕분에 사람들이 코드를 이해하기 쉬웠어서 좋아요를 받았던 것 같다. ..

[프로그래머스] 최솟값 만들기- java

문제 설명 1. A와 B배열이 주어진다. 2. 각 노드별 곱한 숫자의 합을 구한다. 3. 다음 과정에서는 이전에 만들어진 숫자에 새로 (2번)과정을 반복한후 더한다. 4. 최소 숫자를 return 하면 된다. 풀이 과정 1. level2 문제라고는 생각도 들지 않을정도로 간단한 구현 문제이다. 2. A와 B를 모두 정렬해 준다. 3. A가 작은숫자이고 B가 큰숫자이면 된다. 4. 이유는 간단한데 앞에 올 숫자는 최소가 되어야 하는데, A의 숫자에 B의 숫자를 곱하는 것이다. 그래서 A는 앞에 무조건 작아야 하고, 뒤에 올 숫자가 지나치게 커지면 안된다. 5. 그렇게 곱한 숫자를 더해주면서 가면 된다. 워낙 간단한 문제라 따로 설명할 내용은 없을 듯 하다 코드

알고리즘 공부 2021.10.29

[프로그래머스] 더 맵게- java

문제 설명 1. 스코빌 지수, K가 주어진다. 2. 가장 작은 스코빌 지수부터 (최소값+2*최소다음값) 으로 더 큰 값을 만들 수 있다. 3. 스코빌 지수가 모두 K보다 크게 만드는 방법을 return하면 된다. 불가능하면 -1을 return한다. 풀이 과정 1. level2 문제라고는 생각도 들지 않을정도로 간단한 우선순위 큐 문제이다. 2. 우선순위 큐를 사용하면 작은 수부터 오름차순으로 배열된다. 3. 스코빌 지수를 작은 순서부터 꺼내가면서 더해줘서 구하면 된다. 4. 참고로 아무리 구해도 구할 수 없는 경우가 생기는데, 우선순위 큐의 크기가 1이 되면 구할 수 없는 것이므로 나가면 된다. 1) 맨 위 + 다음맨위*2 를 더해서 우선순위 큐에 넣는다. 2) 이걸 while이 K보다 작은 동안 계속 ..

알고리즘 공부 2021.10.27

프로그래머스 위클리 챌린지 12주차 - java

문제 설명 1. 피로도와 [필요피로도, 사용피로도]가 주어진다. 2. 던전을 도려면 필요피로도보다 피로도가 많아야 하고, 사용피로도는 그 던전을 돌면 소요된다. 3. 가장 많은 수의 던전을 도는 방법을 구하면 된다. 풀이 과정 // 마지막 위클리 챌린지이다. 그래서인지 굉장히 쉬운 문제로 장식했다. // 매우 간단한 브루트포스 - DFS or BFS 문제이다. 1. 모든 경우의 수를 탐색한다. 2. DFS를 돌면서 한번이라도 탐색한 곳은 다시 탐색하지 않고, 다른 모든 경우를 선택하여 진행한다. 3. 현재 피로도보다 필요 피로도가 크면 돌 수 없다. 4. 현재 피로도가 필요 피로도보다 많은 경우 방문하고, 이후 다시 해당 process를 반복한다. 5. 이걸로 구해진 경우가 끝나면 다시 방문을 하지 않은..

[프로그래머스] 오픈채팅방 - java

문제 설명 1. 배열에 id, 닉네임, 상태가 주어진다. 상태는 Enter, Leaver, Change이다. 2. Change를 사용하면 그 id를 사용하는 사람의 닉네임이 바뀐다. 3. 사람이 들어오고 나가는 결과를 바뀐 최종 닉네임에 따라 return 하면 된다. 풀이 과정 1. HashMap과 ArrayList를 통해 간단히 구현할 수 있다. 2. 해쉬맵에는 그 사람의 id를 키값, 닉네임을 value값으로 한다. 이렇게 하면 id의 value가 바뀔 때 마다 변경 하능하다. 3. ArrayList에는 그 사람의 id와 출입내역을 저장한다. 그러면 그 id의 사람이 나가거나 들어온 것들을 저장 가능하다. 4. 그럼 상태에 따라 변경하면 된다. 1) 입장한 경우 - HashMap에 id와 닉네임을 넣..

알고리즘 공부 2021.10.21