목록알고리즘 (53)
자바칩
난이도: Silver 1문제: https://www.acmicpc.net/problem/2583 문제에 주어진 모눈종이는 세로가 M, 가로가 N이지만코드를 작성할 때는 가로가 M, 세로를 N으로 배열을 초기화하자. => new int[N][M] 2차원 배열 초기화 방법:for (i: 왼쪽 아래 꼭짓점의 x좌표 ~ 오른쪽 아래 꼭짓점의 x좌표 - 1까지) for (j: 왼쪽 아래 꼭짓점의 y좌표 ~ 오른쪽 아래 꼭짓점의 y좌표 -1까지) paper[i][j] = 1; 그 이후는 BFS 알고리즘을 잘 알면 쉽게 풀 수 있다.영역을 체크할 때는 영역 체크 변수 cnt를 2로 초기화해서 새로운 칸에 방문할 때마다 cnt를 1씩 증가시키면 된다.그리고 마지막에 방문한 x좌표와 y좌표의 영역 크..
난이도: Gold 4문제: https://www.acmicpc.net/problem/13913 아래 링크에 있는 문제를 응용한 문제이다.이 문제를 먼저 풀어보고 해당 문제를 풀면 좀 더 쉽게 풀 수 있을 것이다.https://www.acmicpc.net/problem/1697 수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간..
난이도: Gold 4문제: https://www.acmicpc.net/problem/14002 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다. 아래 링크에 있는 문제를 응용한 문제이다.이 문제를 먼저 풀어보고 해당 문제를 풀면 좀 더 쉽게 풀 수 있을 것이다.https://www.acmicpc.net/problem/11053 위 링크에 있는 문제에서 가장 긴 증가하는 부분 수열의 길이를 구하려면 int 타입의 1차원 dp 배열을 만들어서 저장하고, 가장 큰 값을 출력하면 됐었다.하지만 ..
난이도: Silver 1문제: https://www.acmicpc.net/problem/12852 정수 X에 사용할 수 있는 연산은 다음과 같이 세 가지 이다.X가 3으로 나누어 떨어지면, 3으로 나눈다.X가 2로 나누어 떨어지면, 2로 나눈다.1을 뺀다.정수 N이 주어졌을 때, 위와 같은 연산 세 개를 적절히 사용해서 1을 만들려고 한다. 연산을 사용하는 횟수의 최솟값을 출력하시오. 아래 링크에 있는 문제를 응용한 문제이다.이 문제를 먼저 풀어보고 해당 문제를 풀면 좀 더 쉽게 풀 수 있을 것이다.https://www.acmicpc.net/problem/1463 위 링크에 있는 문제에서 연산을 하는 횟수의 최솟값을 구하려면 int 타입의 1차원 dp 배열을 만들어서 저장하고, 가장 큰 값을 출력하면 됐..
난이도: Silver 2문제: https://www.acmicpc.net/problem/3085 애니팡처럼 같은 종류가 모이면 그 종류들이 모인 개수를 최대 개수에 갱신하면 된다.다만 애니팡은 3개부터 모여야 하지만 여기에서는 2개가 모이는 것도 최대 개수로 갱신할 수 있다. 주석에 설명을 적어 놓았다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112..
난이도: Silver 2문제: https://www.acmicpc.net/problem/1138 주석에 써 놓은 설명만 보아도 이해가 될 것이다.바로 코드를 보자.123456789101112131415161718192021222324252627282930313233import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.StringTokenizer; public class P1138_한줄로서기 { public static void main(String[] args) throws IOException { Bu..
난이도: Gold 4문제: https://www.acmicpc.net/problem/16234 이 문제는 같은 영역끼리 묶어서 그 영역의 인구수의 평균만큼 이동을 시켜야 한다.처음에는 영역 체크를 boolean 배열로 만들어서 조건에 해당하면 전부 true로 체크하여서 모두 같은 영역으로 처리하여 문제를 풀었는데, 그렇게 하면 안되고 영역 체크를 int 배열을 만들어서 국경선으로 구별하여 각각 다른 영역으로 처리해주어야 한다. 말로만 보면 이해가 안될 것이다. 그림을 보자. 초기 배열은 이렇다. 처음에는 국경선을 먼저 열어야 한다.국경선을 여는 조건은 인접한 칸(상, 하, 좌, 우)과의 인구 차이가 10명 이상 50명 이하일 경우이다. 인접한 칸과의 인구 차이가 10명 이상 50명 이하일 경우, 국경..
난이도: Gold 4문제: https://www.acmicpc.net/problem/2636 겉에 있는 치즈부터 녹여서 치즈를 점점 안쪽으로 녹이면 되는 문제이다. 초기 배열은 이렇다.세로(N) * 가로(M) 크기의 2차원 배열을 선언해주어야 한다. 치즈는 이렇게 겉에 있는 것만 녹이면 된다고 한다.나는 이 문제를 0주변에 있는 1들을 없애면 되는게 아닌가 했는데, 가운데에도 0이 있다.겉에 있는 0 주변에 있는 1들만 없애야 한다. 가운데에 있는 0은 제외하고 겉에 있는 0 주변에 있는 1을 없애야 한다.이렇게 하려면 어떻게 해야할까? 일단 공기 칸을 체크할 2차원 배열을 만든다.겉에 있는 0들을 bfs를 사용해서 공기 칸을 체크할 배열을 true로 체크하면 된다.그리고, true로 체크된 칸 주변..