์ „์ฒด ๊ธ€ (165)

๋ฐ˜์‘ํ˜•
02
23

@Immutable
data class LoginState(
    val id: String = "",
    val password: String = "",
)

์ปดํฌ์ฆˆ๋กœ ๊ฐœ๋ฐœ ์ค‘์ธ๋ฐ, ์ด์ „ UiState์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ ์“ฐ๋Š” data class์— `@Immutable` ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ค˜์•ผํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•ด์•ผ๋ ๊นŒ?

 

`@Immutable`์€ ๊ฐ์ฒด๊ฐ€ ๋ถˆ๋ณ€(Immutable)์ž„์„ ๋ช…์‹œํ•˜์—ฌ, ๋‚ด๋ถ€ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ์ผ์ด ์—†๋‹ค๊ณ  Compose์—๊ฒŒ ์•Œ๋ ค์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.  ํ•˜์ง€๋งŒ, @Immutable์ด ๋ถ™์–ด ์žˆ๋‹ค๊ณ  ํ•ด์„œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ "์ ˆ๋Œ€ ์•ˆ ํ•˜๋Š” ๊ฒƒ"์ด ์•„๋‹ˆ๋ผ, ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

`@Stable`์€ ๊ฐ์ฒด๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์ง€๋งŒ, Compose๊ฐ€ ๋‚ด๋ถ€ ํ•„๋“œ ๋ณ€ํ™”๊นŒ์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
์ฆ‰, @Stable์ด ๋ถ™์–ด ์žˆ๋Š” ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฆฌ์ปดํฌ์ง€์…˜์ด ๋ฐœ์ƒํ•˜์ง€๋งŒ, ๊ฐ์ฒด๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์ปดํฌ์ง€์…˜์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ข€ ๋” ์ž์„ธํžˆ ๋ณด๊ฒ ๋‹ค.

@Composable
fun UserProfile(user: User) {
    /* body */ 
}

์ปดํฌ์ €๋ธ”ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ, ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ฆฌ์ปดํฌ์ง€์…˜์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ, ์ด ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋Š” user์˜ ํ”„๋กœํผํ‹ฐ ๊ฐ’์ด ๋ฐ”๋€Œ์ง€์•Š๋Š” ํ•œ UserProfile์ด ๋ฆฌ์ปดํฌ์ง€์…˜ ๋˜์ง€์•Š๋Š”๋‹ค.(๋ณด๊ณ ์žˆ๋Š” ์ƒํƒœ๊ฐ€ user ํ•˜๋‚˜๋ผ๊ณ  ํ–ˆ์„ ๋•Œ)

 

@Composable
fun Counter() {
    var count by remember { mutableStateOf(0) }

    Button(onClick = { count++ }) {
        Text("Count: $count")
    }
}

์ปดํฌ์ฆˆ์—์„œ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒํƒœ๋ผ๊ณ  ๋ณดํ†ต ์–˜๊ธฐํ•˜๋Š”๋ฐ, `by remember { mutableStateOf(T) }`๋กœ ์„ ์–ธํ•ด์„œ ์ผ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ var ๊ฐ์ฒด๋กœ ์„ ์–ธ๋œ ๊ฑด ์ƒํƒœ๊ฐ€ ๋ณ€ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งŒ์•ฝ ์ด๊ฒŒ count๋ผ๊ณ  ํ–ˆ์„ ๋•Œ count ๊ฐ’์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉด ์ด๊ฑธ ๋ณด๊ณ ์žˆ๋˜ ์ปดํฌ์ €๋ธ”์€ ๋ฆฌ์ปดํฌ์ง€์…˜๋œ๋‹ค.

stateDiagram-v2
 [*] --> ์ƒํƒœ๋ณ€ํ™”: ์ƒํƒœ_๋ณ€๊ฒฝ_๊ฐ์ง€
์ƒํƒœ๋ณ€ํ™” --> ๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ

๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ --> ๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”ํ•˜๋ฉด: Yes
๋ฆฌ์ปดํฌ์ง€์…˜_ํ•„์š”_์—ฌ๋ถ€_ํŒ๋‹จ --> ๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”์—†์Œ: No

๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”ํ•˜๋ฉด --> ์žฌ๊ตฌ์„ฑ๋œ_Composable๋“ค: ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€_์„ ํƒ์ ์œผ๋กœ_์žฌ๊ตฌ์„ฑ
๋ฆฌ์ปดํฌ์ง€์…˜์ด_ํ•„์š”์—†์Œ --> [*]

์žฌ๊ตฌ์„ฑ๋œ_Composable๋“ค --> UI_๋‹ค์‹œ_๊ทธ๋ฆผ: ๋‹ค์‹œ_๋ Œ๋”๋งํ•œ๋‹ค

UI_๋‹ค์‹œ_๊ทธ๋ฆผ --> [*]

 

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

  • ์ƒํƒœ ๋ณ€ํ™”๋Š” UI ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋ฉฐ, Compose์—์„œ ์ž๋™ ๊ฐ์ง€
  • ๋ฆฌ์ปดํฌ์ง€์…˜์€ ์‹ค์ œ๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋œ Composable์„ ์žฌํ˜ธ์ถœํ•˜์—ฌ UI๋ฅผ ๊ฐฑ์‹ 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT
 
02
09

 

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

 

BFS๋กœ ์ฒ˜์Œ์— ์ ‘๊ทผํ–ˆ์œผ๋‚˜, W, H, T๊ฐ€ ์ตœ๋Œ€ 10^6์ธ๊ฑธ ํ™•์ธํ•˜๊ณ  ์™„์ „ํƒ์ƒ‰์ด ์•„๋‹Œ ๊ฑธ ์•Œ์•˜๋‹ค... 


ํ‘ธ๋Š” ๋™์•ˆ ์‚ฌ๊ณ ๊ณผ์ •

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static long w, h, k, t;
    static int[] di = {-1, -1, 0, 1, 1, 1, 0, -1};
    static int[] dj = {0, 1, 1, 1, 0, -1, -1, -1};
    static long mod = 998244353;
    static long ans;

    public static void main(String[] args) throws IOException {
        // System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        w = Long.parseLong(st.nextToken());
        h = Long.parseLong(st.nextToken());
        k = Long.parseLong(st.nextToken());
        t = Long.parseLong(st.nextToken());

        ans = 1;
        for (int i = 1; i <= k; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            // i๋ฒˆ์งธ ๋ฐ”์ด๋Ÿฌ์Šค ์œ„์น˜
            long x = Long.parseLong(st.nextToken());
            long y = Long.parseLong(st.nextToken());
            go(x, y);
        }

        System.out.println(ans);
    }

    public static void go(long x, long y) {
        long wCase = Math.min(w, x + t) - Math.max(1, x - t) + 1;
        long hCase = Math.min(h, y + t) - Math.max(1, y - t) + 1;

        ans = (ans * wCase) % mod;
        ans = (ans * hCase) % mod;
    }
}

๋ง์ด ์ข€ ์–ด๋ ต๋‹ค.

๋Œ€๊ฐ์„ ๋„ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, t์ดˆ์ผ ๋•Œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๋Š” ์ •์‚ฌ๊ฐํ˜•์ด ๋œ๋‹ค. ๋˜ํ•œ ๊ฐ ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋…๋ฆฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋ฐ”์ด๋Ÿฌ์Šค์˜ ์ด๋™ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‹ค ๊ฐ๊ฐ ๊ณฑํ•ด๋ฒ„๋ฆฌ๋ฉด ๋œ๋‹ค.

 

์ด๋™ ๋ฒ”์œ„๊ฐ€ ๊ณง ์ด๋™ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋˜๋ฏ€๋กœ, ๊ฐ€๋กœ์™€ ์„ธ๋กœ ์ด๋™๋ฒ”์œ„๋ฅผ ์‚ฌ๊ฐํ˜• ํ˜•ํƒœ๋กœ ๊ณฑํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

๊ฐ€๋กœ ์ด๋™๋ฒ”์œ„๋Š” `[max(1,xT),min(W,x+T)]`(์™ผ์ชฝ๋์—์„œ ์˜ค๋ฅธ์ชฝ ๋๊นŒ์ง€) ์„ธ๋กœ ์ด๋™๋ฒ”์œ„๋Š” `[max(1,yT),min(H,y+T)]` (๋งจ ์œ„์—์„œ ๋งจ ์•„๋ž˜๊นŒ์ง€) ๋‹ค.

 

์ด ๋‘ ์ด๋™๋ฒ”์œ„๋ฅผ ๊ณฑํ•˜๋ฉด ํ•ด๋‹น ๋ฐ”์ด๋Ÿฌ์Šค๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ์ฐจ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ์ฝ์—ˆ์„ ๋•Œ ๋ถ„ํฌ์˜ ๊ฐœ๋…์ด ์ด๊ฑฐ๋ผ๋Š” ๊ฒŒ ๋ฐ”๋กœ ์ดํ•ด๊ฐ€ ๋˜์ง€์•Š์•„ ๋” ์–ด๋ ค์› ๋‹ค.

 

max, min์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” W, H๋ฅผ ๋„˜์–ด๊ฐ€์ง€ ์•Š๋„๋ก ํ•ด์•ผ๋˜๋‹ˆ๊นŒ ์œ ํšจ์„ฑ ์ฒดํฌ ๊ฐœ๋…์œผ๋กœ ๋„ฃ์–ด๋’€๋‹ค.

 

ans์—๋Š” ๋ˆ„์ ๊ณฑ์„ ํ•ด์•ผ๋˜๋Š”๋ฐ, ๋ฌธ์ œ์—์„œ mod ๊ฐ’์„ ์คฌ๊ธฐ ๋•Œ๋ฌธ์— ๋งค๋ฒˆ ๊ณฑํ•  ๋•Œ๋งˆ๋‹ค mod๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

์ด๊ฒŒ ์กฐํ•ฉ์ธ ๊ฑธ ๋– ์˜ฌ๋ฆฌ์ง€ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์•„์˜ˆ ๋ชปํ’€์—ˆ์„ ๊ฒƒ ๊ฐ™๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT
 
01
08

โ–ถ ์œ ํ˜•

  • ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ(Manhattan Distance)๋Š” ๋„์‹œ ๋ธ”๋ก์„ ๋”ฐ๋ผ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ˆ˜ํ•™์—์„œ์˜ ๊ฑฐ๋ฆฌ ๊ณต์‹์ด๋ž‘์€ ๋‹ค๋ฅธ๋ฐ, |x1 - x2| + |y1 - y2| ๋กœ ๋‘ ์  ์‚ฌ์ด์˜ x์ขŒํ‘œ ์ฐจ์ด์˜ ์ ˆ๋Œ“๊ฐ’๊ณผ y์ขŒํ‘œ ์ฐจ์ด์˜ ์ ˆ๋Œ“๊ฐ’์˜ ํ•ฉ์„ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.
  • ์ฆ‰ ๊ฒฉ์žํ˜• ๊ตฌ์กฐ์—์„œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉด ๋˜๋Š” ๊ฑฐ๋‹ˆ๊นŒ ์ขŒํ‘œํ‰๋ฉด์ด๋‚˜ ๋Œ€๊ฐ์„ ์„ ๊ณ ๋ คํ•˜์ง€์•Š๋Š” ์ƒํ™ฉ์—์„œ ์œ ์šฉํ•œ ์ˆ˜์‹์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.
  • ๊ทผ๋ฐ ์ด๊ฑธ ์—ฌ๋Ÿฌ ์ ๋“ค ์‚ฌ์ด์—์„œ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ์ตœ์†Œ ํ•ฉ์„ ๊ตฌํ•˜๋ ค๋ฉด ์ค‘์•™๊ฐ’์„ ์„ ํƒํ•˜๋ฉด ๋œ๋‹ค.

โ–ถ ์ „๋žต

1์ฐจ์›, 2์ฐจ์›์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณด๊ฒ ๋‹ค.

 

1์ฐจ์›์—์„œ ์—ฌ๋Ÿฌ ์ ๋“ค๋กœ๋ถ€ํ„ฐ์˜ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์ง€์ ์ด ์ค‘์•™๊ฐ’์ธ ์ด์œ ๋ฅผ ์•Œ์•„๋ณด์ž.

์ˆ˜ํ‰์„ ์— n๊ฐœ์˜ ์  xโ‚, xโ‚‚, ..., xโ‚™์ด ์žˆ์„ ๋•Œ, ๊ฑฐ๋ฆฌ ํ•ฉ์„ ์ƒ๊ฐํ•ด๋ณธ๋‹ค๋ฉด 

  • p๊ฐ€ ์–ด๋–ค ์  xแตข๋ณด๋‹ค ์ž‘์œผ๋ฉด: -1 ๊ธฐ์—ฌ
  • p๊ฐ€ ์–ด๋–ค ์  xแตข๋ณด๋‹ค ํฌ๋ฉด: +1 ๊ธฐ์—ฌ

๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฒฐ๊ตญ ์ตœ์ ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์ค€ ์ ์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์€ ์ ๋“ค์˜ ๊ฐœ์ˆ˜, ํฐ ์ ๋“ค์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ™์€ ์ง€์ ์— ๋†”์•ผํ•˜๋Š”๋ฐ, ์ด ๋ง์€ ๊ณง ์ค‘์•™๊ฐ’์ด๋ผ๋Š” ์–˜๊ธฐ๊ฐ€๋œ๋‹ค.

 

๋‹ค์‹œ ๋งํ•˜์ž๋ฉด, ์ˆ˜ํ‰์„ ์—์„œ

์ค‘์•™๊ฐ’์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•  ๊ฒฝ์šฐ ์™ผ์ชฝ ์ ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” ์ค„์ง€๋งŒ, ์˜ค๋ฅธ์ชฝ ์ ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์ด ์ฆ๊ฐ€ํ•˜๊ณ 
์ค‘์•™๊ฐ’์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™: ์˜ค๋ฅธ์ชฝ ์ ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ๋Š” ์ค„์ง€๋งŒ, ์™ผ์ชฝ ์ ๋“ค๊ณผ์˜ ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ๋งŽ์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ ์ค‘์•™๊ฐ’์ด ์ด ๋•Œ ์ตœ์ ์ ์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค!

 

๊ทธ๋Ÿผ 2์ฐจ์›์œผ๋กœ ๊ฐ€๋ณด์ž

2์ฐจ์›์€ ์ˆ˜ํ‰์„ ์ด ๋‹จ์ˆœํžˆ 2๊ฐœ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๊ณง x์ถ•๊ณผ y์ถ•์ด ๋…๋ฆฝ์ ์œผ๋กœ ์กด์žฌํ•˜๊ณ , ๊ฐ๊ฐ์˜ ์ถ•์„ ๊ธฐ์ค€์œผ๋กœ 1์ฐจ์› ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ์ตœ์ ์  ์ฐพ๋“ฏ ํ•˜๋ฉด ๋œ๋‹ค.

 

์ฆ‰ x์ขŒํ‘œ์˜ ์ค‘์•™๊ฐ’๊ณผ y์ขŒํ‘œ์˜ ์ค‘์•™๊ฐ’์ด ๋งŒ๋‚˜๋Š” ์ ์ด ์ „์ฒด ์ตœ์ ํ•ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

๋ฐ”๋กœ ๋ฌธ์ œ ํ’€์–ด๋ณด์ž.

 

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

1์ฐจ์› ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ ํ•ฉ ์ตœ์ ์ ์„ ์ฐพ๋Š” ๋ฌธ์ œ๋‹ค.

 

๋‚œ ์ฒ˜์Œ์— ์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ–ˆ๋‹ค๊ฐ€ ๋ฐ”๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚ฌ๋‹ค.

public static void go() {
    int[] target = new int[n];
    for (int i = 0; i < n; i++) {
        target[i] = point[i];
    }
    Arrays.sort(target);
    int min = Integer.MAX_VALUE;
    int minT = Integer.MAX_VALUE;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            int center = (target[j] + point[i]) / 2;
            int dist = 0;
            for (int k = 0; k < n; k++) {
                int d = Math.abs(point[k] - center);
                dist += d;
            }
            if (min > dist) {
                min = dist;
                minT = center;
            }
            // System.out.println("dist: " + dist + " minT: " + minT + " center: " + center);
            // System.out.println();
        }
    }
}

์ง„์งœ ์™„์ „ํƒ์ƒ‰ ๋ฐฉ์‹์œผ๋กœ ํ‘ผ๊ฑด๋ฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณด๋‹ค์‹œํ”ผ O(n^3)์ด๋‹ค.

n์ด 20๋งŒ์ด๋ผ ์ ˆ๋Œ€ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

 

์ˆ˜ํ‰์„  ์ตœ์ ์ ์„ ์ƒ๊ฐํ•˜๋ฉฐ ๋‹ค์‹œ ํ’€๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ์งง์€ ํ’€์ด๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

public static void go() {
    Arrays.sort(point);
    System.out.println(point[(n - 1) / 2]);
}

 

์ด๊ฑธ 2์ฐจ์›์œผ๋กœ ๋“ค๊ณ  ๊ฐ€๋ฉด ์•„๋ž˜ ๋ฌธ์ œ๊ฐ€ ๋œ๋‹ค.

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

์ฒ˜์Œ์— ์ค‘์•™๊ฐ’์ด ํ•ญ์ƒ ์ตœ์ ์ธ ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ณ , ์ฃผ์–ด์ง„ ์ ์„ ํ™œ์šฉํ•ด์„œ ๊ฑฐ๋ฆฌํ•ฉ์„ ๊ตฌํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ์˜ˆ์‹œ์—์„œ 0 2 4 6์ด ๋‚˜์˜ค๋ฉฐ ํ‹€๋ฆฐ ๋‹ต๋งŒ ๋‚ด๋†“๋Š”๋‹ค.

 

๊ทธ๋ž˜์„œ x ์ถ•, y ์ถ•์„ ๋ถ„๋ฆฌํ•ด ๊ฐ ์ขŒํ‘œ๋ฅผ ๋–ผ์–ด๋‚ด์–ด ์กฐํ•ฉํ•ด์•ผ๋œ๋‹ค.

์ฒ˜์Œ ์ž‘์„ฑํ•  ๋•Œ ์ค‘์•™๊ฐ’ ๋น„๊ต๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ•ด์„œ ๊ณ„์† ํ‹€๋ ธ๋‹ค.

public static void go() {
    for (int k = 1; k <= n; k++) {
        // k์ผ๋•Œ ์ตœ์†Œ๊ฑฐ๋ฆฌํ•ฉ
        int res = Integer.MAX_VALUE;

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                int centerX = checker[i][0]; // ์› ๋Œ€์ƒ์˜ X
                int centerY = checker[j][1]; // ๋น„๊ต ๋Œ€์ƒ์˜ Y

                int[] dist = new int[n];
                for (int p = 0; p < n; p++) {
                    dist[p] = Math.abs(checker[p][0] - centerX) + Math.abs(checker[p][1] - centerY);
                }
//                    System.out.println(Arrays.toString(dist));
                Arrays.sort(dist);

                int sum = 0;
                for (int d = 0; d < k; d++) {
                    sum += dist[d];
                }

                res = Math.min(res, sum);
            }
        }
        sb.append(res).append(" ");
    }
}

์›๋Œ€์ƒ์˜ X์ขŒํ‘œ, ๋น„๊ต ๋Œ€์ƒ์˜ Y์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„œ ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋ฉฐ k ๋งŒํผ์˜ ํ•ฉ์„ ๊ณ„์† ๋งŒ๋“ค์–ด๊ฐ€๋ฉด ๋˜๋Š” ๋ฌธ์ œ๋‹ค. ๋‚˜๋Š” ๋‚œ์ด๋„๋ฅผ ๋ชจ๋‘ ๊ฐ€๋ฆฌ๊ณ  ํ’€๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒŒ ํ”Œ๋ ˆ๋ผ๋Š” ๊ฑธ ์•Œ๊ณ  ์ข€ ๋†€๋ž๋‹ค.

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!

 

๋ฐ˜์‘ํ˜•
COMMENT
 
01
07

โ–ถ ์œ ํ˜•

  • ๋ชจ๋…ธํ†ค ์Šคํƒ์€ ์Šคํƒ์˜ ์š”์†Œ๋“ค์ด ํ•ญ์ƒ ๋‹จ์กฐ ์ฆ๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๋‹จ์กฐ ๊ฐ์†Œํ•˜๋„๋ก ์œ ์ง€๋˜๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์กฐ ์Šคํƒ์ด๋ผ๊ณ ๋„ ํ•œ๋‹ค.
  • ๋ชจ๋…ธํ†ค ์Šคํƒ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํŠน์ •ํ•œ ํŒจํ„ด์„ ๊ฐ€์ง„ ๋‹ค์Œ/์ด์ „ ์›์†Œ๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ์„ ํ˜• ์‹œ๊ฐ„์— ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ธ๋ฐ, ๊ฐ ์›์†Œ๋Š” ์ตœ๋Œ€ ํ•œ ๋ฒˆ์”ฉ๋งŒ ์Šคํƒ์— ๋“ค์–ด๊ฐ€๊ณ  ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— O(n^2)์ด ๋  ์ฝ”๋“œ๊ฐ€ O(n)์œผ๋กœ ์œ ์ง€๋œ๋‹ค., ์ด๊ฒŒ ์—„์ฒญ ํฐ ์žฅ์ ์ด๋‹ค.
  • ๋ฐฐ์—ด์—์„œ ๊ฐ ์›์†Œ์˜ ๋‹ค์Œ์œผ๋กœ ํฐ ์ˆ˜ ์ฐพ๊ธฐ, ํžˆ์Šคํ† ๊ทธ๋žจ์—์„œ ๊ฐ€์žฅ ํฐ ์ง์‚ฌ๊ฐํ˜• ๋„“์ด ๊ตฌํ•˜๊ธฐ, ์˜จ๋„๊ฐ€ ๋” ๋†’์•„์ง€๋Š” ๋‚ ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ์ผ์ˆ˜ ๊ณ„์‚ฐํ•˜๊ธฐ ๊ฐ™์€ ์œ ํ˜•์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
flowchart TD
    Start([์‹œ์ž‘]) --> Init[์Šคํƒ ์ดˆ๊ธฐํ™”]
    Init --> InputCheck{์ƒˆ๋กœ์šด ์›์†Œ๊ฐ€<br>์žˆ๋Š”๊ฐ€?}
    
    InputCheck -->|Yes| StackEmpty{์Šคํƒ์ด<br>๋น„์–ด์žˆ๋Š”๊ฐ€?}
    InputCheck -->|No| End([์ข…๋ฃŒ])
    
    StackEmpty -->|Yes| PushElement[์Šคํƒ์— ์›์†Œ ์ถ”๊ฐ€]
    StackEmpty -->|No| CompareTop{์Šคํƒ top๊ณผ ๋น„๊ต}
    
    CompareTop -->|์กฐ๊ฑด ์œ„๋ฐฐ| PopElement[์Šคํƒ์—์„œ<br>top ์›์†Œ ์ œ๊ฑฐ]
    CompareTop -->|์กฐ๊ฑด ๋งŒ์กฑ| PushElement
    
    PopElement --> ProcessPopped[์ œ๊ฑฐ๋œ ์›์†Œ๋กœ<br>๊ฒฐ๊ณผ๊ฐ’ ๊ณ„์‚ฐ]
    ProcessPopped --> CompareTop
    
    PushElement --> InputCheck

โ–ถ ์ „๋žต

์˜ค๋ฆ„์ฐจ์ˆœ์ด๋ฉด ๋“ค์–ด๊ฐ€๋ ค๋Š” ์ˆ˜๊ฐ€ top ๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ pop์„ ๋ฐ˜๋ณตํ•˜๊ณ  ๋‚ด๋ฆผ์ฐจ์ˆœ์ด๋ฉด ๋“ค์–ด๊ฐ€๋ ค๋Š” ์ˆ˜๊ฐ€ top ๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฝ์šฐ pop์„ ๋ฐ˜๋ณตํ•˜๋ฉด ๊ตฌํ˜„๋œ๋‹ค.

[2, 1, 4, 3, 5]๋ฅผ ์˜ˆ๋กœ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

๋จผ์ € 2๊ฐ€ ๋“ค์–ด์˜จ๋‹ค. ๊ทธ ๋‹ค์Œ 1์ด ๋“ค์–ด์˜ค๋Š”๋ฐ, 1์€ 2๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 2๋ฅผ popํ•˜๊ณ  1์„ pushํ•œ๋‹ค. push ์ „์— top๊ณผ ๋น„๊ตํ•˜๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.

 

4๋Š” 1๋ณด๋‹ค ํฌ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ pushํ•˜๊ณ , 3์ด ๋“ค์–ด์™€์•ผ๋˜๋Š”๋ฐ 3์€ 4๋ณด๋‹ค ์ž‘์œผ๋‹ˆ๊นŒ 4์„ pop ํ•˜๊ณ  3์„ pushํ•œ๋‹ค. ์ด๋Ÿฐ์‹์œผ๋กœ ์ง„ํ–‰์ด ๋˜๋Š”๋ฐ, ๋งŒ์•ฝ ์ž…๋ ฅ ๋ฐฐ์—ด์ด [2, 3, 5, 1] ์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 

5๊นŒ์ง€ ๋‹ด์•˜์„ ๋•Œ 1๊ณผ ๋น„๊ตํ•˜๋ฉด 5๊ฐ€ pop๋˜์•ผํ•œ๋‹ค. ์—ฌ์ „ํžˆ top์ด 1๋ณด๋‹ค ํฌ๋ฏ€๋กœ 3๋„ pop, 2๋„ popํ•˜๋ฉด ์Šคํƒ์ด ๋นˆ ์ƒํƒœ๋กœ 1์ด push ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ ์Šคํƒ์— ์–ด๋–ค ๊ฐ’์„ ๋„ฃ๊ธฐ ์ „์— k ์ด์ƒ์˜ ์ˆ˜๋ฅผ ๋ชจ๋‘ ์ œ๊ฑฐํ•˜๊ณ  k๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค.

 

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

์–˜๋ฅผ ํ•œ๋ฒˆ ํ’€์–ด๋ณด์ž.

for (int i = 1; i <= n; i++) {
    // ํ˜„์žฌ ๋ง‰๋Œ€(arr[i])๋ณด๋‹ค ํฐ ๋†’์ด์˜ ๋ง‰๋Œ€๋“ค์„ ์ฒ˜๋ฆฌ
    while (!st1.isEmpty()) {
        if (st1.peek() > arr[i]) {
            long nowVal = st1.pop();     // ํ˜„์žฌ ์ฒ˜๋ฆฌํ•  ๋†’์ด
            st2.pop();                   // ํ•ด๋‹น ๋†’์ด์˜ ์œ„์น˜๋„ ํ•จ๊ป˜ ์ œ๊ฑฐ
  
            // ์ง์‚ฌ๊ฐํ˜•์˜ ์™ผ์ชฝ ๊ฒฝ๊ณ„ ์ฐพ๊ธฐ
            int leftIdx = -1;
            if (st2.isEmpty())
                leftIdx = 1;             // ์Šคํƒ์ด ๋น„์—ˆ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ
            else
                leftIdx = st2.peek() + 1; // ์ด์ „ ๋ง‰๋Œ€ ๋‹ค์Œ ์œ„์น˜๋ถ€ํ„ฐ
            
            // ์ง์‚ฌ๊ฐํ˜•์˜ ์˜ค๋ฅธ์ชฝ ๊ฒฝ๊ณ„๋Š” ํ˜„์žฌ ์œ„์น˜ ์ง์ „๊นŒ์ง€
            int rightIdx = i - 1;
            
            // ๋„“์ด ๊ณ„์‚ฐ
            long width = rightIdx - leftIdx + 1;
            long area = width * nowVal;
            
            max = Math.max(max, area);
        } else {
            break;  // ํ˜„์žฌ ๋ง‰๋Œ€๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๋†’์ด๋ฅผ ๋งŒ๋‚˜๋ฉด ์ค‘๋‹จ
        }
    }
    
    // ํ˜„์žฌ ๋ง‰๋Œ€์˜ ์ •๋ณด๋ฅผ ์Šคํƒ์— ์ถ”๊ฐ€
    st1.push(arr[i]);
    st2.push(i);
}

๋ฉ”์ธ ๋กœ์ง์ด๋‹ค.

์ž…๋ ฅ ๊ฐ’๊ณผ top์„ ๋น„๊ตํ•˜๋Š”๋ฐ, top์ด ๋” ํฌ๋ฉด popํ•˜๊ณ , idx๋ฅผ ๋“ค๊ณ ์žˆ๋˜ ์Šคํƒ๋„ popํ•œ๋‹ค.(๋™๊ธฐํ™”)

์ง€๊ธˆ ์Šคํƒ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์ด ์ง์‚ฌ๊ฐํ˜•์˜ ๋†’์ด๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ์ธ๋ฑ์Šค์˜ ์ฐจ์ด๋งŒํผ์ด ๋„ˆ๋น„๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ pop๋˜๋Š” ์‹œ์ ์˜ ๋ฐ”๋กœ ์ด์ „ ์ธ๋ฑ์Šค๊ฐ€ top์ด ์œ ์ง€๋˜๊ณ ์žˆ๋Š” ์ธ๋ฑ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๊ฑธ ๋„ˆ๋น„๋กœ ๊ณ„์‚ฐํ•˜๋ฉด ๋๋‚œ๋‹ค. ๋ฌผ๋ก  ์ด ์ž‘์—… ํ›„์—, ์•„์ง ์Šคํƒ์ด ๋น„์–ด์žˆ์ง€ ์•Š์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ์„ ๋น„์›Œ์ฃผ๋Š” ์ž‘์—…๋„ ํ•„์ˆ˜๋‹ค. ๊ทผ๋ฐ ์ด๋ฏธ ํƒ์ƒ‰์„ ๋ชจ๋‘ ํ•œ ์‹œ์ ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์˜ค๋ฅธ์ชฝ ๋์„ n์œผ๋กœ ์žก๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.

// ๋‚จ์€ ์Šคํƒ ์ •๋ฆฌ
while (!st1.isEmpty()) {
    Long nowVal = st1.pop();
    st2.pop();
    int rightIdx = n; // ์˜ค๋ฅธ์ชฝ ๋
    int leftIdx = -1;
    if (st2.isEmpty()) {
        leftIdx = 1;
    } else {
        leftIdx = st2.peek() + 1;
    }
    long width = rightIdx - leftIdx + 1;
    long area = width * nowVal;
    max = Math.max(max, area);
}

 

์ด ๋ฌธ์ œ๋Š” ๋‹จ์กฐ ์ฆ๊ฐ€๋กœ ํ•ด๊ฒฐํ–ˆ์ง€๋งŒ, ์–ด๋–ป๊ฒŒ ๋ฌธ์ œ์—์„œ ๋‹จ์กฐ ์ฆ๊ฐ€, ๊ฐ์†Œ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

๋‹จ์กฐ์ฆ๊ฐ€์™€ ๋‹จ์กฐ๊ฐ์†Œ๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ํ•ต์‹ฌ์€ "์š”๊ตฌ์‚ฌํ•ญ"์— ๋‹ฌ๋ ค์žˆ๋‹ค.
๋จผ์ € ๊ฒฐ๊ณผ๊ฐ’์˜ ์กฐ๊ฑด์„ ํŒŒ์•…ํ•ด์•ผํ•œ๋‹ค. ์ฐพ๋Š” ๊ฐ’์ด "๋” ํฐ ์ˆ˜"์ธ์ง€ "๋” ์ž‘์€ ์ˆ˜" ์ธ์ง€ ๊ตฌ๋ถ„ํ•ด์•ผ๋œ๋‹ค.

  • "๋” ํฐ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ → ๋‹จ์กฐ๊ฐ์†Œ ์Šคํƒ ์œ ์ง€
  • "๋” ์ž‘์€ ์ˆ˜"๋ฅผ ์ฐพ๋Š” ๊ฒฝ์šฐ → ๋‹จ์กฐ์ฆ๊ฐ€ ์Šคํƒ ์œ ์ง€

์ด๋ ‡๊ฒŒ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋Š”๋ฐ,

https://www.acmicpc.net/problem/2493 
ํƒ‘ ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด, ์ด์ „ ์Šคํƒ์— ๋” ํฐ ์ˆ˜๊ฐ€ ์ˆ˜์‹  ๊ธฐ๋‘ฅ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๋‹จ์กฐ๊ฐ์†Œ ์Šคํƒ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main {
    public static int[] input;
    public static ArrayDeque<Integer> stack;
    public static ArrayDeque<Integer> idx; // idx
    public static int n;
    public static int[] res;

    public static void main(String[] args) throws Exception {
        // System.setIn(new FileInputStream("res/input.txt"));
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());
        input = new int[n + 1];
        res = new int[n + 1]; // idx ๋ฒˆ ๊ธฐ๋‘ฅ์ด ์ˆ˜์‹ ํ–ˆ์Œ์„ ๊ธฐ๋กํ•˜๋ ค๊ณ 
        // idx ๊ณ„์‚ฐ 1๋ถ€ํ„ฐ
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        for (int i = 1; i <= n; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }
        // ์ž…๋ ฅ ๋
        stack = new ArrayDeque<>();
        idx = new ArrayDeque<>();
        go();
        for (int i=1; i<=n; i++){
            sb.append(res[i]).append(" ");
        }
        System.out.println(sb);
    }

    public static void go() {
        for (int i = 1; i <= n; i++) {
            // ๋‹จ์กฐ ๊ฐ์†Œ ์Šคํƒ์œผ๋กœ ๊ฐ€๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.
            int now = input[i];
            while (!stack.isEmpty()) {
                if (stack.peek() < now) { // top์ด ๋” ์ž‘์œผ๋ฉด ๋นผ์•ผ๋œ๋‹ค
                    stack.pop();
                    idx.pop();
                } else {
                    // ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ˆ˜์‹ ํ•œ ๊ฒƒ
                    res[i] = idx.peek();
                    break;
                }
            }
            stack.push(now);
            idx.push(i);
        }
    }
}

 

 

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”!
๋ฐ˜์‘ํ˜•
COMMENT