본문 바로가기

알고리즘

(26)
[알고리즘/Programmers] LV1. k번째 수 Programmers LV1. k번째 수 문제 설명 배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다. 예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면 array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다. 2에서 나온 배열의 3번째 숫자는 5입니다. 배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요. 제한 사항 arra..
[알고리즘/Programmers] LV1. 2016년 Programmers LV1. 2017년 문제 설명 2016년 1월 1일은 금요일입니다. 2016년 a월 b일은 무슨 요일일까요? 두 수 a ,b를 입력받아 2016년 a월 b일이 무슨 요일인지 리턴하는 함수, solution을 완성하세요. 요일의 이름은 일요일부터 토요일까지 각각 SUN,MON,TUE,WED,THU,FRI,SAT 입니다. 예를 들어 a=5, b=24라면 5월 24일은 화요일이므로 문자열 "TUE"를 반환하세요. 제한 사항 2016년은 윤년입니다. 2016년 a월 b일은 실제로 있는 날입니다. (13월 26일이나 2월 45일같은 날짜는 주어지지 않습니다) 입출력 예 a b result 5 24 "TUE" 사용 언어 Java 해결 방법 1. Calendar API 이용 2. 계산법 이용 (..
[알고리즘/Programmers] LV1. 완주하지 못한 선수 Programmers LV1.완주하지 못한 선수 문제 설명 수많은 마라톤 선수들이 마라톤에 참여하였습니다. 단 한 명의 선수를 제외하고는 모든 선수가 마라톤을 완주하였습니다. 마라톤에 참여한 선수들의 이름이 담긴 배열 participant와 완주한 선수들의 이름이 담긴 배열 completion이 주어질 때, 완주하지 못한 선수의 이름을 return 하도록 solution 함수를 작성해주세요. 제한 사항 마라톤 경기에 참여한 선수의 수는 1명 이상 100,000명 이하입니다. completion의 길이는 participant의 길이보다 1 작습니다. 참가자의 이름은 1개 이상 20개 이하의 알파벳 소문자로 이루어져 있습니다. 참가자 중에는 동명이인이 있을 수 있습니다. 입출력 예 participant co..
[알고리즘/Programmers] LV1. 두 개 뽑아서 더하기 Programmers LV1. 두 개 뽑아서 더하기 문제 설명 정수 배열 numbers가 주어집니다. numbers에서 서로 다른 인덱스에 있는 두 개의 수를 뽑아 더해서 만들 수 있는 모든 수를 배열에 오름차순으로 담아 return 하도록 solution 함수를 완성해주세요. 제한 사항 numbers의 길이는 2 이상 100 이하입니다. numbers의 모든 수는 0 이상 100 이하입니다. 입출력 예 numbers result [2,1,3,4,1] [2,3,4,5,6,7] [5,0,2,7] [2,5,7,9,12] 사용 언어 Java 해결 방법 로직을 위해 순차적으로 세 가지 지점을 파악했다. 1. 두 수를 탐색하고 두 수의 합이 list에 없으면 list에 추가 2. list -> 배열 변환 3. 오..
[알고리즘/인프런정리] 2-2. Recursion의 응용: Counting cell in a Blob Counting cell in a Blob blob: 칠된 픽셀의 묶음 단위 (상하좌우대각선으로 연결된 픽셀) 픽셀(빈 픽셀+칠된 픽셀) 그림과 하나의 좌표가 주어졌을 때, 좌표 픽셀이 포함된 blob의 크기를 구하는 문제. 입력: - N*N 크기의 2차원 그리드(grid) - 하나의 좌표 (x,y) 출력: - 픽셀(x,y)가 포함된 blob의 크기, - (x,y)가 어떤 blob에도 속하지 않는 경우에는 0 풀이 코드 (추후 업로드 예정) private static int BACKGROUND_COLOR = 0; // 배경 픽셀 private static int IMAGE_COLOR = 1; // 이미지 픽셀 private static int ALREADY_COLOR = 2; // 이미 방문한 픽셀 pu..
[알고리즘/인프런정리] 2-1. Recursion의 응용: 미로찾기 - Decision Problom 문제이다. (답이 YES/NO) 현재 위치에서 출구까지 가는 경로의 조건 1. 현재 위치가 출구이거나 2. 이웃셀 중 하나에서 현지 위치를 지나지 않고 출구까지 가는 경로가 있거나 인접 셀이 방문했던 셀인 경우 무한루프에 빠지게 된다. 방문했던 셀을 표시하는 것이 중요하다. 수도 코드 boolean findPath(x,y) if(x,y) is either on the wall or a visited cell return false; else if(x,y) is the exit // base case (탈출점인 경우) return true; else mark (x,y) as a visited cell; // 방문 표시 for each neighbouring cell (x'..
[알고리즘/인프런정리] 1-3. Designing Recursion Designing Recursion (순환 알고리즘의 설계) - 적어도 하나의 base case, 즉 순환되지 않고 종료되는 case가 있어야 함 - 모든 case는 결국 base case로 수렴해야 함 if ( ) { // base case; }else { // recursion; } 암시적 매개변수를 명시적 매개변수로 바꾸어라. 매개변수의 명시화: 순차 탐색 절차적 int search(int [] data, int n, int target) { for(int i=0; i 암시적 매개변수 순환 기본 버전 int search(int [] data, int begin, int end, int target) { if(begin>end) return -1; else if(target == data[begin]..
[알고리즘/인프런정리] 1-2. Recursive Thinking Recursive Thinking 순환적 사고하기 Recursion은 수학함수 계산에만 유용한가? -> 다른 많은 문제들도 해결할 수 있다. - 문자열의 길이 계산 public static int length(String str) { if(str.equals(""))// base case return 0; else return 1+length(str.substring(1)); } - 문자열의 프린트 public static int printChars(String str) { if(str.equals(""))// base case return 0; else { System.out.print(str.charAt(0)); return 1+length(str.substring(1)); } } - 2진수 변환 출..