백준 13305 자바 및 C++

이진우·2023년 9월 22일

알고리즘 문제풀이

목록 보기
35/95

풀기 전:

이 문제를 푸는 알고리즘은 1)마지막 주유소를 제외한 나머지 주유소에서 가장 싼 주유소에서 나머지 남은 거리를 모두 넣어 버리고 2) 그 주유소 전에 있는 주유소 중 가장 싼 주유소를 찾아서 첫 번쨰 찾은 주유소 까지 거리를 계산해주고...

결국 index값이 0일 때까지 반복해주면 된다!

자바(JAVA):100점

import java.io.*;
import java.lang.reflect.Array;
import java.util.*;
import java.util.Collections;
public class Main{
    public static void main(String[] args) throws IOException {
      Scanner scanner=new Scanner(System.in);
      int n=scanner.nextInt();
      int dist[]=new int[n];
      for(int i=0;i<n-1;i++){
          dist[i]= scanner.nextInt();
      }
      int price[]=new int[n];
      for(int i=0;i<n;i++){
          price[i]= scanner.nextInt();
      }
      long total=0;
      int lastIndex=n-1;
      while(true){
          int min=1000000001;
          int minIndex=-1;
          for(int i=0;i<lastIndex;i++){
               if(min>price[i]){
                   min=price[i];
                   minIndex=i;
               }
          }
          long sumDistance=0;
          for(int i=minIndex;i<lastIndex;i++){
              sumDistance+=dist[i];
          }
          total+=sumDistance*min;
          lastIndex=minIndex;
          if(lastIndex==0){
              break;
          }
      }
      System.out.println(total);

    }
}

C++:58점? 자바랑 코드는 같으나 뭐가 문제인지 모르겠다 ㅠㅠ


#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
int main(void) {
	int n;
	cin >> n;
	int* dist = new int[n];
	for (int i = 0; i < n - 1; i++) {
		cin >> dist[i];
	}
	int* price = new int[n];
	for (int i = 0; i < n; i++) {
		cin >> price[i];
	}
	long long total = 0;
	int lastIndex = n-1;
	while (true) {
        int min = 1000000001;
        int minIndex = -1;
        for (int i = 0; i < lastIndex; i++) {
            if (min > price[i]) {
                min = price[i];
                minIndex = i;
            }
        }
        long long sumDistance = 0;
        for (int i = minIndex; i < lastIndex; i++) {
            sumDistance += dist[i];
        }
        total += sumDistance * min;
        lastIndex = minIndex;
        if (lastIndex == 0) {
            break;
        }
	}
    cout << total;
}

6개월 후에 다시 풀었을때:
위에서 설명한 그리디 알고리즘을 바탕으로 풀었다
이전 코드와는 다르게 계속 반복해가면서 최소를 찾는 것이 아니라 index와 최소의 cost 를 기록하기 위해서 Pair를 사용해서 풀었다.

import java.io.*;
import java.lang.reflect.Array;
import java.nio.Buffer;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
       Scanner scanner=new Scanner(System.in);
       int n= scanner.nextInt();
       int distance[]=new int[n];
       Pair pair[]=new Pair[n+1];
       for(int i=1;i<=n-1;i++){
           distance[i]= scanner.nextInt();
       }
       for(int i=1;i<=n;i++){
           int cost= scanner.nextInt();
          pair[i]=new Pair(i,cost);
       }
       Arrays.sort(pair,1,n);
       int prevIndex=n;
       long sum=0;
       for(int i=1;i<=n-1;i++){
           if(prevIndex>pair[i].index){
               int indexDiff=prevIndex-pair[i].index;
               long tmpDistance=0;
               for(int j=prevIndex-1;j>prevIndex-1-indexDiff;j--){
                   tmpDistance+=distance[j];
               }
               sum=sum+tmpDistance*pair[i].cost;
               prevIndex=pair[i].index;
           }
       }
        System.out.println(sum);

    }
    public static class Pair implements Comparable{
        private int index;
        private int cost;
        public Pair(int index,int cost){
            this.index=index;
            this.cost=cost;
        }

        @Override
        public int compareTo(Object o) {
            if(o instanceof Pair){
                Pair p=(Pair)o;
                if(this.cost<p.cost){
                    return -1;
                }
                else if(this.cost==p.cost){
                    return 0;
                }
                else{
                    return 1;
                }
            }
            else{
                return -1;
            }

        }
    }


}
profile
기록을 통해 실력을 쌓아가자

0개의 댓글