Algorithm 306

게임 개발

현민이는 게임 캐릭터가 맵 안에서 움직이는 시스템을 개발 중이다. 캐릭터가 있는 장소는 1 X 1 크기의 정사각형으로 이뤄진 N X M 크기의 직사각형으로, 각각의 칸은 육지 또는 바다이다. 캐릭터는 동서남북 중 한곳을 바라본다. 맵의 각 칸은 (A, B)로 나타낼 수 있고, A는 북쪽으로 부터 떨어진 칸의 개수, B는 서쪽으로부터 떨어진 칸의 개수이다. 캐릭터는 상하좌우로 움직일 수 있고, 바다로 되어 있는 공간에는 갈 수 없다. 캐릭터의 움직임을 설정하기 위해 정해 놓은 메뉴얼은 이러하다. 1. 현재 위치에서 현재 방향을 기준으로 왼쪽 방향(반시계 방향으로 90도 회전한 방향)부터 차례대로 갈 곳을 정한다. 2. 캐릭터의 바로 왼쪽 방향에 아직 가보지 않은 칸이 존재한다면, 왼쪽 방향으로 회전한 다음..

Algorithm/이코테 2021.11.18

왕실의 나이트

import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); //(-2,-1)(-2,1)(2,-1)(2,1)(-1,-2)(-1,2)(1,-2)(1,2) int[] dx = {-2,-2,2,2,-1,-1,1,1}; int[] dy = {-1,1,-1,1,-2,2,-2,2}; //문자형 숫자를 숫자로 변환 int x = s.charAt(1) - '0'; //문자 알파벳을 숫자로 변환(a = 1로) int y = s.charAt(0) - 'a' + 1; int count = 0; //8가지 좌표 중 이동 가능한 것 ..

Algorithm/이코테 2021.11.18

1이 될 때 까지

import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // N, K를 공백을 기준으로 구분하여 입력 받기 int n = sc.nextInt(); int k = sc.nextInt(); int result = 0; while (true) { //현재 숫자 System.out.println("n1 : " + n); //현재 숫자 n에 대해 나누어지는 수 찾기 int target = (n / k) * k; System.out.println("target : " + target); //연산 횟수 -> 빼야 되는 1이 몇개인지 현재 숫자에서 나누어지는 수를 ..

Algorithm/이코테 2021.11.17

동전 교환(냅색 알고리즘)

동전의 종류가 많으면 DFS로 풀면 시간 초과가 난다. coin[i]는 동전의 종류가 들어있는 배열 [1, 2, 5] dy[i]는 i라는 금액을 만드는데 필요한 동전의 최소 갯수 coin[i]=1원 짜리로 거슬러주는 dy[i] 초기화 기존 값 보다 작으면 값이 바뀌어짐 coin[i]=2원 짜리로 거슬러주는 dy[i] 초기화 기존 값 보다 작으면 값이 바뀌어짐 coin[i]=5원 짜리로 거슬러주는 dy[i] 초기화 기존 값 보다 작으면 값이 바뀌어짐 dy[j - coin[i]] + 1의 의미는 기존 거슬러준 동전의 갯수에서 해당 동전의 종류를 하나 더 사용한다는 의미이다. dy[5 - coin[1]] + 1의 의미는 3원에서 거슬러준 동전의 갯수 에다가 2원을 하나 더 사용한다는 의미이다.(5원) dy[1..

Algorithm/inflearn 2021.10.09

가장 높은 탑 쌓기(LIS 응용)

여기도 마찬가지로 dy[i]를 사용 dy[i]는 i 번째 벽돌을 마지막으로 하는 최대 벽돌의 높이를 저장할 배열임 앞의 문제와 비슷하나 이전 벽돌 보다 좁아야하고 무게도 가벼워야한다. 따라서 현 지점이 더 커야 수열을 만드는 앞의 문제와는 달리 지금 문제는 현 지점의 무게가 더 작아야 쌓을 수 있다. 무게만 비교해주기 위해 벽돌의 넓이를 기준으로 내림차순 정렬 무게만 가볍다면 위의 벽돌로 쌓을 수 있다. import java.util.*; class Brick implements Comparable{ public int s, h, w; Brick(int s, int h, int w) { this.s = s; this.h = h; this.w = w; } @Override public int compare..

Algorithm/inflearn 2021.10.09

최대부분증가수열(LIS)

원소가 n개인 배열의 일부 원소를 골라내서 만든 부분 수열 중, 각 원소가 이전 원소보다 크다는 조건을 만족하고, 그 길이가 최대인 부분 수열을 최장 증가 부분 수열(Longest Increasing Subsequence)이라고 한다. dy[i]는 i 번째 숫자를 마지막 항으로 하는 최대 증가 수열의 길이를 저장할 배열임 dy[0]은 5를 마지막 항으로 하는 최장 길이 = 1 (5 하나 밖에 없으니) dy[1]은 3을 마지막 항으로 하는 최장 길이 = 1 (5보다 3이 작으니 3만) dy[2]은 7을 마지막 항으로 하는 최장 길이 = 2 (3과 5 둘 다 가능 3 7 or 5 7 둘의 길이가 같으니 아무거나) dy[3]은 8을 마지막 항으로 하는 최장 길이 = 3 (3과 5와 7 셋 다 가능 근데 7을 ..

Algorithm/inflearn 2021.10.09