๊ด€๋ฆฌ ๋ฉ”๋‰ด

Unfazedโ—๏ธ๐ŸŽฏ

[Java] ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ •๋ ฌ | ๋ฐฑ์ค€ 1461 ๋„์„œ๊ด€ ๋ณธ๋ฌธ

๋ฌธ์ œ ํ•ด๊ฒฐ (PS)/์ฝ”ํ…Œ TIL

[Java] ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ •๋ ฌ | ๋ฐฑ์ค€ 1461 ๋„์„œ๊ด€

9taetae9 2024. 11. 7. 15:46
728x90

https://www.acmicpc.net/problem/1461

 

๋‚ด ์ ‘๊ทผ ๋ฐฉ์‹

์˜ˆ์ œ ์ž…๋ ฅ 3๊ฐœ๋ฅผ ์ง์ ‘ ์†์œผ๋กœ ํ’€์–ด๋ณด์•˜๊ณ  ์˜ˆ์ œ ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๋‹ต์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์–ด ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

์† ํ’€์ด ์ ‘๊ทผ

1. 0์˜ ์œ„์น˜์— ์ฑ…์ด ๋ชจ์•„์ ธ ์žˆ์œผ๋ฏ€๋กœ 0์„ ๊ธฐ์ค€์œผ๋กœ ์Œ์ˆ˜ ์ชฝ์— ๋†“์•„์•ผ ๋  ์ฑ…๋“ค๊ณผ ์–‘์ˆ˜ ์ชฝ์— ๋†“์•„์•ผ ๋  ์ฑ…๋“ค๋กœ ๋ถ„๋ฅ˜๋จ.

2. ์ด๋ฅผ ์œ„ํ•ด ์šฐ์„  ์ฃผ์–ด์ง„ ์ฑ…์˜ ์œ„์น˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ.

=> ์ด ๋ถ€๋ถ„์—์„œ ์–ด๋–ป๊ฒŒ ์ฑ…์„ ์˜ฎ๊ธฐ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ,

๊ทธ๋ƒฅ M์”ฉ๋“ค์–ด์„œ ๋†“๊ณ  0์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์ตœ์†Œ๊ฐ€ ์•„๋‹˜์„ ํ™•์ธํ–ˆ๋‹ค. 

 

๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•˜๋‹ค 0์— ์žˆ๋Š” ์ฑ…์„ M๊ฐœ๋ฅผ ๋“ค์–ด ๋ฐ”๋กœ ์˜† ์œ„์น˜๋กœ ๋ชจ๋‘ ์ด๋™์‹œํ‚ค๊ณ , ํ•ด๋‹น ์œ„์น˜์— ๋†“์ผ ์ฑ…์„ ์ œ์™ธํ•˜๊ณ  ๋‹ค์‹œ M๊ฐœ์”ฉ ๋“ค์–ด ๋ชจ๋‘ ๊ทธ ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™์‹œํ‚ค๋Š” ๋ฐฉ์‹์„ ์ƒ๊ฐํ–ˆ๋‹ค. 

์˜ˆ์ œ 1 

7 2
-37 2 -6 -39 -29 11 -28

์˜ˆ์ œ 1์˜ ๊ฒฝ์šฐ 7๊ฐœ์˜ ์ฑ…์„ ์˜ฎ๊ฒจ์•ผํ•˜๊ณ  ์ตœ๋Œ€ 2๊ฐœ์˜ ์ฑ…์„ ๋“ค์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์™ผ์ชฝ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์˜ฎ๊ฒผ์„ ๋•Œ ์ตœ์†Œ ๊ฑธ์Œ ์ˆ˜๋กœ ์ฑ…์„ ์˜ฎ๊ธธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ด๊ฒƒ์„ ๊ณต์‹ํ™” ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์ฒ˜์Œ์—”, 

-6 ๊นŒ์ง€ ์˜ค๋Š”๋ฐ 5๋ฒˆ ์ด๋™, -6์—์„œ -28 ์‚ฌ์ด๋ฅผ 3๋ฒˆ ์ด๋™, -28์—์„œ -29๊นŒ์ง€๋ฅผ 3๋ฒˆ์ด๋™, -29์—์„œ -37๊นŒ์ง€ 1๋ฒˆ, -37์—์„œ -39๊นŒ์ง€ 1๋ฒˆ์œผ๋กœ ๋‚˜๋ˆ„์–ด์„œ ๊ทœ์น™์„ ์ฐพ์•„๋ณด์•˜๋‹ค.

์ตœ๋Œ€๋กœ ๋“ค์ˆ˜ ์žˆ๋Š” ์ฑ… M์ด 2์—ฌ์„œ 5๋ฒˆ, 3๋ฒˆ, 3๋ฒˆ, 1๋ฒˆ, 1๋ฒˆ์œผ๋กœ 2 ๋‹จ์œ„์”ฉ ํšŒ์ˆ˜๊ฐ€ ์ฃผ๋Š” ํŒจํ„ด์„ ๋ฐœ๊ฒฌํ–ˆ๋Š”๋ฐ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ ค๋‹ˆ ๋„ˆ๋ฌด ์ˆ˜์‹์ด ๋งŽ์•„์ง€๋Š” ๋ถˆํŽธํ•จ์„ ๋А๊ผˆ๋‹ค.

 

์œ„์˜ ๊ทธ๋ฆผ์˜ ํ™”์‚ดํ‘œ๋“ค์„ ์ด์–ด์ง€๊ฒŒ ํ•œ๋ฒˆ์— ๊ทธ๋ ค๋ณด์•˜๊ณ , ์•„๋ž˜์™€ ๊ฐ™์ด ๋” ์ง๊ด€์ ์ด ํŒจํ„ด์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

-39๊นŒ์ง€ ๊ฐ€๋Š” ํ™”์‚ดํ‘œ(0์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ์žˆ๋Š” ์ง€์ )์„ ์ œ์™ธํ•˜๊ณ ๋Š” ๋ชจ๋‘ 2๊ฐœ์˜ ํ™”์‚ดํ‘œ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

39๋ฅผ ๋”ํ•˜๊ณ , ๋‹ค์Œ๋กœ ํ•„์š”ํ•œ ํ™”์‚ดํ‘œ๋Š” -39 ์ง€์ ์—์„œ 2์นธ ๋” ์ด๋™ํ•œ(M=2์ด๋ฏ€๋กœ) ์ง€์  -29 ์—์„œ 0๊นŒ์ง€์˜ ๊ธธ์ด 29๋ฅผ ๋‘๋ฒˆ,

-29 ์ง€์ ์—์„œ ๋‘ ์นธ ๋” ์ด๋™ํ•œ -6 ์ง€์ ์—์„œ 0๊นŒ์ง€ ๊ธธ์ด 6์„ ๋‘๋ฒˆ,

์–‘์ˆ˜ ์ชฝ์—์„œ๋Š” ๋์ง€์  11์—์„œ 2๋ฒˆ์„ ๋ชจ๋‘ ํ•ฉํ•˜๋ฉด ์ตœ์†Œ ๊ฑธ์Œ 131๋ฒˆ์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์˜ˆ์ œ 2๋ฅผ ํ†ตํ•ด์„œ ์ด ๋ฐฉ๋ฒ•์ด ์ •๋‹ต์ž„์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์˜ˆ์ œ 2

8 3
-18 -9 -4 50 22 -26 40 -45

 

์™ผ์ชฝ ๋ณต์žกํ•œ ๊ทธ๋ฆผ์˜ ๋‹จ๊ณ„๋ฅผ ๋‹ค์‹œ ํ•˜๋‚˜์˜ ํ™”์‚ดํ‘œ๋กœ ๊ธธ๊ฒŒ ์ด์–ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ ๋‹จ์ˆ˜ํ™” ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

๋‹จ์ˆœํ™”์‹œํ‚จ ๊ฒฝ๋กœ์—์„œ ๊ฐ€์žฅ 0์œผ๋กœ ๋ถ€ํ„ฐ ๋จผ ๊ฑฐ๋ฆฌ์˜€๋˜ 50์„ ํ•œ๋ฒˆ ๋‚˜๋จธ์ง€ 45๋ฅผ 2๋ฒˆ, -45์—์„œ 3์นธ(M=3 ์ด๊ธฐ ๋•Œ๋ฌธ)๊ฐ„ -9์ง€์ ์—์„œ 9๋ฅผ 2๋ฒˆ ๋”ํ•ด์ฃผ๋ฉด ์ตœ์†Œ ๊ฑธ์Œ 158์„ ๊ตฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

์ฝ”๋“œ ์ž‘์„ฑ

N, M, books ๋ฐฐ์—ด ์ดˆ๊ธฐํ™” ํ›„ books ๋ฐฐ์—ด ์›์†Œ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ

static int N; // ์ฑ… ๊ฐœ์ˆ˜
static int M; // ํ•œ ๋ฒˆ์— ์˜ฎ๊ธธ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์ฑ… ๊ฐœ์ˆ˜
static int[] books;

public static void main(String[] args) throws Exception {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());

    N = Integer.parseInt(st.nextToken());
    M = Integer.parseInt(st.nextToken());

    books = new int[N];
    st = new StringTokenizer(br.readLine());
    for (int i = 0; i < N; i++) {
        books[i] = Integer.parseInt(st.nextToken());
    }

    Arrays.sort(books); // NlogN

    System.out.println(findMinimumSteps());
}

 

์ตœ์†Œ ๊ฑธ์Œ ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” findMinimumSteps() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„

int totalSteps : ์ด ๊ฑธ์Œ ์ˆ˜

int lastNegativeIndex : ์Œ์ˆ˜์™€ ์–‘์ˆ˜์˜ ๊ฒฝ๊ณ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ์Œ์ˆ˜ ์งํ›„ ์ธ๋ฑ์Šค(์ฒซ ์–‘์ˆ˜ ๋“ฑ์žฅํ•˜๋Š” ์ง€์ )

int farthest : 0 ๊ธฐ์ค€ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ ธ ์žˆ๋Š” ๊ฑฐ๋ฆฌ => ํŽธ๋„ ์ฒ˜๋ฆฌ(1๋ฒˆ๋งŒ ๋”ํ•  ๊ฑฐ๋ฆฌ)

=> ์Œ์ˆ˜, ์–‘์ˆ˜ ๋‘˜๋‹ค ์กด์žฌํ•  ๊ฒฝ์šฐ : ์ฒซ ์›์†Œ์˜ ์ ˆ๋Œ€๊ฐ’๊ณผ ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ ๋Œ€์†Œ ๋น„๊ต

=> ์–‘์ˆ˜๋งŒ ์žˆ์„ ๊ฒฝ์šฐ : ๊ฐ€์žฅ ๋ ์›์†Œ, ์Œ์ˆ˜๋งŒ ์žˆ์„ ๊ฒฝ์šฐ : ๊ฐ€์žฅ ์ฒซ ์›์†Œ์˜ ์ ˆ๋Œ€๊ฐ’

 

์Œ์ˆ˜ ๊ตฌ๊ฐ„ ๋‚ด : ์ฒซ ์›์†Œ ๋ถ€ํ„ฐ M ๋‹จ์œ„๋กœ ์ธ๋ฑ์Šค ์ ํ”„ํ•˜๋ฉฐ totalSteps์— ๊ฑฐ๋ฆฌ ๋”ํ•˜๊ธฐ

์–‘์ˆ˜ ๊ตฌ๊ฐ„ ๋‚ด : ๋งˆ์ง€๋ง‰ ์›์†Œ๋ถ€ํ„ฐ -M ๋‹จ์œ„๋กœ ์ธ๋ฑ์Šค ์ ํ”„ํ•˜๋ฉฐ totalSteps์— ๊ฑฐ๋ฆฌ ๋”ํ•˜๊ธฐ

 

์ด๋ ‡๊ฒŒ ๊ตฌํ•œ totalSteps์— 2๋ฅผ ๊ณฑํ•˜์—ฌ ํ•œ๋ฒˆ์— ์™•๋ณต ์ฒ˜๋ฆฌ 

๋งˆ์ง€๋ง‰์œผ๋กœ ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ์˜€๋˜ farthest์—์„œ๋Š” ๋‹ค์‹œ 0์œผ๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์œผ๋ฏ€๋กœ ์™•๋ณต ์ฒ˜๋ฆฌํ–ˆ๋˜ ๊ฒƒ์—์„œ ํ•œ๋ฒˆ ๋นผ์ฃผ์–ด ์ œ์™ธ์‹œํ‚จ๋‹ค.

totalSteps -= farthest;

private static int findMinimumSteps() {
    int totalSteps = 0;

    int lastNegativeIndex = 0;
    while (lastNegativeIndex < N && books[lastNegativeIndex] < 0) {
        lastNegativeIndex++;
    }

    // ๊ฐ€์žฅ ๋จผ ์œ„์น˜ ํ™•์ธ
    int farthest = 0;
    if (lastNegativeIndex > 0 && lastNegativeIndex < N) {
        farthest = Math.max(Math.abs(books[0]), books[N - 1]);
    } else if (lastNegativeIndex == 0) { // ์–‘์ˆ˜๋งŒ ์žˆ์„ ๋•Œ
        farthest = books[N - 1];
    } else { // ์Œ์ˆ˜๋งŒ ์žˆ์„ ๋•Œ
        farthest = -books[0];
    }

    // ์Œ์ˆ˜ (0 ~ lastNegativeIndex ๋ฏธ๋งŒ)
    for (int i = 0; i < lastNegativeIndex; i += M) { //M๊ฐœ ๋‹จ์œ„๋กœ ์˜ฎ๊ธฐ๊ธฐ
        totalSteps += Math.abs(books[i]);
    }

    // ์–‘์ˆ˜ (lastNegativeIndex ~ ๋)
    for (int i = N - 1; i >= lastNegativeIndex; i -= M) {
        totalSteps += books[i];
    }

    totalSteps *= 2; //๋ชจ๋“  ๊ฒฝ์šฐ ์™•๋ณต ์ฒ˜๋ฆฌ ์œ„ํ•ด 2๋ฐฐ ์ฒ˜๋ฆฌ
    totalSteps -= farthest; //๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ ํŽธ๋„ ์ฒ˜๋ฆฌ

    return totalSteps;
}

 

 

์ด๋ฒˆ ๋ฌธ์ œ๋Š” ์ง์ ‘ ๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด๊ณ  ํ‘ผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•˜๊ธฐ์—๋Š” ๋ณต์žกํ–ˆ๋˜ ๋กœ์ง์„ ๋‹จ์ˆœํ™”ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ์ข€ ๋” ๋‹ค์–‘ํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„์„ ๋‹จ์ถ•์‹œ์ผœ๋ด์•ผ๊ฒ ๋‹ค.

728x90