๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
ProgramSolve/Baekjoon

[BOJ] 31066๋ฒˆ - ๋น„ ์˜ค๋Š” ๋‚  (Java)

by SooooooooS 2024. 1. 2.
728x90

๐Ÿ› ๏ธ ๋ฌธ์ œ ๐Ÿ› ๏ธ


๐Ÿ—’๏ธ ์„ค๋ช… ๐Ÿ—’๏ธ

2023.12.30์ผ์— ์ฒ˜์Œ์œผ๋กœ SciOI 2023 Open Contest · Arena #16 ์— ์ฐธ๊ฐ€ํ–ˆ๋‹ค.

์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋ฅผ ๋ณธ๋‹ค๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ธด์žฅ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘ํ–ˆ๋‹ค. ์ด ๋ฌธ์ œ๊ฐ€ ์ฒซ ๋ฌธ์ œ์˜€๋‹ค.

๋‹น์‹œ์— ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ๋Š”์ง€ ๊ผฌ์—ฌ๋ฒ„๋ ธ๋˜ ๋ฌธ์ œ๋ฅผ ์˜ค๋Š˜ ๋‹ค์‹œ ์ •๋ฆฌํ•ด์„œ ํ’€์–ด๋ณด์•˜๋‹ค.

ํ’€์ด ๊ณผ์ •์—์„œ 2๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ์•Œ๊ฒŒ๋˜์–ด ์ด๋ฅผ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

1. ํ‹€๋ฆฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

if(m == 1 && k == 1) return -1;

 

์ฒ˜์Œ์—๋Š” ์œ„์™€ ๊ฐ™์ด ์šฐ์‚ฐ์ด 1๊ฐœ์ด๊ณ  ์šฐ์‚ฐ์„ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ ์ˆ˜๊ฐ€ 1๋ช…์ผ ๊ฒฝ์šฐ์—๋Š” ๋ฌด์กฐ๊ฑด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ๋งŒ์•ฝ์— ์‚ฌ๋žŒ์ด ๊ฑด๋„ˆ์•ผ ํ•˜๋Š” ์‚ฌ๋žŒ์ด 1๋ช…์ด๋ฉด ์ด ๊ฒฝ์šฐ์—๋„ ๋ถˆ๊ฐ€๋Šฅํ• ๊นŒ?

๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„ ์ฒซ๋ฒˆ์งธ์˜€๋‹ค. ์‚ฌ๋žŒ์ด 1๋ช…์ผ ๊ฒฝ์šฐ์—๋Š” 1ํšŒ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋นผ๋จน์—ˆ์—ˆ๋‹ค.

if(m == 1 && k == 1) {
    if(n == 1) return 1; //์‚ฌ๋žŒ์ด 1๋ช…์ด๋ฉด 1๋ฒˆ์œผ๋กœ ๊ฐ€๋Šฅ
    return -1;
}

2. ๋ณต์žกํ•œ ์ƒ๊ฐ

๋Š˜ ๊ธด์žฅํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋งˆ๋‹ค ํ‰์†Œ๋ณด๋‹ค ๋ฌธ์ œ๋ฅผ ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•œ๋‹ค๊ณ  ๋Š๋‚€๋‹ค.

์ด ๋ฌธ์ œ์—์„œ๋„ ์„ค๋ช…์ด ์นœ์ ˆํ•˜๊ฒŒ ๋˜์–ด์žˆ์–ด ๊ตฌํ˜„์„ ์ฐจ๊ทผ์ฐจ๊ทผํ•ด๋ณด๋ฉด ํ’€๋ ธ์„ ๊ฒƒ ๊ฐ™๋‹ค.

ํ•˜์ง€๋งŒ ๋‹น์‹œ์— ์ˆ˜์‹์œผ๋กœ ํ’€์–ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ณ„์† ํ•˜๋ฉด์„œ ํ‹€๋ฆฐ ์ ์„ ์ฐพ์•„๊ฐ€๋ ค๊ณ  ํ–ˆ๋‹ค. ์•„๋ž˜๋Š” ํ‹€๋ฆฐ ํ’€์ด์ด๋‹ค.

n % (m*k-1) == 0 ? n / (m*k-1) : n / (m*k-1) + 1

 

์ด ๋ฌธ์ œ๋ฅผ ๋”ฑ ๋ณด์ž๋งˆ์ž ์ƒ๊ฐ๋‚œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ Greedy์ด๋‹ค.

ํ•œ๋ฒˆ ์ด๋™ํ•  ๋•Œ ๋ชจ๋“  ์šฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋™ํ•˜๊ณ  1๋ช…์ด ๋ชจ๋“  ์šฐ์‚ฐ์„ ๋“ค๊ณ  ๋Œ์•„์™€์•ผ์ง€ ์ตœ์†Œ ์ด๋™ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ด๋Œ€๋กœ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด ๋งž์„ ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์œ„์™€ ๊ฐ™์ด ์ƒ๊ฐํ•˜๋ฉด์„œ m*k๋ช…์ด ๊ฐ”๋‹ค๊ฐ€ 1๋ช…์ด ๋Œ์•„์˜ค๋ฉด ๋œ๋‹ค๋Š” ์ƒ๊ฐ์— m*k-1 ์„ ๊ฐ€์ง€๊ณ  ์ˆ˜์‹์„ ์ž‘์„ฑํ•˜๋ ค ํ–ˆ๋‹ค.

๋ฐ˜๋ก€๋Š” n๋ฒˆ๋ณด๋‹ค ๋” ๋งŽ์€ ํšŸ์ˆ˜๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•˜๋Š”๋ฐ ์œ„์˜ ํ’€์ด๋Š” n๋ฒˆ ์ดํ•˜๋งŒ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋ก€ - ์˜ฌ๋ฐ”๋ฅธ ์ •๋‹ต

 

์œ„์™€ ๊ฐ™์€ ์ž…๋ ฅ์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด ์ˆ˜์‹ ํ’€์ด๋Š” 5ํšŒ๋ผ๋Š” ์ž˜๋ชป๋œ ๋‹ต์„ ๋„์ถœํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ์„ค๋ช…๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.

int count = 0;
int start = n;
int s = m;
int end = 0;
int e = 0;

while(end < n) {
    if(s != 0) {
        int t = s * k;
        start -= t;
        end += t;
        e += s;
        s = 0;
    }
    else {
        start += 1;
        end -= 1;
        s = e;
        e = 0;
    }
    count++;
}

 

์•„๋งˆ ์‹ค์ œ ๋Œ์•„๊ฐ€๋Š” ๋ฐฉ์‹๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ ค ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐ˜๋ก€๋ฅผ ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์•˜์„ ๊ฒƒ ๊ฐ™๋‹ค.

๋จธ๋ฆฌ๋ฅผ ์‹ํžˆ๊ณ  ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ •๋ง ๋‹จ์ˆœํ•œ ๋ฌธ์ œ์˜€์ง€๋งŒ ๊นจ๋‹ฌ์€ ์ ์ด ์žˆ๋‹ค.

 

๋Š˜ ์‹œ๊ฐ„์— ์ซ“๊ฒจ ๋น ๋ฅด๊ฒŒ ํ’€๋ ค๊ณ  ํ•˜๋Š๋ผ ์‹œ์•ผ๊ฐ€ ์ข์•„์ง€๊ณ  ์žˆ์—ˆ๋‹ค.

๋งŒ์•ฝ ํ’€๋ฆด ๊ฒƒ ๊ฐ™์€๋ฐ ๊ณ ์น˜๋ฉด ๊ณ ์น ์ˆ˜๋ก ๊ผฌ์—ฌ๊ฐ€๋Š” ๋Š๋‚Œ์ด ๋“ค๋ฉด ๊ธ‰ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  ๋ณด์ด๋Š” ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ  ๊ทธ ๋‹ค์Œ์— ์ด๋ฅผ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งˆ์Œ์˜ ์—ฌ์œ ๋ฅผ ๊ฐ€์ ธ์•ผ๊ฒ ๋‹ค.


๐Ÿ€ ํ’€์ด ๐Ÿ€

package SciOI2023;

import java.io.*;
import java.util.StringTokenizer;

public class A1 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int t = Integer.parseInt(br.readLine());
        StringTokenizer st;
        for(int i = 0; i < t; i++) {
            st = new StringTokenizer(br.readLine());
            int n = Integer.parseInt(st.nextToken());
            int m = Integer.parseInt(st.nextToken());
            int k = Integer.parseInt(st.nextToken());

            bw.write(solve(n, m, k) + "\n");
        }
        bw.flush();
        bw.close();
    }

    public static int solve(int n, int m, int k) {
        if(m == 1 && k == 1) { //์šฐ์‚ฐ์ด 1๊ฐœ์ด๊ณ  1๋ช…๋งŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด
            if(n == 1) return 1; //์‚ฌ๋žŒ์ด 1๋ช…์ด๋ฉด 1๋ฒˆ์œผ๋กœ ๊ฐ€๋Šฅ
            return -1; //๊ทธ ์™ธ์—๋Š” ๋ถˆ๊ฐ€๋Šฅ
        }

        int count = 0;
        boolean umbrella = true; //์šฐ์‚ฐ์ด ์ฐฝ์˜ ์ธ์žฌ๊ด€์— ์žˆ๋Š”์ง€
        int destination = 0; //์œตํ•ฉ์ธ์žฌ๊ด€์— ์žˆ๋Š” ํ•™์ƒ ์ˆ˜

        while(destination < n) {
            if(umbrella) {
                destination += m * k;
                umbrella = false;
            }
            else {
                destination -= 1;
                umbrella = true;
            }
            count++;
        }
        return count;
    }
}
728x90