본문 바로가기

전체 글

백준 - 20166 문자열 지옥에 빠진 호석(Java) https://www.acmicpc.net/problem/20166 20166번: 문자열 지옥에 빠진 호석 K개의 줄에 걸쳐서, 신이 좋아하는 문자열을 만들 수 있는 경우의 수를 순서대로 출력한다. www.acmicpc.net 구현 문제입니다. 문제 구현 순서는 다음과 같습니다. 신이 좋아하는 문자열의 길이가 1~5이기 때문에, 격자에서 길이가 1~5인 문자열 모두를 만든다. 문자열을 만드는 탐색은 8방향으로 한다. 범위가 벗어나면 반대편으로 이동하게 조정한다. 문자열의 중복 개수를 map에 저장한다. 만들어진 문자들과 신이 좋아하는 문자와 비교해서 답을 도출한다. [구현 코드] import java.util.*; import java.io.*; public class Main { private stat.. 더보기
백준 - 5430 AC(Java) https://www.acmicpc.net/problem/5430 5430번: AC 각 테스트 케이스에 대해서, 입력으로 주어진 정수 배열에 함수를 수행한 결과를 출력한다. 만약, 에러가 발생한 경우에는 error를 출력한다. www.acmicpc.net 구현 문제입니다. 문제 접근 순서는 다음과 같습니다. R이면 방향을 바꾼다. D이면 포인터를 옮겨 범위를 줄인다. 정방향일 경우 왼쪽의 포인터를 옮겨 범위를 줄인다. 역방향일 경우 오른쪽의 포인터를 옮겨 범위를 줄인다. Deque를 통해 문제를 해결할 수도 있겠지만, 배열을 사용해 처리 속도를 높였습니다. [구현 코드] import java.util.*; import java.io.*; public class Main { public static voi.. 더보기
프로그래머스 - 광물 캐기(Java) 구현 문제입니다. 문제 접근 순서는 다음과 같습니다. bfs로 곡괭이를 선택하는 모든 경우의 수를 구한다. 선택된 곡괭이로 광물을 앞에서 부터 5개 캔다. (피로도를 누적한다.) 사용된 곡괭이의 개수를 줄인다. 모든 광물 캐거나, 사용할 곡괭이가 없으면 해당 탐색을 종료한다. (최소 피로도를 갱신한다.) 피로도 계산은 곡괭이보다 단단한 광물을 캘 경우 그 단계에 따라 5의 제곱씩 증가됩니다. [구현 코드] import java.util.*; import java.util.function.Predicate; class Solution { public int solution(int[] picks, String[] minerals) { Queue mineralOrder = new LinkedList(); fo.. 더보기
백준 - 13460 구슬 탈출 2(Java) 구현 문제입니다. 구슬이 상, 하, 좌, 우로 움직였을 때 모든 경우를 bfs로 완전 탐색으로 해결했습니다. [구현 코드] import java.io.*; import java.util.*; public class Main { private static final String SEPARATOR = " "; private static int n, m; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(Syste.. 더보기
프로그래머스 - 당구 연습(Java) 구현 문제입니다. 이 문제를 해결하기 위해서는 한 가지 수학적 아이디어가 필요합니다. 입사각과 반사각이 같으면, 아래 그림과 같이 네 방향으로 대칭 이동을 할 수 있습니다. 즉, 공(ball)을 네 방향으로 대칭이동 시켜 최소 직선 거리를 구하면 됩니다. 주의해야할 점이 있습니다. 그림의 2번은 불가능합니다. 2번과 같이 파란색 공이 움직이면 벽보다 빨간색 공에 먼저 맞기 때문입니다. 때문에 두 공이 선 대칭 일 경우, 움직이는 공이 벽보다 다른 공에 먼저 맞는 경우를 제외해야 합니다. [구현 코드] import java.util.*; class Solution { public static int[] solution(int m, int n, int startX, int startY, int[][] bal.. 더보기
프로그래머스 - 리코쳇 로봇(Java) bfs 문제입니다. 최소로 움직이는 횟수를 구하는 문제이기 때문에 bfs를 사용해야 한다는 것을 알 수 있습니다. 이 문제는 로봇이 상, 하, 좌, 우로 움직이되 벽이나 장애물(D)을 만나야 움직임을 멈춤니다. while (inRange(nx, ny) && board[nx].charAt(ny) != 'D') { nx += dx[i]; ny += dy[i]; } 즉, 지나가는 경로에 골인(G) 지점이 있더라도 도착한 것이 아닙니다. 로봇이 멈추는 곳이 골인 지점이여야만 합니다. [구현 코드] import java.util.*; class Solution { private final int[] dx = {-1, 1, 0, 0}; private final int[] dy = {0, 0, -1, 1}; priv.. 더보기
백준 - 20056 마법사 상어와 파이어볼(Java) 구현 문제입니다. 구현 순서는 다음과 같습니다. 모든 파이어볼이 자신의 방향 di로 속력 si칸 만큼 이동한다. 중복된 위치의 파이어볼을 합치고 분해한다. 남아있는 파이어볼의 질량을 더한다. 첫 번째는 이동했을 때 위치가 배열 밖에 있을 수 있다는 것을 유의해야 합니다. 문제 조건에 의해 1번 행, 열은 N번 행, 열과 연결되어있습니다. 때문에, 배열 범위를 벗어나면 반대편으로 이동시켜야 합니다. 두 번째는 삼차원 배열을 사용했습니다 자세한 것은 주석으로 달아놨으니 읽어보시기 바랍니다. 세 번째는 남아있는 파이어볼의 중량(m)만 더하시면 됩니다. [구현 코드] import java.io.*; import java.util.*; public class Main { private static final in.. 더보기
백준 - 14890 경사로(Java) https://www.acmicpc.net/problem/14890 14890번: 경사로 첫째 줄에 N (2 ≤ N ≤ 100)과 L (1 ≤ L ≤ N)이 주어진다. 둘째 줄부터 N개의 줄에 지도가 주어진다. 각 칸의 높이는 10보다 작거나 같은 자연수이다. www.acmicpc.net 구현 문제입니다. 구현 순서는 다음과 같습니다. 이차원 배열에서 가로, 세로 행을 따로 추출한다. 추출된 배열의 높이가 같은지 확인한다. 높이가 같지 않다면 경사로를 겹치지 않게 설치할 수 있는지 확인한다 경사로를 겹치지 않게 설치할 수 있다면 설치한다. [구현 코드] import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; public c.. 더보기