인프런 커뮤니티 질문&답변

현이님의 프로필 이미지
현이

작성한 질문수

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

10. 마구간 정하기(결정알고리즘)

10. 마구간 정하기 [ 비슷하지만 다른 해답] 이래도 맞게 푼 걸까요??

작성

·

215

·

수정됨

0

  1. 채점사이트에서 출력은 "첫 줄에 가장 가까운 두 말의 최대 거리를 출력하세요." 라고 되어 있었습니다.

  2. 제 생각대로라면 말들이 여러마리니까 가장 가까운 말들의 거리가 말들마다 다를수도 있겠다는 생각이 들어. 최대거리를 구하기 위해 코드를 조금 다르게 쳤습니다.

     

  3. 채점사이트에서는 정답처리 되었는데 확신이 안들어서 이 방식대로 풀어도 되는지 피드백주세요. 또한, 제가 한 방식과 원래 풀이가 어떤 차이가 있는지 궁금합니다.

  • 첨부

  • 1. 원래 풀이, 내가 생각한 풀이

  • 2. 문제 전체 소스코드

     

*강의 풀이 방식 count()

public int count(int[]arr, int distance){
    int ep=0, cnt=1;
    for(int i=1; i<arr.length; i++){
        //배치가능
        if(arr[i]-arr[ep] >= distance){
            cnt++;
            ep=i;
        }
    }
    return  cnt;
}

*내가 푼 방식 count()

public int[] count(int[]arr, int distance){
    int [] res = new int[2];
    int ep=0, cnt=1;
    int min = Integer.MAX_VALUE;
    for(int i=1; i<arr.length; i++){
        //배치가능
        if(arr[i]-arr[ep] >= distance){
            cnt++;
            min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리
            ep=i;
        }
    }
    res[0] = cnt; // distance로 배치되는 말의 수
    res[1] = min; // 말들의 최소 거리
    return  res;
}

*강의 풀이 방식 solution()내부 이진탐색 while문

while (lt<=rt){
    int mid = (lt+rt) / 2;
    //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다.
    if(count(arr,mid) >= m){ // mid : 말들의 최소거리
        lt = mid+1;
        answer = mid;
    }
    else rt = mid-1;
}

*내가 푼 solution()내부 이진탐색 while문

while (lt<=rt){
    int mid = (lt+rt) / 2;
    int res[] = count(arr,mid);
    //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다.
    if(res[0] >= m){ // mid : 말들의 최소거리
        lt = mid+1;
        answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다.
        //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서)
    }
    else rt = mid-1;
}

 

 

  • 전체 소스코드

import java.util.*;
public class Main {
    public int[] count(int[]arr, int distance){
        int [] res = new int[2];
        int ep=0, cnt=1;
        int min = Integer.MAX_VALUE;
        for(int i=1; i<arr.length; i++){
            //배치가능
            if(arr[i]-arr[ep] >= distance){
                cnt++;
                min = Math.min(min,arr[i]-arr[ep]); // 말들의 최소거리
                ep=i;
            }
        }
        res[0] = cnt; // distance로 배치되는 말의 수
        res[1] = min; // 말들의 최소 거리
        return  res;
    }
    public int solution(int n ,int m, int[] arr){
        int answer = 0;
        Arrays.sort(arr);
        int lt = 1;
        int rt = arr[n-1]-arr[0]; //arr[arr.length-1]로 끝내도 큰 차이 없음
        while (lt<=rt){
            int mid = (lt+rt) / 2;
            int res[] = count(arr,mid);
            //mid최소거리만큼 배치했을때 m보다 더 배치할 수 있으므로 거리를 늘린다.
            if(res[0] >= m){ // mid : 말들의 최소거리
                lt = mid+1;
                answer = res[1]; // answer = mid 가 아닌 count메소드에서 계산한 말들의 최소거리를 넣어준다.
                //(말들이 여러마리일때 가장 가까운말의 최대거리를 구하라고 문제에 명시되어있어서)
            }
            else rt = mid-1;
        }
        return answer;
    }
    public static void main(String[] args) {
        Main M = new Main();
        Scanner kb = new Scanner(System.in);
        int n = kb.nextInt();
        int m = kb.nextInt();
        int [] arr = new int [n];
        for(int i=0;i<n;i++)arr[i]= kb.nextInt();
        System.out.print(M.solution(n,m,arr));
    }
}

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
Dev_spidy님, 코딩테스트에 임하며 최적의 코드를 찾기 위한 고민, 그리고 여러 방식으로 접근해보는 시도는 매우 중요합니다.

먼저 말씀하신 문제는 마구간에 말을 배치하는 문제이며, 가장 인접한 두 말의 거리를 최대화하는 것이 목표입니다. 거리를 기준으로 이진탐색을 통해 문제를 해결하는 경우, 가능한 배치의 경우에서 가장 가까운 말의 거리가 최대가 되는 값을 찾습니다.

강의에서 제시된 count() 메서드는 주어진 거리(difference) 이상으로 말을 배치할 때 배치할 수 있는 말의 수를 반환합니다. 여기서는 말들 간의 실제 거리를 계산하지 않고 말의 수만 계산하는 것으로, 배치 가능한 말의 수가 조건에 맞는지만 검증합니다.

반면, Dev_spidy님이 작성하신 count() 메서드는 거리를 초과하는 배치가 가능할 때, 배치된 말들의 가장 가까운 거리(min)도 같이 계산하여 반환합니다. 이는 문제의 요구사항을 충족하는 값이기도 하고, 또한 추가 정보를 이용해 검색 범위를 조정하는데 활용할 수 있습니다.

이진 탐색의 경우, 조건을 만족하는 최대 거리를 찾는 과정인데 solution() 메서드의 차이를 보면 강의에서는 count() 함수로부터 말의 수만 확인하고 mid 값을 답(answer)으로 사용하는 반면, Dev_spidy님의 코드는 말들의 실제 최소 거리를 답으로 사용하는 차이가 있습니다.

이 방식대로 풀어도 되는지 여부는, 문제의 정확한 조건과 채점 기준에 달려있습니다. 채점 사이트에서 정답 처리되었다면, 문제의 기준에 부합하는 것으로 보아 Dev_spidy님의 접근 방식은 타당할 수 있습니다. 다만, 실제로 코딩테스트를 보는 상황에서는 문제를 꼼꼼히 읽고 요구 사항에 정확히 맞는 코드를 작성하는 것이 좋습니다. 추가로 알고리즘의 효율성도 고려해보실 필요가 있습니다.

코딩테스트를 준비하시며 작성하신 코드에 대해 의문이 생기거나 다양한 풀이를 시도하고 싶을 때 이와 관련된 커뮤니티나 Stack Overflow와 같은 플랫폼에서 관련 질문을 남기고, 다른 사람들의 답변과 피드백을 받는 것도 좋은 학습 방법이 될 것입니다.

계속해서 새로운 접근과 시도를 통한 학습을 하시길 바랍니다. 화이팅입니다!

현이님의 프로필 이미지
현이

작성한 질문수

질문하기