본문 바로가기

지루한 일상

[프로그래머스] 코딩테스트 통과 못하면 팀장님한테 죽을 수도 있는 사람의 'K번째 수' 풀이(java, 자바)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

본인은 8년차 개팔자다.

그러나 N년간의 SM업무와 몇 가지 망한 SI 프로젝트 경험으로 인하여, 이 연차 개발자치고 자료구조와 알고리즘에 상당히 취약한 편이다.

특히 SI의 경우, 직접 개발에 참여한 경험도 몹시 부족할뿐더러, 설계고 나발이고 당장 DB 모델링에 대한 개념조차 부족해서 이번에 SQLD를 공부해서 시험친 사람임.

이쯤되면 내가 얼마나 개발을 못하는 조빱인지 누구나 아실 것이라 믿는다.

그런데 팀장님왈,

이번 코딩테스트 못 하면 승진이 불가하대~

물론 저는 속으로 승진이고 나발이고 안빈낙도 안분지족하면 안될까요..라고 하고 싶었지만

나의 8년치 사회성이 그러지말라고 말려서 순순히 코테 무조건 합격하겠다고 호언 장담을 해놓은 상태다.

그래서 토요일 오전, 할 일도 없어서 프로그래머스 사이트에 들어가봤는데....

문제 예제들을 보면서 어떤 생각이 들었냐면,

'아, 이런 수준의 코딩을 업무로 삼을 수 있는 회사에 가면 참 좋을텐데.'

라는 생각을 했다. 저는 일단 코드리뷰고 나발이고 일정 맞춰 결함 없이 결과만 나오면 검수 끝인 통신사 개발자 나부랭이라 저런 수준의 알고리즘을 업무에 도입할 생각은 꿈도 못 꾸는 상황이다.

물론 내가 주도하고 몇몇 마음 맞는 동료들과 함께 시도하면 되겠지만,

자원이 부족한데 당장 플젝하면서 그러긴 쉽지 않지.

아무튼 k번째 수 풀이 궁금해서 오신 분들일텐데 TMI 남발 죄송합니다.

지금부터 개발좃밥의 K번째수 풀이 시작합니다.

비웃기 ㄴㄴ

급하게 집 노트북에 이클립스 깔아서 test 소스 작성한거 전체를 올리겠다.

평소 구글링하면서 소스 일부만 발췌해서 올리는 인간들 개욕했었기에 난 그러지 않으려고.

 

문제 설명

배열 array의 i번째 숫자부터 j번째 숫자까지 자르고 정렬했을 때, k번째에 있는 수를 구하려 합니다.

예를 들어 array가 [1, 5, 2, 6, 3, 7, 4], i = 2, j = 5, k = 3이라면

  1. array의 2번째부터 5번째까지 자르면 [5, 2, 6, 3]입니다.
  2. 1에서 나온 배열을 정렬하면 [2, 3, 5, 6]입니다.
  3. 2에서 나온 배열의 3번째 숫자는 5입니다.

배열 array, [i, j, k]를 원소로 가진 2차원 배열 commands가 매개변수로 주어질 때, commands의 모든 원소에 대해 앞서 설명한 연산을 적용했을 때 나온 결과를 배열에 담아 return 하도록 solution 함수를 작성해주세요.

입출력 예

arraycommandsreturn

[1, 5, 2, 6, 3, 7, 4] [[2, 5, 3], [4, 4, 1], [1, 7, 3]] [5, 6, 3]

입출력 예 설명

[1, 5, 2, 6, 3, 7, 4]를 2번째부터 5번째까지 자른 후 정렬합니다. [2, 3, 5, 6]의 세 번째 숫자는 5입니다.
[1, 5, 2, 6, 3, 7, 4]를 4번째부터 4번째까지 자른 후 정렬합니다. [6]의 첫 번째 숫자는 6입니다.
[1, 5, 2, 6, 3, 7, 4]를 1번째부터 7번째까지 자릅니다. [1, 2, 3, 4, 5, 6, 7]의 세 번째 숫자는 3입니다.

 

소스코드 (전체를 class 내용 안에 붙여넣고 실행하시면 실행됩니다.)

package test;

import java.util.ArrayList;
import java.util.Collections;

public class test {

public static void main(String args[]) {
int[] array = {1, 5, 2, 6, 3, 7, 4};
int[][] commands = {{2, 5, 3}, {4, 4, 1}, {1, 7, 3}}; //commands의 각 원소는 길이 3으로 제한

solution(array, commands);
}

public static ArrayList<Integer> solution(int[] array, int[][] commands) {
//int[] answer = {};
//1차원 배열보다는 index 접근과 sorting을 위해 ArrayList 사용
ArrayList<Integer> answer = new ArrayList<>(); //리턴용
ArrayList<Integer> integerArray = new ArrayList<>(array.length); //파라미터로 받아온 배열을 arrayList 변환

//for문 돌면서 파라밑 배열을 ArrayList에 추가
for(int i : array) {
integerArray.add(i);
}

for(int i[] : commands) {
//null 체크를 굳이 하고 싶어서 int가 아닌 Integer형 선언ㅎ.. 굳이 비교값은 null이 아니라 처음 초기화 값이면 상관없다.
Integer index1 = null; //첫 번쨰 인덱스
Integer index2 = null; //두 번째 인덱스
Integer arrNum = null; //정렬 후 인덱스
//2차원 배열 반복 시작
for(int j : i) {
if(index1 == null) { //첫 번쨰 인덱스에 배열 첫 번째 값 넣기
index1 = j;
continue; // 값 초기화 했으면 다음 배열값으로 고고 
}
if(index2 == null) { //두 번쨰 인덱스에 배열 두 번째 값 넣기
index2 = j;
continue;
}
if(arrNum == null) { //정렬 후 인덱스에 배열 마지막 값 넣기
arrNum = j;
}
}

//임시 ArrayList 선언
ArrayList<Integer> tempArr = new ArrayList<Integer>(); 

//index 변수값대로 integerArray에서 처음 index부터 마지막 index까지 값을 임시 ArrayList에 넣음
for(int i1=index1-1; i1<index2; i1++) {
tempArr.add(integerArray.get(i1));
}

Collections.sort(tempArr); //Collection sort를 이용해 오름차순 정렬
answer.add(tempArr.get(arrNum-1)); //정렬된 이후, 인덱스-1해서 리턴값 삽입
}

return answer;
}
}

 

이대로 긁어가셔서 이클립스나 인텔리제이에 붙이시고, 소스 정렬(이클립스 기준 Ctrl+i) 한 번 하시고,

진짜 간단한 로직이니까 차근차근 왜 이렇게 되나 생각해보세요.

물론 저는 튜닝 스킬은 없어서 성능 위주나 세련된 코드는 아닙니다만,

진짜 막막한 사람들에게 도움이 되지 않을까싶어 창피함 무릅쓰고 올립니다.

다들 건승하세요. 좋은 개발자로 살아남읍시다.