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

[프로그래머스] Java 코딩테스트 연습 - 5명씩

_꼬마돌 2023. 6. 21. 09:32
반응형

[프로그래머스] Java 코딩테스트 연습 - 5명씩

문제 출처

https://school.programmers.co.kr/learn/courses/30/lessons/181886

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제

최대 5명씩 탑승가능한 놀이기구를 타기 위해 줄을 서있는 사람들의 이름이 담긴 문자열 리스트 name가 주어질 때, 앞에서 부터 5명씩 묶은 그룹의 가장 앞에 서있는 사람들의 이름을 담은 리스트를 return하도록 solution 함수를 환성해주세요. 마지막 그룹이 5명이 되지 않더라도 가장 앞에 있는 사람의 이름을 포함합니다. 

 

풀이

Arrays.copyOfRange() 메소드를 사용하여 풀었다. 이전에 사용했던 System.arraycopy() 메소드와 비슷하지만 차이가 있다.

Arrays.copyOfRange()는  java.util.Arrays 클래스에서 제공된다. 원본 배열의 지정된 범위를 새로운 배열로 복사하여 반환하며, 다음과 같은 형식으로 사용된다.
Arrays.copyOfRange(original, int from, int to)

original : 복사할 원본 배열
from : 복사를 시작할 인덱스. 이 인덱스를 포함하여 복사된다.
to : 복사를 종료할 인덱스. 이 인덱스는 복사되지 않는다. (to  - 1) 인덱스까지 복사된다.
Arrays.copyOfRange() 메서드를 이용하여 names 배열을 처음부터 5개씩 복사하여 group 배열에 저장.
add() 메서드를 이용하여 group 배열의 첫 번째 요소를 answerList에 추가.
다시 Arrays.copyOfRange() 메서드로 names 배열을 5와 names배열의 길이중 작은 값에 해당하는 자리부터 names 배열의 끝까지 복사하여 그 결과를 다시 names에 할당한다. (앞서 이미 복사된 요소들을 뺀 나머지 요소들만 복사)
이 과정을 names 배열이 0이 될 때까지 반복.

Math.min() 메서드를 넣은 이유 (Math.min(a , b) 두 개의 인수 a 와 b 중에서 작은 값을 반환하는 메서드) :
문제에서 5명씩 묶은 그룹의 가장 앞에 있는 사람들의 이름을 담은 리스트를 return 하라고 했기 때문에 names 배열의 요소들을 5개씩 묶어 구분해야했는데, 그냥 5를 넣으면 남은 요소의 수보다 5가 더 클 경우 에러가 발생한다. 그래서 남은 names 배열의 요소의 수와 5를 비교하여 더 작은 쪽 만큼만 복사하도록 했다.

반복이 종료되면, answerList에는 모든 그룹의 가장 앞에 있는 사람의 이름이 담겨져 있다.
answerList의 크기를 이용하여 answer 배열을 생성하고 toArray() 메서드로 answerList의 요소들을 배열로 변환하여 answer에 할당.

 

소스코드

import java.util.*;

class Solution {
    public String[] solution(String[] names) {
        List<String> answerList = new ArrayList<>();
        
        while (names.length > 0) {
            String[] group = Arrays.copyOfRange(names, 0, Math.min(5, names.length));
            answerList.add(group[0]);
            names = Arrays.copyOfRange(names, Math.min(5, names.length), names.length);
        }
        
        String[] answer = new String[answerList.size()];
        answer = answerList.toArray(answer);
        return answer;
    }
}

 

반응형