본문 바로가기

ALGORITHM

(30)
[프로그래머스 Java] 두 개 뽑아서 더하기 코딩테스트 연습 - 두 개 뽑아서 더하기 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한 programmers.co.kr ⏱소요 시간 - 1시간 30분 🔑문제 해결 전체적인 부분은 쉽게 풀었는데 바보 같이 헤맸던 부분 ---> int j = i + 1 (기준이 되는 수는 고정해두고, 비교 대상이 되는 수들이랑 비교할 때는 기준이 되는 수는 제외하니까 i + 1 !!!!) 배열에서 중복되는 값은 제거해야하므로 자동으로 제거하기 위해 set에 저장했다. 그리고 set을 list로 변환하고 list를 다시 배열로 변환했다. (리턴값이 배열..
List <-> int[] int[] -> List 변환 int[] result = new int[10]; List list = Arrays.stream(result).boxed().collect(Collectors.toList()); List -> int[] 변환 int[] answer = list.stream().mapToInt(i->i).toArray(); List list = new ArrayList(); list.add(1); list.add(2); list.add(3); list.add(4); int[] answer = new int[list.size()]; // 1. 리스트의 사이즈만큼 배열을 만들고 for(int i = 0; i < list.size(); i++) { // 2. 리스트를 돌면서 배열에 추가 answe..
[프로그래머스 Java] 크레인 인형뽑기 게임 코딩테스트 연습 - 크레인 인형뽑기 게임 [[0,0,0,0,0],[0,0,1,0,3],[0,2,5,0,1],[4,2,4,4,2],[3,5,1,3,1]] [1,5,3,5,1,2,1,4] 4 programmers.co.kr ⏱소요 시간 - 2시간 🔑문제 해결 인형 뽑기를 해서 배열에 넣고 중복을 제거할 때 다시 배열을 리스트로 변환하는 짓을 했다. 그래서인지 로직은 맞는데 테스트 케이스 1, 2번이 틀렸다고 했다. 애초에 배열에 넣지 않고 리스트에 넣고 시작을 하니 같은 로직으로 정답을 얻어냈다. 이게 뭐라고 두 시간이나 걸렸다^^ 나중에 또 풀 때 수식 부분이 이해가 가지 않으면 이차원 배열의 인덱스를 그려서 생각해보면 바로 답이 나올 것이다! 🔎나의 소스 코드 package step1; import ja..
[프로그래머스 Java] 해시 - 전화번호 목록 배열의 요소 중 하나가 다른 요소의 접두어인지 확인하는 문제 String 클래스의 startsWith(), endsWith()와 같은 것을 생각할 수 있다. 번외로 indexOf()나 contains()로 풀이한 것도 있으니 문자열 관련 내용이 나오면 이와 같은 메서드를 활용해보자. + 해시를 이용한 문제이니 나중에 꼭 해시로 풀어보자. public class Ex2 { public static void main(String[] args) { String[] phone_book = { "123", "456", "789" }; System.out.println(solution(phone_book)); } public static boolean solution(String[] phone_book) { boo..
[백준 10989 Java] 수 정렬하기 - 계수 정렬 계수 정렬 (Counting Sort) 개수가 정해져 있는 경우에 가장 빠른 정렬 결과를 얻을 수 있는 알고리즘 요소 값을 비교하지 않고 카운팅을 저장할 배열을 생성하여 각각의 요소가 몇 번 등장했는지 센 후, 그 배열을 출력 아래 예제를 통해 확인해보자. package exsort; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; // 계수 정렬 (카운팅 정렬) public class Ex3_1 { public static void main(String[] args) throws IOException { // 입력 가능한 수의 범위 (1~10..
[백준 2750 / 2751 Java] 수 정렬하기 - 선택 정렬 / Arrays / Collections 선택 정렬 첫 번째 인덱스부터 시작하여 뒤의 인덱스들의 값들과 비교하여 최솟값들을 차곡차곡 쌓아나가는 방법으로 구현하기 쉬우나 시간 복잡도가 O(n²)로 성능이 좋지 못하다는 단점이 있다. 1. 주어진 리스트 중에 최소값을 찾는다. (기본 오름차순) 2. 그 값을 맨 앞에 위치한 값과 교체한다. 3. 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다. 4. 하나의 원소만 남을 때까지 위의 과정을 반복한다. import java.util.Scanner; // 선택 정렬을 이용한 방법 public class Ex1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); in..
[백준 2331 Java] 분해합 / 각 자리의 합 구하기 브루트 포스란? 단순 무식한 알고리즘 문제를 해결하기 위해 가능한 모든 경우에 대해 직접 시도하는 방법으로 완전 탐색이라고도 함 이 문제를 풀 때, 1~1,000,000의 분해합을 모두 구해서 배열에 넣고 그 배열의 요소 중 사용자가 입력한 값이랑 일치하는 요소를 찾아서 그 요소의 인덱스 번호 중 가장 작은 값을 뽑아내려고 했다. 이 방법이 맞는지도 의문일 뿐더러, 어찌저찌 답은 나오더라도 아주 아주 비효율 끝판왕의 코드가 되기 때문에 단순하게 작은 수부터 분해합을 계산하기 시작해서 사용자가 입력한 값과 일치하는 값이 나오면 그 수가 정답이기 때문에 전부 다 계산하면서 힘을 뺄 필요가 없다...ㅠ_ㅠ 코드를 살펴보면서 이해를 해보자. import java.util.Scanner; // n을 입력받아 n의..
[백준 11729 Java] 하노이 탑 - 재귀, 분할 정복 분할 정복이란? 한 번에 해결하기 어려운 문제를 해결 가능한 단위로 나누고, 작은 문제들을 해결한 후 합쳐서 큰 문제를 해결하는 방법 아래 하노이 탑 예제를 보고 이를 적용해보자. * 원판의 개수가 2개, 3개라고 생각하고 그림을 그리면 이해가 빠를 것이다. 결국에는 같은 루트로 원판들이 옮겨지는 것이라고 생각하면 된다. * String 대신에 StringBuilder를 사용해서 탐색 속도를 빠르게 했다. 단순한 알고리즘에서는 큰 차이가 없지만 복잡해질수록 차이가 나므로 StringBuilder 사용에 익숙해지자. import java.util.Scanner; public class Ex4 { static StringBuilder sb = new StringBuilder(); // 이동 순서가 담길 배열..