본문 바로가기

Algorithm

[BOJ 20056] 마법사 상어와 파이어볼 파이어 볼이 이동하고, 조건에 따라 합쳐진 후 분리 된다. 조건 파이어 볼은 위치(r,c), 질량(m), 속도(s), 방향(d)를 가진다. 방향은 0,1,2,3,4,5,6,7 8 방향으로 구성된다. 1. 파이어볼른 방향으로 속도만큼 이동 2. 파이어볼이 2개 이상인 지점이 있으면 합쳐진 후 분리된다. 같은 칸에 있는 파이어볼은 모두 하나로 합쳐진다. 파이어볼은 4개의 파이어볼로 나누어진다. 나누어진 파이어볼의 질량, 속력, 방향은 다음과 같다. 질량은 ⌊(합쳐진 파이어볼 질량의 합)/5⌋이다. 속력은 ⌊(합쳐진 파이어볼 속력의 합)/(합쳐진 파이어볼의 개수)⌋이다. 합쳐지는 파이어볼의 방향이 모두 홀수이거나 모두 짝수이면, 방향은 0, 2, 4, 6이 되고, 그렇지 않으면 1, 3, 5, 7이 된다. 질.. 더보기
[BOJ 10825] 국영수 국영수 점수, 이름으로 정렬하기 조건 1. 국어점수 감소하는 순서 2. 국어점수 같으면 영어점수 증가하는 순서 3. 영어점수 같으면 수학점수 감소하는 순서 4. 모든점수 같으면 이름 사전순으로 증가하는 순서 Student class를 만들어서 list로 정렬을 해준다. import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; //https://www.acmicpc.net/problem/10825 //국영수 public class Main { static class Student{ String name; int korean; int math; int eng; pu.. 더보기
[BOJ 15990] 1, 2, 3 더하기 5 1,2,3으로 만들 수 있는 숫자의 조합 이전의 값을 참조하기 때문에 DP를 사용하여 문제를 풀었다. 정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 3가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다. 단, 같은 수를 두 번 이상 연속해서 사용하면 안 된다. 1+2+1 1+3 3+1 정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오. 조건 연속으로 오는 숫자는 불가능 (ex : 1+1+1) 1개 이상의 숫자를 사용 1,000,000,009로 나눈 나머지를 출력 끝나는 숫자가 1인경우, 2인경우, 3인경우를 카운트하여 미리 저장하여 놓는다. 1 == x 2 == y 3 == z dp[N] = x, y, z dp[1] = 1, 0, 0.. 더보기
[BOJ 20055] 컨베이어 벨트 위의 로봇 컨베이어 벨트위에서 벨트와 로봇이 내구도 내에서 움직일 수 있는 횟수 조건 벨트는 2*N의 크기이며, N의 위치에서 사라지고 처음위치에 로봇이 놓여진다. 아래의 시뮬레이션을 바탕으로 횟수가 움직인다. 벨트가 각 칸 위에 있는 로봇과 함께 한 칸 회전한다. 가장 먼저 벨트에 올라간 로봇부터, 벨트가 회전하는 방향으로 한 칸 이동할 수 있다면 이동한다. 만약 이동할 수 없다면 가만히 있는다. 로봇이 이동하기 위해서는 이동하려는 칸에 로봇이 없으며, 그 칸의 내구도가 1 이상 남아 있어야 한다. 올리는 위치에 있는 칸의 내구도가 0이 아니면 올리는 위치에 로봇을 올린다. 내구도가 0인 칸의 개수가 K개 이상이라면 과정을 종료한다. 그렇지 않다면 1번으로 돌아간다. 시뮬레이션 순서에 맞게 반복을 해주면서 조건을.. 더보기
평범한 배낭 배낭에 넣을 수 있는 무게의 제한이 있을 경우, 무게와 가치가 있는 물건을 최대로 할 수 있는 방법 조건 배낭에는 무게 제한이 있다. 물건은 중복으로 넣을 수 없다. dp로 접근하여 아이템을 넣을 수 있을 때, 배낭에 있는 경우 / 배낭에 없는 경우를 분리하여 생각 dp[][] = new int[N+1][K+1]로 선언한다. 표를 만들어서 생각해보면 점화식을 만드는데 이해하기 쉽다. 담을 수 있는 무게를 1~7까지 열에 위치하고, 무게를 행에 위치한다. 칸은 가치로 채워준다.(정답이 가치를 생각하기 때문에) 가치 무게 1 2 3 4 5 6 7 13 6 0 0 0 0 0 13 13 8 4 6 3 12 5 가치 무게 1 2 3 4 5 6 7 13 6 0 **0** 0 0 0 13 13 8 4 0 0 0 8 .. 더보기
괄호 회전하기 괄호를 쉬프트하면서 완전한 괄호 인지 확인 조건 [,],(,),{,} 만 존재 페어로 이루어져야 완전한 괄호이다. 0. [ == 1 , ] == 2, ( == 3, ) == 4, { == 5, } == 6 문자열을 치환한다. 1.문자열을 쉬프트 하는 함수를 만든다. - 처음에는 오리지날 문자열을 가지고 있으면서 쉬프트 함수를 계속하여 만들어 보았다. - 두번째로는 substring을 사용하였는데 시간이 조금 줄긴하였다. (20~30ms) 2. 탐색을 하면서 list가 비었으면 list에 넣어준다. list안에 값이 존재하면, list의 마지막과 add하려는 값의 차이가 1이면 완전한 괄호로 판단한다. import java.util.ArrayList; import java.util.List; //https.. 더보기
방문길이 지나간 거리 횟수 체크 조건 -5 ~ 5의 맵을 탐색 지나갔던 거리는 횟수로 판단하지 않음 지나간 거리를 visit배열로 처리해서 중복을 방지 (0,0) -> (1,0) == (1,0) -> (0,0)은 동일한 경로이기 때문에 visit배열을 4차원으로 만들어서 판단해줌 public class Solution { int[] dx = {-1,0,1,0}; int[] dy = {0,1,0,-1}; public int solution(String dirs) { int answer = 0; int arr[][] = new int[11][11]; int visit[][][][] = new int[11][11][11][11]; int x = 5; int y = 5; for(int i=0; i 더보기
리틀 프렌즈 사천성 한번만 꺾을 수 있는 경로의 같은 그림 맞추기 조건 1. 막힌 칸 '*' 으로는 지나갈 수 없음 2. 경로는 한번만 꺾일 수 있음 3. 가능한 경우의 수의 알파벳 순으로 정렬하여 출력(처음에 단순 탐색으로 진행하였다가 수정하는데 고생함) String[]을 char[][] 로 변경하여 준다. 카드의 x1, y1 좌표, x2, y2 좌표를 가지고 있기 위하여 Map 을 사용하였다. List list; Map을 list로 변경하여 알파벳순으로 sort를 진행하여준다. 그 후 BFS를 사용하여 카드와 카드가 만날 수 있는지 체크 - 카드의 방향이 변경될 때 마다 카운트를 해주었다. (Block 클래스) 만날 수 있다면 char[][]의 카드부분을 '.'으로 변경 및 카드 list에서 삭제 해준다. 가능한 순서(.. 더보기