쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 코딩테스트
  • 알고리즘
  • 스프링
  • 위클리 챌린지
  • 백준
  • BFS
  • Spring Data JPA
  • 타임리프
  • jpa
  • 프로그래머스
  • 백분
  • 부스트코스
  • 누적합
  • spring
  • 비트마스킹
  • 인프런
  • 구현
  • MVC
  • querydsl
  • 자바

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

코딩테스트/[프로그래머스] 코딩테스트 연습

K번째수

2021. 7. 9. 22:05

문제 설명

배열 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 함수를 작성해주세요.

 

제한사항

  • array의 길이는 1 이상 100 이하입니다.
  • array의 각 원소는 1 이상 100 이하입니다.
  • commands의 길이는 1 이상 50 이하입니다.
  • commands의 각 원소는 길이가 3입니다.

입출력 예

array commands return
[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입니다.

 


푸는 방법 생각

sort함수를 이용해 배열의 부분 정렬을 하도록 했다. 배열은 clone을 이용한 얕은 복사를 통해 기존 배열의 변화없이 사용했다. 번호와 인덱스와 맞춰주기 위해 1이나 2를 빼주며 구현하고자 했다.

 

 

내코드

import java.util.Arrays;

public class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];
        int[] arr = array.clone();

        for (int i = 0; i < commands.length; i++) {
            Arrays.sort(arr, commands[i][0] - 1, commands[i][1]);
            answer[i] = arr[commands[i][0] + commands[i][2] - 2];
            arr = array.clone();
        }

        return answer;
    }
}

 

다른 사람 풀이

import java.util.Arrays;
class Solution {
    public int[] solution(int[] array, int[][] commands) {
        int[] answer = new int[commands.length];

        for(int i=0; i<commands.length; i++){
            int[] temp = Arrays.copyOfRange(array, commands[i][0]-1, commands[i][1]);
            Arrays.sort(temp);
            answer[i] = temp[commands[i][2]-1];
        }

        return answer;
    }
}

copyOfRange 함수는 배열을 부분적으로 복사하면서 정렬하는 함수로 내가 사용한 sort함수와 달리 복사를 따로 해줄 필요가 없고 내 풀이처럼 얕은 복사를 할 필요도 없는 좋은 풀이라고 생각된다.

'코딩테스트 > [프로그래머스] 코딩테스트 연습' 카테고리의 다른 글

H-Index  (0) 2021.07.12
가장 큰 수  (0) 2021.07.12
위장  (0) 2021.07.09
전화번호 목록  (0) 2021.07.09
완주하지 못한 선수  (0) 2021.07.08
    '코딩테스트/[프로그래머스] 코딩테스트 연습' 카테고리의 다른 글
    • H-Index
    • 가장 큰 수
    • 위장
    • 전화번호 목록
    쵼쥬
    쵼쥬

    티스토리툴바