목록Algorithm (32)
olrlobt

https://www.acmicpc.net/problem/2437 🔒 골드2 - #2437 저울 📌 테스트케이스 추가 힌트 7 1 1 1 3 5 13 16 = 12 3 1 2 3 = 7 1 1 = 2 2 2 2 = 1 ✍️ 풀이법 처음에는 단순하게 추를 이용해서 1을 만들고, 2를 만들고, 3을 만들고 ... 이런 식으로 생각했었다. 하지만 추를 무게 순으로 정렬하더라도, 내가 원하는 답을 얻기 힘들다는 생각에 추가 테스트 코드를 만들어보며 좀 더 고민 해 보았다. 그 결과 내가 찾은 규칙은 다음과 같았다. 7 1 1 1 3 5 13 16 = 12 해당 테스트케이스에서 뒤에서부터 1보다 작거나 같은 값을 찾으면 세번째 (= index 2) 1에서 찾아지게 된다. 그 값의 이전 index 값들의 합은 만들..

https://www.acmicpc.net/problem/12904 🔒 골드5 - #12904 A와 B 📌 테스트케이스 추가 힌트 B ABABABAB = 0 A A = 1 ABB AB = 0 ✍️ 풀이법 문제는 주어진 첫 번째 문자열을, 두 가지 규칙으로 두 번째 문자열로 만드는 것이므로, 간단하게 반대로 수행하는 것으로 해결하였다. 여기서 주의할 점은 예외를 찾는 부분이었다. 처음부터 성공하는 값이 들어오거나, 한 자릿수 값이 들어오거나, 첫 번째 문자열이 두 번째 문자열보다 크거나, 등등 예외를 잘 생각해서 처리해 주어야 한다. 따라서, 풀이법은 1. 두 번째 문자열을 뒤에서부터 A가 없을 때까지 A를 지운다. 2. B를 지우고, 문자열을 뒤집는다. 3. 위의 과정을 반복하여, 첫 번째 문자열보다 같..

https://www.acmicpc.net/problem/2212 🔒 골드5 - #2212 센서 📌 테스트케이스 추가 힌트 6 2 1 6 3 3 4 3 = 3 9 3 1 3 5 5 8 9 10 11 16 = 7 ✍️ 풀이법 문제를 보자마자, 정렬은 해 놓아야 한다고 생각했다. 그 후, 임의로 몇 개의 테스트케이스를 만들면서 푸는 방법을 생각해 보았다. 먼저 첫번째 테스트 케이스 6 2 1 6 3 3 4 3 = 3 이해를 위해 그림으로 나타내면 다음 사진과 같고, 집중국 2개가 위치해야 될 곳은 다음 사진과 같다. 위 그림을 보면 알 수 있는 것은 A) 집중국은 센서 위에 위치해야 한다. - 센서 위에 있어야 하나의 센서라도 감지 영역을 0으로 만들 수 있다. B) 집중국의 개수대로 센서 뭉텅이가 생긴다...
🔒 골드4 - #14500 테트로미노 https://www.acmicpc.net/problem/14500 ✍️ 풀이법 해당문제는 간단하게 해석하자면, 4개의 붙어있는 숫자들의 합이 가장 큰 값을 찾는 문제였다. 모든 경우의 수를 다 돌아야 답을 구할 수 있기 때문에 DFS를 사용하였으며, 시작 좌표에서부터 DFS를 시작하기 때문에, 배열을 복사해서 넘겨주면서 풀었다. 풀이는 간단히 처음 시작한 자리에서 오른쪽 > 아래쪽 > 왼쪽 순으로 검증을 진행하면 풀겠다고 판단하여, 바로 풀이를 진행했다. 하지만, 테스트케이스 3번의 예제처럼 ㅏ ㅓ ㅗ ㅜ 의 경우에 대한 생각을 못한 풀이법이었고, 3번의 경우를 해결하기 위하여 solve() 하단부분의 if 문으로 깔끔하지는 못하게 해결한 문제였다. 🗝️ 풀이 im..
🔒 2단계 - k진수에서 소수 개수 구하기 📌 테스트케이스 추가 힌트 1번, 11번에서 런타임 에러가 난다면, Parameters n 1000000 k 2 Return X n값에 최대값을 넣어 값이 잘 나오는 지 확인해 보고, 숫자가 넘어가는 과정을 생각해본다. ✍️ 풀이법 해당 문제에서 [211,2,11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때] 라는 문구는 10진법으로 변환하라는 것이 아니라는 것에 주의한다. 1. 주어진 n을 k진법으로 변환한다. 변환을 할때, n을 k로 나눈 나머지를 이어 붙여서, 뒤집어 주어야 k진법으로 완벽히 변환 된다. 2. k진법으로 변환한 수를 0으로 split한다. 3. split 한 문자열을 10진법으로 보았을때, 소수인지 판별한다. (2진법 11을 10..
🔒 2단계 - n^2배열 자르기 입출력 예시 📌 테스트케이스 추가 힌트 해당 문제는 gif 설명이 잘 되어 있어, 추가 테스트 케이스가 필요하지 않았다. ❌ 풀이법 #메모리 초과 실패 해당 문제는 알고리즘을 생각 할 필요 없이, 애니메이션으로 잘 보여주고 있기 때문에 입출력 예시를 그대로 코드로 옮겼다. 하지만, 공간복잡도와 시간 복잡도를 생각하지 않는 방법이기 때문에 메모리 초과 실패와 시간초과 실패를 겪었다. ❌ 풀이 #메모리 초과 실패 import java.util.*; class Solution { public int[] solution(int n, long left, long right) { int[] answer = new int[(int)(right-left+1)]; List rows = n..
🔒 2단계 - 괄호 회전하기 📌 테스트케이스 추가 힌트 해당 문제는 추가 테스트케이스가 필요하지 않았다. ✍️ 풀이법 나는 이 문제를 보자마자, 스택으로 해결해야 하는 문제라고 생각했다. 문제를 이해하는 것 자체는 최단시간이 걸렸지만, 문제를 해결함에 있어서 생각해야 할 것들이 있었다. - 생각 해야 할 것 1. 열리는 괄호와 닫히는 괄호를 어떻게 매치하여 줄 것인가. 해당 문제에서 무턱대고 열리는 괄호 '(' 가 닫히는 괄호 ')'를 만난다는 if문을 사용하게 되면, 문제는 당연히 해결이 가능하지만 코드 자체는 매우 더러워 질 것이다. 2. 문자열 s를 돌리는 방법 단순히 substring을 사용하여 쪼갠다면, 문제 해결은 가능하지만 객체 생성을 많이 반복하게 되어, 좋지 ..
🔒 2단계 - 캐시 🤔 문제 이해 해당 문제는 CACHE와 LRU(Least Recently Used)에 관한 이해가 필요했다. 흔히 아는 CACHE. 내가 이미 방문한 홈페이지를 재방문한다면 처음 이 페이지를 방문했을때보다, 일찍 로드 된 것을 느껴본 적이 있을 것이다. 이것이 CACHE가 페이지가 저장되어 있기 때문. LRU는 캐시에 대한 알고리즘으로, CACHE가 꽉 찼을때, 가장 오래된 CACHE를 제거하는 기법이다. 이 문제에서는 CACHE HIT 과 CACHE MISS만 파악하면 된다. 아래 그림에서 HIT이라 쓰여진 부분이 HIT, 글씨가 없는 부붙이 MISS 이다. 간단히, 이미 캐시에 저장되어 있는 자료라면, HIT을 발생시킨다. 예로, 그림 3번째 줄 부분을 보면, 이 전 CACHE [..