전체 글 348

[프로그래머스] 짝지어 제거하기 - java

문제 설명 1. 문자열이 주어진다. 2. 문자열은 두개가 같으면 서로 사라지고, 그 앞뒤의 문자가 다시 붙는다. 3. 이게 끝까지 진행되어 모든 문자열이 사라지면 1, 남은 문자가 있으면 0을 return하면 된다. 풀이 과정 1. 선입 후출법을 통해 구현 가능하다. 2. -> 가장 최근에 넣은 값 - 다음 값이 같은 경우 : 가장 최근에 넣은 값 삭제 -> 가장 최근에 넣은 값 - 다음 값이 다른 경우 : 다음 값을 넣기 3. 위의 process를 전체 문자열의 길이만큼 진행하면 구할 수 있다. 근데 솔직히 이게 왜 level2인지는 모르겠다... level1중에 이것보다 어려운 문제가 있던 것 같은데 코드

알고리즘 공부 2021.06.25

[프로그래머스] 소수 만들기 - java

문제 설명 1. 배열이 주어진다. 2. 배열의 숫자들은 1000이하의 서로 다른 숫자이다. 3. 배열의 숫자들 중 3개를 더해 소수가 되는 경우의 개수를 return하면 된다. 풀이 과정 1. 아리스토텔레스의 체를 이용하여 해당하는 위치가 맞는지 구하면 된다. 2. 1000이하의 서로 다른 수이기 때문에 최대 숫자를 1000+999+998이다. 체의 크기를 그걸 기준으로 정하면 된다. 3. 숫자는 1부터 세고, 나는 보기 좋게 3000을 기준으로 잡았다. 코드

알고리즘 공부 2021.06.22

[프로그래머스] 키패드 누르기 - java

문제 설명 1. 왼손은 *, 오른손은 #에 위치한다. 2. 1 4 7은 왼손, 3 6 9는 오른손으로 누른다. 3. 2 5 8 0은 둘 중 가까운 손으로 누른다. 거리가 같은 경우 오른손잡이인지 왼손잡이인지에 따라 누른다. 4. 누르는 순서를 return하면 된다. 풀이 과정 1. 좌표를 통해 간단히 구현 가능하다. 2. 그런데 이중배열을 사용하지 않아도, 가로 거리와 세로 거리를 더해주면 된다. 3. 따로 구하는 이유는 세로 거리의 경우 어차피 0, 1의 차이밖에 나지 않기 때문이다. 4. 몇 가지 반례에 맞추어 조금만 추가하면 된다. 5. 구현하기는 쉽지만 생각해내지 못하는 경우 코드를 보고 이해하기 어려울 것이라 생각해서 최대한 설명을 자세히 적었고, 풀이를 쪼개서 진행하였다. 코드

알고리즘 공부 2021.06.20

[백준 15486번] 퇴사2- java

문제 설명 1. 전체 기간, (한 상담당 필요시간, 받는 돈)이 주어진다. 2. 모든 상담을 합쳐도 전체 기간을 넘어서는 안된다. 3. 상담을 통해 벌 수 있는 최대 금액을 return하면 된다. 풀이 과정 1. DP를 통해 구현 가능하다. 2. 전체 기간에 대해 날짜별로 구할 수 있는 최대 금액을 모두 구한다. 3. 예를들어 1일째에는 10원, 2일째에는 25월, 3일째에는 40원....이런 식으로 구해서 날짜별로 구해, 최대 금액이 ans이 될 것이다. 4. 최대 기간을 넘지 않는 선에서 과거 시간 + 해당 상담으로 벌 돈을 구하면 값이 나올 것이다. ex ) 10일 - (3, 10) (5, 20) (1, 10) (1, 20) (2, 15) (4, 40) (2 200)인 경우 1일 (3, 10) ->..

알고리즘 공부 2021.06.07

[백준 10775번] 공항 - java

문제 설명 1. 공항 자리와 비행기 수가 주어진다. 2. 각각 비행기가 도킹 가능한 자리의 개수가 주어진다. 1이면 1번, 2면 1,2번, 3이면 1,2,3번....이렇게 도킹 가능하다. 3. 비행기는 순서대로 들어오고 더이상 도킹이 불가능하면 공항이 폐쇄되어 process가 종료된다. 풀이 과정 1. 생각보다 간단히 구현 가능하다. 2. 비행기가 들어오게 되면 해당 비행기는 입력된 숫자 안의 모든 장소에 도킹 가능하다. 3. 그런데 앞이나 뒤에 비행기가 어떻게 들어올지 모르기 때문에, 도킹 가능한 최대 숫자에 도킹을 하면 될 것이다. 4. 즉, 입력된 숫자로부터 가장 아래까지 판단하여 자리가 있으면 그곳에 도킹하면 된다. 자리가 없으면 종료한다. 코드

알고리즘 공부 2021.05.28

[백준 16953번] A -> B - java

문제 설명 1. A, B가 주어진다. 2. A의 숫자의 앞에 1을 더하거나, 2를 곱한다. 3. 이 계산을 반복하여 B를 만드는 최소 횟수를 return하면 된다. 풀이 과정 1. 간단한 DFS문제이다. 2. 계속 두 가지 연산을 진행하며 level을 하나씩 올려준다. 3. 원하는 숫자를 만들어내면 가장 작은 숫자를 return하고, 더 커지면 나가면 된다. 4. 모든 경우를 진행해도 숫자를 만들 수 있는지 없는지를 boolean을 사용하여 구하면 된다. 코드

알고리즘 공부 2021.05.20

[백준 2608번] 로마 숫자 - java

문제 설명 1. 로마 숫자 2개가 주어진다. 2. 각 숫자들은 해당 방식으로 주어진다. 3. 작은 숫자가 큰 수 전에 오는 경우는 한 경우밖에 없으며, 해당 경우 큰 수에서 작은 수를 빼 준다. ex ) IV -> 4, XC -> 9, CM -> 900 4. III의 경우 3이 되며, 같은 알파뱃은 3번 연속으로 사용할 수 있다. 5. V, L, D는 한 번 밖에 사용할 수 있다. 풀이 과정 1. [1, 2, 3, 4, 5] 다섯 가지를 구하는 모든 방법이 존재한다. 2. java에서 문자열을 변경하는 방법을 사용하면 IV, XC처럼 특수한 경우를 쉽게 구할 수 있을 것이다. 3. 예를 들어 IV -> A, XC -> B로 하면 [A=4] [B=9] 이렇게 바로바로 판단 할 수 있을 것이다. 4. 이런 ..

알고리즘 공부 2021.05.16

[백준 1806번] 부분합 - java

문제 설명 1. 전체 숫자 N, 만들어야 하는 숫자 S가 주어진다. 2. N개의 숫자가 주어지고 숫자는 순서대로 더할 수 밖에 없다 3. S를 만들 수 있는 최소한의 숫자 개수를 return한다. 만약 만들지 못하면 0을 return한다. 풀이 과정 1. 연속된 순서를 구하는 방법은 다음과 같다. - 0번 인덱스부터 수를 더해 합이 S가 될 때까지 진행한다. - 숫자의 합이 S가 되면 지금까지 더한 숫자의 맨 앞 인덱스를 지우고 다시 판단한다. - 숫자를 뺀 뒤에도 S보다 숫자의 합이 더 크면 이전 단계를 다시 진행한다. - S보다 작아진 경우, 다음 인덱스를 더해 준다. 2. 이 방식을 통해 구할 수 있을 것이다. 3. 예를 들어 10 글자로 15를 만들려 한다면 ex ) - N = 10, S = 15..

알고리즘 공부 2021.05.10

[백준 1700번] 멀티탭 스케줄링 - java

문제 설명 1. 전체 플러그 개수 N, 전기용품 개수 K가 주어진다. 2. K개의 전기제품을 순서대로 플러그에 꽂을 것이다. 3. 가장 최소한으로 플러그를 뽑는 경우를 return하면 된다. 풀이 과정 1. 먼저 순서대로 플러그에 꽂아 준다. 2. 플러그와 전기용품을 확인해서 가장 적게 뽑는 방법을 구하면 된다. 3. 여러 가지의 경우의 수를 확인해서 풀어야 할 것이다. - 플러그가 이미 꽂혀져 있는 경우 그냥 기기를 쓰면 된다. - 플러그를 뽑아야 하는 경우 다시는 안쓰는 기기를 뽑으면 된다. - 모두 쓰게 되는 경우 가장 나중에 쓰게 되는 기기를 뽑으면 된다. 4. 각각의 풀이에서 순서대로 Grid로 진행하는데, 경우의 수를 고려해야 한다. 풀이(경우의 수 기입) 1. 먼저 플러그가 비어 있으니 전기..

알고리즘 공부 2021.05.09

[백준 1062번] 가르침 - java

문제 설명 1. 전체 단어 N, 가르칠 수 있는 글자 K가 주어진다. 2. 모든 단어는 'anta'로 시작되고, 'tica'로 끝난다. 3. 학생이 배울 수 있는 최대 단어의 개수를 return한다. 풀이 과정 1. 먼저 'a', 'n', 't', 'i', 'c' 다섯 글자는 공통적으로 들어가야 한다. 2. 기준을 글자로 잡고, 글자들에 따라 배울 수 있는 단어들을 return하면 될 것이다. 3. 예를 들어 7글자를 가르치고, 3개의 단어라고 한다면 ex ) - 위의 5글자는 무조건 배우게 된다. - 따라서 추가로 2글자를 더 배우는 모든 경우를 구하면 될 것이다. a~z까지 확인하여 배우지 않은 경우 가르친다. 1 - 'a' 'b' 'c' 'd' 'n' 't' 'i' 2 - 'a' 'b' 'c' 'e..

알고리즘 공부 2021.05.09