Coding Test Practice 9

멱집합 심화

문제 말썽꾸러기 김코딩은 오늘도 장난을 치다가 조별 발표 순서가 담긴 통을 쏟고 말았습니다. 선생님께서는 미리 모든 발표 순서의 경우의 수를 저장해 놓았지만 김코딩의 버릇을 고치기 위해 문제를 내겠다고 말씀하셨습니다. 김코딩은 모든 조별 발표 순서에 대한 경우의 수를 차례대로 구한 뒤 발표 순서를 말하면 이 발표 순서가 몇 번째 경우의 수인지를 대답해야 합니다. 총 조의 수 N과 선생님이 말씀하시는 발표 순서 K가 주어질 때, 김코딩이 정답을 말 할 수 있게 올바른 리턴 값을 구하세요. 모든 경우의 수가 담긴 배열은 번호가 작을수록 앞에 위치한다고 가정합니다. ex) N = 3일경우, [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 문제 요약 N 만큼의 요소를 가..

두 배열을받아 부분집합 찾아내기

쉬운문제이지만 여러가지 알고리즘을 활용해 비교해 보았다. 문제 두 개의 배열(base, sample)을 입력받아 sample이 base의 부분집합인지 여부를 리턴해야 합니다. 문제 입력 예시 public class Main { public static void main(String[] args) { Solution solution = new Solution(); int[] base = new int[]{7, 1, 2, 3, 4, 5}; int[] sample = new int[]{1, 3,7}; boolean test = solution.isSubsetOf(base, sample); System.out.println(test); } } 해결방법 스트림을 이용한 해결방법 class Solution { pu..

DP를 이용한 경우의 수 찾기

문제 여러가지 지폐의 종류로 원하는 액수를 가저갈수 있는 모든 경우의 수를 구하라. 예를들어 $50, $20, $10 3가지의 지폐종류가 있고 총 50 달러를 가저가려할때 가질수 있는 모든 경우의 수인 4를 구해 반환해야 한다. $50 * 1 $20 * 2, $10 * 1 $20 * 1, $10 * 3 $10 * 5 입력 int 타입의 자연수 int target int 타입의 요소를 갖는 배열 int[] type 출력 long 타입의 모든 경우의 수 풀이 재귀 class Solution { public long ocean(int target, int[] type) { int[] newType = IntStream.of(type).boxed().sorted(Collections.reverseOrder())..

아이소그램(isogram), 중복된 문자 검열

이번 테스트는 상당히 쉬운 코딩테스트이지만 정답과 비교했을때 코드의 성능에 큰 차이가 있어 포스트하기로 했다. 문제는 상당히 간단하다. 문자열을 입력받아 중복된 문자가 있는지 없는지를 boolean 타입으로 반환하면 된다. 직접 작성한 코드 public class Solution { public boolean isIsogram(String str) { public boolean isIsogram (String str){ String[] arr = str.toLowerCase().split(""); for (int i = 0; i < arr.length; i++) { for (int j = i + 1; j < arr.length - 1; j++) { if (arr[i].equals(arr[j])) retu..

부분수열이 중복되지 않는 특정한 문자열 생성

문제 1, 2, 3으로만 이루어진 수열 바코드를 만들어야 하며 바코드에서 인접한 두 개의 부분 수열이 동일하다면 제작할 수 없다고 할 때, 주어진 길이 len의 바코드 중 가장 작은 수를 반환하는 함수를 작성. 만들 수 없는 바코드 만들 수 있는 바코드 112 1312 1231312 3 232312 231213 부분 수열? 주어진 수열에서 연속된 모든 구간을 말합니다. 수열 123의 부분 수열은 1, 2, 3, 12, 23, 123. 인접한 두 부분 수열? 첫번째 부분 수열과 두번째 부분 수열이 연속된 경우. 수열 1234에서 인접한 부분 수열 (우리는 두 부분수열이 같은지 관심이 있으므로 길이가 서로 다른 경우는 무시한다) 1과 2, 2와 3, 3과 4, 12와 34 만들 수 없는 바코드: '11'2 ..

간선 리스트로 연결된 정점의 그룹들의 수 찾기

문제 방향이 없는 간선들의 목록이 주어질 때, 연결된 정점의 컴포넌트(그룹들)가 몇 개인지 반환하는 함수를 작성하세요. 입력값 2차 배열 정수요소 ex) int[][]{{0,1}, {2,3}, {3,4}} 출력값 int 타입의 정점들이 연결된 그룹들의 수. 입출력 및 그래프 예시 int result = connectedVertices(new int[][]{ {0, 1}, {2, 3}, {4, 5}, }); System.out.println(result); // 3 풀이 1 - DFS와 정점리스트 사용 class Solution { //DFS public int connectedVertices(int[][] edges) { int count = 0; // 재귀를돌며 정점들의 그룹의 수를 카운트업 하여 마지..

표현가능한 이진트리

이번 코딩테스트의 전체적인 요구사항은 long타입의 넘버를 담은 배열의 각 수들을 이진수로 변환후 포화 이진트리로 만들어 해당 숫자가 이진트리로 표현이 가능한가를 구해내야된다. 해당 테스트를 완료하는데 4시간 소요됨 (문제 본문, 프로그래머스 : https://school.programmers.co.kr/learn/courses/30/lessons/150367 ) 리스트와 재귀를 이용 class Solution { public long[] solution(long[] numbers) { long[] answer = new long[numbers.length];//결과값을 담는 배열 for(int i =0; i maxLength){ maxLength = (maxLength*2)+1; } // 포화이진트리는..