기록

    [프로그래머스,Level 2] 조이스틱(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제를 처음 읽고 이해하는 데 시간이 좀 걸렸다. 설명을 간단하게 풀어보면, 상하 방향은 단순히 알파벳을 변경하는 것이고 좌우 방향은 커서를 옮기는 것이다. 단, 여기서 말하는 커서는 우리가 일반적으로 생각하는 | 커서보다 직사각형 크기의 커서를 생각하면 편하다. 그리고 모든 이름의 첫 시작은 AAA로 시작하게 된다. 입력 예제 2를 통해 보면, 3자리의 이름인 JAN을 만들기 위해서는 AAA를 적절히 변형시켜야 한다. 첫 시작은 첫 번째 문자부터 이므로 초기 상태는 AAA 이 상태이다. 이 상태에서 첫 글자를 J로 바꾸면 JAA이고 여기서 왼쪽으로 한 번 옮기면 JAA 상태가 된다. 그 후, 마지막 글자를 Z로 바꾸면 JAZ가 되며 완성이 된다. 마지막으로 이 문제에서 원하..

    [프로그래머스,Level 2] 큰 수 만들기(JAVA 구현)

    - 첫 풀이 첫 풀이에서는 문제에서 제공하고 있는 예제의 경우를 자세히 읽지 않아 삽 좀 펐다. 1924에서 발생할 수 있는 가지 수를 보면, 각 자리의 숫자들의 순서는 정해져 있다는 사실을 알 수 있다. 즉, 1924에서 2와 4를 제거하더라도 1과 9의 순서는 유지되어 91은 불가능하고 19만 가능하다는 의미이다. 이를 알아차리고 다시 재귀를 이용해 풀어보려고 했다. 하지만 결과는 시간초과, 런타임 에러, 메모리 초과 등의 에러 파티였다. 이에 머리 아파 다른 분들의 풀이에서 힌트를 좀 얻었다. - 정답 풀이 다른 분들의 풀이를 두루 살펴보면 스택을 사용하기도 하고 2중 반복문을 이용하기도 하는 등 다양한 풀이가 존재했다. 너무 복잡해 여러가지 글을 읽어보던 중, 만들어야 하는 자릿수에 대한 설명이 ..

    [프로그래머스,Level 2] 더 맵게(JAVA 구현)

    - 첫 풀이 및 정답풀이 처음에 문제를 자세히 읽지 않고 코딩을 하는 바람에 다른 로직을 생각했지만, 다시 읽어보아 이 문제가 원하는 반환 값을 파악했다. 이 문제가 원하는 것은 데이터로 전달되는 스코빌 지수를 정해진 공식을 이용해 계산하여 모든 스코빌 지수가 K이상이 되는 최소 계산횟수이다. 또한, 주의해야 할 부분은 모든 음식의 스코빌 지수를 K 이상으로 만들 수 없는 경우에는 -1을 반환이라는 부분이다. 우선순위 큐를 사용한다면, 전달된 스코빌 지수가 항상 가장 낮은 값을 받아올 수 있기 때문에 이를 이용한다. 이러한 특성을 이용해 peek() 메서드로 우선순위가 가장 높은 것을 참조했을 때 K보다 낮은 값이라면, 문제의 공식을 이용해 다시 큐에 넣어주는 과정을 수행한다. 예제를 통해 살펴보면, 1..

    [프로그래머스,Level 2] 가장 큰 수(JAVA 구현)

    - 첫 풀이 이 문제는 바로 직전에 풀었던 소수 찾기 문제와 같은 방식으로 풀어보고자 했고, 테스트 케이스 역시 통과할 수 있었다. 그러나 제출 후 채점을 한 결과는 처참했다. 이후 문자열을 연결 처리하는 과정에서 매 번 새로운 객체를 생성해내는 String을 대신해 하나의 객체에 지속적인 갱신이 가능한 StringBuilder를 사용해 풀어보고자 했지만 잘 풀리지 않았다. - 정답풀이 결국 다른 분들의 풀이를 참고했더니 특정 기준으로 배열을 정렬하는 Comparator을 이용하는 것을 보고 이와 관련해서 생각하니 쉽게 풀 수 있었다. 예제 입력 1의 경우 6, 10, 2가 있을 때 두 개씩 생각해보면 6+10인 610과 10+6인 106을 비교하면 610이 더 크므로 자리를 바꿀 필요가 없다. 이러한 ..

    [프로그래머스,Level 2] 소수 찾기(JAVA 구현)

    - 첫 풀이 및 정답풀이 이 문제를 읽으면서 어떻게 풀이를 해야 할지 감은 잡혔지만, 이를 구현하는데 꽤 애를 먹었다. 처음 구상한 풀이는 아래와 같다. 1. 주어지는 numbers변수의 각 문자열로 만들 수 있는 모든 숫자를 구하는 로직 구현. ex) 예제 1의 17의 경우 = { 1, 7, 17, 71} 2. 만들어진 각 숫자가 소수인지 판별하는 로직 구현. (이 부분에서 '에라토스테네스의 체' 알고리즘과 일반적인 소수 판별 로직 중에서 고민을 하여 후자를 택했다.) 위의 과정에서 1번 로직을 재귀를 이용해 구현하는 부분에서 시간이 좀 걸렸다. 반면에 2번 로직은 간단하기 때문에 빠르게 마무리할 수 있었다. import java.util.ArrayList; class Solution { // 소수의 ..

    [프로그래머스,Level 2] 문자열 압축(JAVA 구현)

    - 첫 풀이 문자열 관련 문제에 약해서 이리저리 만져보려고 했지만, 잘 풀릴 기미가 보이지 않아 다른 분들의 풀이에서 힌트를 좀 얻고자 했다. 대부분의 분들이 substring() 메서드를 이용해 풀이를 하고 있었고, 풀이 방법이 다양해 필자는 substring()을 나만의 방식으로 이용해 보고자 했다. 문제에 조건대로 이리저리 건드려 보았더니 다른 분들의 풀이에서 본 수식과 동일한 형태가 나오기 시작하였고, 해결할 수 있었다. - 정답풀이 우선 이 문제의 핵심은 substring(begin, end) 메서드라고 생각된다. substring() 메서드는 begin에 시작 인덱스, end에 끝 인덱스를 입력하면 begin 인덱스 ~ (end 인덱스-1)까지의 문자열을 반환한다. 그리고 든 처음 생각은 su..

    [프로그래머스,Level 2] 카카오프렌즈 컬러링북(JAVA 구현)

    - 첫 풀이 및 정답풀이 우선 주의해야 할 점은 이 문제는 예제 입출력으로 주어진 데이터와 실제 예제 코드를 실행시켰을 때 다른 데이터가 들어온다. 보이는 바와 같이 문제에서 설명하고 있는 예제 입출력과 다른 것을 확인할 수 있다. 그렇기 때문에 코드를 짤 때 이를 참고하고 짜는 것이 좋을 것 같다. 본인은 문제에서 제시하는 예제를 바탕으로 짰는데 다른 결과가 나와 놀랐기는 했지만, 어쨌든 제대로 동작하였다. 또한 필자는 문제를 이해하는 데 시간이 좀 걸렸는데, 자세히 설명이 안 나와 있어 그런지 아니면 본인이 이해력이 부족한 건지는 모르겠지만 정리해보면 이 문제에서 말하는 '영역'은 같은 색깔로(여기선 정수로 표현하므로 같은 정수) 상, 하, 좌, 우 연결되어 있다면 하나의 영역으로 간주한다는 것이다...

    [프로그래머스,Level 2] 삼각 달팽이(JAVA 구현)

    - 첫 풀이 처음 풀 때 무슨 규칙이 있을까 하고 찾아보았지만, 본인이 못 찾는 건지 규칙이라고는 발견할 수 없었다. 다른 분들의 풀이 또한 특별한 규칙이 있는 것이 아닌, 문제 자체에서 제시하는 조건을 이용해 푼 사람들이 많았다. - 정답풀이 이 문제는 문제에서 제시하는 것처럼 반시계 방향으로 숫자를 증가시켜주면 된다. 데이터의 저장은 2차원 배열을 왼쪽 정렬하면 표현할 수 있으며, 아래 및 오른쪽 진행은 각각 행, 열이 증가하고 대각선 좌상 향은 행, 열이 모두 감소한다는 점을 조건으로 잘 사용하면 된다. 또한 규칙을 찾으면서 발견할 수 있었던 점을 활용하였는데, n이 4일 때 반시계 방향으로 진행할 때 1~4까지 아래 방향으로 수행한 뒤, 5~7까지 오른쪽 방향으로 수행한 뒤, 8~9까지 좌상 향 ..

    [프로그래머스,Level 2] 프린터(JAVA 구현)

    - 첫 풀이 문제를 읽는 순간 우선순위 큐가 생각나기는 했지만, 사용해본 적이 없어서 관련된 내용을 간단하게 찾아보았다. 처음 생각으로는 문서의 위치로 주어지는 location으로 인해 우선순위 큐에 우선순위, 인덱스를 필드로 가지는 클래스를 삽입하여 Comparable 인터페이스를 이용하는 방법을 생각해 보았는데, 생각대로 정렬이 되지 않아 다른 방법을 찾아보았다. - 정답풀이 다른 분들의 풀이를 참고하여 이 문제는 우선순위 큐를 별도의 정렬을 할 필요가 없이 내림차순 정렬한 뒤, priorities 배열을 탐색하며 큐에서 나오는 값과 location이 일치하는 경우를 찾으면 되었다. 예제 2번을 기준으로 생각해보자. 1. priorities = 1, 1, 9, 1, 1, 1 6개의 대기목록이 존재한다..

    [프로그래머스,Level 2] 주식가격(JAVA 구현)

    - 첫 풀이 및 정답풀이 문제에서 주어지는 prices배열은 1초가 지난 시점의 주식 가격이 담겨 전달되며, 문제에서 원하는 리턴 값은 각 초에 기록된 주식 가격이 몇 초 뒤에 낮아지는지에 대한 값이다. 시간은 뒤로 가지 않기 때문에 하나의 기준점을 잡고 해당 기준점의 나중에 기록된 주식가격을 비교해보면 된다. ex) 1초의 가격 1 기준으로 2초,3초....5초의 가격들과 비교한다. 리턴 값을 구하는 것은 비교지점의 인덱스 - 기준점의 인덱스로 구할 수 있으며 가격이 낮아지는 경우는 n초 뒤의 가격이 낮아지는 순간에 반복문을 벗어나면 구할 수 있다. class Solution { public int[] solution(int[] prices) { int[] answer = new int[prices.l..