java 30

프로그래머스 / 크레인 인형뽑기 게임(Java)

문제 설명 게임 개발자인 크레인 인형 뽑기 기계를 모바일 게임으로 만들려고 합니다. 죠르디는 게임의 재미를 높이기 위해 화면 구성과 규칙을 다음과 같이 게임 로직에 반영하려고 합니다. 게임 화면은 1 x 1 크기의 칸들로 이루어진 N x N 크기의 정사각 격자이며 위쪽에는 크레인이 있고 오른쪽에는 바구니가 있습니다. (위 그림은 5 x 5 크기의 예시입니다). 각 격자 칸에는 다양한 인형이 들어 있으며 인형이 없는 칸은 빈칸입니다. 모든 인형은 1 x 1 크기의 격자 한 칸을 차지하며 격자의 가장 아래 칸부터 차곡차곡 쌓여 있습니다. 게임 사용자는 크레인을 좌우로 움직여서 멈춘 위치에서 가장 위에 있는 인형을 집어 올릴 수 있습니다. 집어 올린 인형은 바구니에 쌓이게 되는 데, 이때 바구니의 가장 아래 ..

Study/Algorithm 2020.09.24

프로그래머스 / 두 개 뽑아서 더하기(Java)

문제 설명 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 입출력 예 numbers result [2,1,3,4,1] [2,3,4,5,6,7] [5,0,2,7] [2,5,7,9,12] 조건 1 : 만들 수 있는 모든 수를 배열에 오름차순으로 담는다. (중복 x) 내가 생각한 해결 방법 배열을 오름차순으로 정렬한 뒤 for문을 사용하여 하나씩 더한다. 그리고 list에서 있는 숫자인지 확인 후 list에 넣는다. public int[] solution(int[] numbers) { Arrays.sort(numbers); List ar = n..

Study/Algorithm 2020.09.23

백준 / 연결 요소의 개수(Java) / DFS

문제 방향 없는 그래프가 주어졌을 때, 연결 요소 (Connected Component)의 개수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주어진다. 출력 첫째 줄에 연결 요소의 개수를 출력한다. 조건 1 : 연결 요소의 개수를 구한다. 해결방법 기본적인 DFS문제이다. 하지만 연결되어있지 않은 간선을 모두 확인해야 한다. 나는 인접 리스트를 사용하여 간선을 입력하였다. 그리고 for문 안에서 모든 정점을 방문하였는지 확인하였다. import java.util.Array..

Study/Algorithm 2020.09.03

자바 2차원 배열 정렬하기

자바 1차원 배열 정렬의 경우 Arrays.sort() 함수를 통해 쉽게 정렬할 수 있다. 2차원 배열의 경우, 첫번째 원소를 기준으로 정렬할 때는 2가지 방법이 있다. 첫 번째는 람다 방식과 Integer의 compare함수를 사용 Arrays.sort(arr,(o1,o2) ->{ if(o1[0] == o2[0]) { return Integer.compare(o1[1], o2[1]); } else { return Integer.compare(o1[0], o2[0]); } }); 그리고 정렬 했을 때 첫 번째 배열의 원소 크기가 같다면 두 번째 배열 원소까지 비교하여 정렬한다. 두 번째는 Comparator 방식 Arrays.sort(arr,new Comparator(){ @Override public ..

Study/Java 2020.09.01

백준 / 신입사원 (Java) / Greedy 알고리즘

문제 언제나 최고만을 지향하는 굴지의 대기업 진영 주식회사가 신규 사원 채용을 실시한다. 인재 선발 시험은 1차 서류심사와 2차 면접시험으로 이루어진다. 최고만을 지향한다는 기업의 이념에 따라 그들은 최고의 인재들만을 사원으로 선발하고 싶어 한다. 그래서 진영 주식회사는, 다른 모든 지원자와 비교했을 때 서류심사 성적과 면접시험 성적 중 적어도 하나가 다른 지원자보다 떨어지지 않는 자만 선발한다는 원칙을 세웠다. 즉, 어떤 지원자 A의 성적이 다른 어떤 지원자 B의 성적에 비해 서류 심사 결과와 면접 성적이 모두 떨어진다면 A는 결코 선발되지 않는다. 이러한 조건을 만족시키면서, 진영 주식회사가 이번 신규 사원 채용에서 선발할 수 있는 신입사원의 최대 인원수를 구하는 프로그램을 작성하시오. 입력 첫째 줄..

Study/Algorithm 2020.09.01

백준 / 바이러스 (Java) / DFS

문제 신종 바이러스인 웜 바이러스는 네트워크를 통해 전파된다. 한 컴퓨터가 웜 바이러스에 걸리면 그 컴퓨터와 네트워크 상에서 연결되어 있는 모든 컴퓨터는 웜 바이러스에 걸리게 된다. 예를 들어 7대의 컴퓨터가 과 같이 네트워크 상에서 연결되어 있다고 하자. 1번 컴퓨터가 웜 바이러스에 걸리면 웜 바이러스는 2번과 5번 컴퓨터를 거쳐 3번과 6번 컴퓨터까지 전파되어 2, 3, 5, 6 네 대의 컴퓨터는 웜 바이러스에 걸리게 된다. 하지만 4번과 7번 컴퓨터는 1번 컴퓨터와 네트워크상에서 연결되어 있지 않기 때문에 영향을 받지 않는다. 어느 날 1번 컴퓨터가 웜 바이러스에 걸렸다. 컴퓨터의 수와 네트워크 상에서 서로 연결되어 있는 정보가 주어질 때, 1번 컴퓨터를 통해 웜 바이러스에 걸리게 되는 컴퓨터의 수..

Study/Algorithm 2020.08.28

백준 / DFS 와 BFS ( Java) / 탐색 알고리즘

문제 그래프를 DFS로 탐색한 결과와 BFS로 탐색한 결과를 출력하는 프로그램을 작성하시오. 단, 방문할 수 있는 정점이 여러 개인 경우에는 정점 번호가 작은 것을 먼저 방문하고, 더 이상 방문할 수 있는 점이 없는 경우 종료한다. 정점 번호는 1번부터 N번까지이다. 입력 첫째 줄에 정점의 개수 N(1 ≤ N ≤ 1,000), 간선의 개수 M(1 ≤ M ≤ 10,000), 탐색을 시작할 정점의 번호 V가 주어진다. 다음 M개의 줄에는 간선이 연결하는 두 정점의 번호가 주어진다. 어떤 두 정점 사이에 여러 개의 간선이 있을 수 있다. 입력으로 주어지는 간선은 양방향이다. 출력 첫째 줄에 DFS를 수행한 결과를, 그다음 줄에는 BFS를 수행한 결과를 출력한다. V부터 방문된 점을 순서대로 출력하면 된다. 조..

Study/Algorithm 2020.08.27

백준 / 게임을 만든 동준이 (Java) / Greedy 알고리즘

문제 학교에서 그래픽스 수업을 들은 동준이는 수업시간에 들은 내용을 바탕으로 스마트폰 게임을 만들었다. 게임에는 총 N개의 레벨이 있고, 각 레벨을 클리어할 때마다 점수가 주어진다. 플레이어의 점수는 레벨을 클리어하면서 얻은 점수의 합으로, 이 점수를 바탕으로 온라인 순위를 매긴다. 동준이는 레벨을 난이도 순으로 배치했다. 하지만, 실수로 쉬운 레벨이 어려운 레벨보다 점수를 많이 받는 경우를 만들었다. 이 문제를 해결하기 위해 동준이는 특정 레벨의 점수를 감소시키려고 한다. 이렇게 해서 각 레벨을 클리어할 때 주는 점수가 증가하게 만들려고 한다. 각 레벨을 클리어할 때 얻는 점수가 주어졌을 때, 몇 번 감소시키면 되는지 구하는 프로그램을 작성하시오. 점수는 항상 양수이어야 하고, 1만큼 감소시키는 것이 ..

Study/Algorithm 2020.08.27

백준 수 묶기(Java) / Greedy 알고리즘

문제 길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다. 예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5} 일 때, 그냥 이 수열의 합을 구하면 0+1+2+4+3+5 = 15이다. 하지만, 2와 3을 묶고, 4와 5를 묶게 되면, 0+1+(2*3)+(4*5) = 27이 되어 최대가 된다. 수열의 모든 수는 단 한번만 묶거나, 아니면 묶지 않아야 한다. 수열이 주어졌을 때, ..

Study/Algorithm 2020.08.27

백준 / 전자레인지 문제 (java) / Greedy 알고리즘

백준 전자레인지 문제 (JAVA) / Greedy 알고리즘 문제 : 요리해야 할 시간 T초를 A, B, C 3개의 버튼을 눌러 그 합이 정확히 T초가 되도록 한다. 조건 1 : 임의의 시간(T초)을 5분, 1분, 10초 단위로 정확히 맞춘다. 조건 2 : 최소한의 버튼을 사용한다. 조건 3 : 정확한 시간을 맞출 수 없을 때, -1을 출력한다. 해결 방법 : 가장 큰 단위부터 T초를 나누며 시간을 계산한다. 나 같은 경우는 시간 단위를 배열에 넣어 큰 단위부터 임의의 시간(T초)을 나눈 뒤 바로 문자에 넣었다. 그리고 마지막 단위를 계산할 경우 뒤에 띄어쓰기가 함께 들어가기 때문에 trim 함수로 앞 뒤 공백 제거 후 출력. import java.util.Scanner; public class Main ..

Study/Algorithm 2020.08.26