본문 바로가기
내가 배운 것들/알고리즘

항해99 11/12(금) 알고리즘 - 알아서 푼 것들

by Zabee52 2021. 11. 12.

설탕 배달

 

2839번: 설탕 배달

상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그

www.acmicpc.net

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int answer = 0;

        while(n > 0){
            if(n % 5 == 0){
                n -= 5;
            }else if(n % 3 == 0) {
                n -= 3;
            }else if(n - 5 >= 3) {
                n -= 5;
            }else if(n - 3 >= 3){
                n -= 3;
            }else{
                // 정확하게 잴 수 없으면 -1 넣어주기
                answer = -1;
                break;
            }
            answer++;
        }
        System.out.println(answer);
    }
}

 

반갑다 백준. 너를 처치하러 왔다.

수학문제였다. 수학이 어렵다. 수학 잘 하는 사람들은 더 예쁘게 풀었다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    int n = Integer.parseInt(br.readLine());
    int count = 0;

    while((n % 5 != 0) && (n > 0)){

      n = n-3;
      count++;
    }

    if(n < 0){
      System.out.println(-1);
    } else {
      System.out.println(count + n/5);
    }
  }

}

일단 3으로 처리한다음 n/5를 더한다는 발상은 어떻게 해낸건지 대단하다..... 수학 잘 하는 사람들 부럽다.

 

 

 

 

Fly me to the Alpha Centauri

 

1011번: Fly me to the Alpha Centauri

우현이는 어린 시절, 지구 외의 다른 행성에서도 인류들이 살아갈 수 있는 미래가 오리라 믿었다. 그리고 그가 지구라는 세상에 발을 내려 놓은 지 23년이 지난 지금, 세계 최연소 ASNA 우주 비행

www.acmicpc.net

 

 

이건.. 못 풀었다. 수학은 젬병이라 규칙을 못 찾았다. 넌 진짜 두고보자.

 

 

 

 

JM's IT Blog

개발쟁이가 되기 위한 생초짜의 기술 블로그 기록기

jm-park.github.io

풀이 사이트는 여기 있다.

 

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 이전 작동시기보다 k광년 이동하면 k-1, k, k+1 광년만 이동 가능
        // 처음 작동 시에는 1광년만 이동 가능
        // 1광년 이동하면 다음에는 0, 1, 2광년 이동 가능. 2광년 이동하고나면 1, 2, 3광년 이동 가능
        // x에서 출발해 y로 도착하려고 할 때, 최소한의 작동 횟수로만 할 수 있도록 한다.
        // 대신, y지점에 도착하기 직전의 이동거리는 반드시 1광년이어야함.
        // 이동의 최솟값을 구하는 프로그램 작성하기.
        // x는 y보다 항상 낮음
        Scanner sc = new Scanner(System.in);

        int cnt = sc.nextInt();
        int[] x = new int[cnt];
        int[] y = new int[cnt];
        int[] answer = new int[cnt];

        for(int i = 0; i < cnt; i++){
            x[i] = sc.nextInt();
            y[i] = sc.nextInt();
        }

        for(int i = 0; i < cnt; i++){
            // 우주선의 속도의 기준점. 1광년 이미 이동했다고 가정
            int shift_idx = 1;
            int distance = y[i] - x[i] - 1;
            answer[i]++;

            while(distance != 0){
                // 도착지점 직전 이동거리는 반드시 1광년이어야함 = shift_idx가 2 이하여야함
                // 1 2 1
                // 4 - 2 <= 1
                // distance = 2
                // 2 - 3 <= 1
                // distance = 1
                // 1 - 2 <= 1
                // distnace = 1
                // distance = 100이라고 치면
                // 1 2 3 4 5 6 7 8 9 10 만 해도 55야... 감속불가
                // 1 2 3 4 5 6
                if(distance - (shift_idx+1) <= shift_idx){
                    distance -= --shift_idx;
                }else{
                    distance -= ++shift_idx;
                }
                answer[i]++;
            }
        }

        for(int out : answer){
            System.out.println(out);
        }
    }
}

이건 작동하지 않는 상태인데, 나중에 고치거나 갈아엎을 예정이다. 일단 남겨만 놓음.

 

 

영화감독 숌

 

1436번: 영화감독 숌

666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타

www.acmicpc.net

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int cnt = sc.nextInt();
        
        List<String> list = new ArrayList<>();
        for(int i = 666; i <= 10000000; i++){
            String str = String.valueOf(i);
            if(str.contains("666")) {
                list.add(str);
                if(list.size()>=10000){
                    break;
                }
            }
        }
        
        System.out.println(list.get(cnt-1));
    }
}

사실 속도가 부족해서 안 될 줄 알았는데.. 되네? 생각보다 제한시간이 넉넉했나보다. 뭐 나야 좋지.

최적화된 코드를 짤 수 있을 것 같은데, 짜는데 시간이 너무 오래 걸릴 것 같다. 이것도 시간이 나면 한 번 시도를 해봐야겠다.

댓글