Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

BOJ 14865 - ๊ณก์„  ์ž๋ฅด๊ธฐ [JAVA]
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด/BOJ_๋ฐฑ์ค€

BOJ 14865 - ๊ณก์„  ์ž๋ฅด๊ธฐ [JAVA]

2023. 2. 28. 22:57
 

14865๋ฒˆ: ๊ณก์„  ์ž๋ฅด๊ธฐ

์ปดํ“จํ„ฐ ๊ทธ๋ž˜ํ”ฝ ์บ”๋ฒ„์Šค๋Š” ์ปดํ“จํ„ฐ ํ™”๋ฉด์—์„œ ๊ทธ๋ฆผ์„ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ง์‚ฌ๊ฐํ˜• ์˜์—ญ์„ ๋งํ•œ๋‹ค. ์บ”๋ฒ„์Šค๋Š” 2์ฐจ์› ์ขŒํ‘œ ํ‰๋ฉด์ฒ˜๋Ÿผ ๊ฐ ์ ์˜ ์œ„์น˜๋ฅผ ์ขŒํ‘œ๋กœ ํ‘œ์‹œํ•œ๋‹ค. ์บ”๋ฒ„์Šค์˜ ์ •์ค‘์•™ ์ ์ด ์›์  (0,0)์ด๊ณ ,

www.acmicpc.net

  ํ•ด๋‹น ๋ฌธ์ œ๋Š” ์Šคํƒ(๊ด„ํ˜ธ ๋ฌธ์ œ)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  '์Šคํƒ'์ด๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ๋– ์˜ฌ๋ฆฌ๊ธฐ ์ „๊นŒ์ง€ ์ •๋ง ๋งŽ์€ ์‹œ๋„๋ฅผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ํ•„์ž๋„ ์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•(y์ถ•์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ์Šน ๋˜๋Š” ํ•˜๊ฐ•ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฎ๊ฐœ๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒฝ์šฐ)์„ ์‹œ๋„ํ•ด ๋ณด์•˜๋‹ค. ํ•˜์ง€๋งŒ, ์˜ˆ์™ธ ์ผ€์ด์Šค๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•„์„œ ์Šคํƒ์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์—๋Š” ๋งŽ์€ ์–ด๋ ค์›€์ด ์žˆ์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.

 

  ์šฐ์„  ๊ฐ์„ ๋นจ๋ฆฌ ์žก๊ธฐ ์œ„ํ•˜์—ฌ '๊ณก์„  ์ž๋ฅด๊ธฐ' ๋ฌธ์ œ์™€ ๊ด„ํ˜ธ ๋ฌธ์ œ๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ฐ™์€์ง€ ๊ทธ๋ฆผ์„ ํ†ตํ•ด์„œ ์•Œ์•„๋ณด์ž.

์˜ˆ์‹œ1

  ํ•˜๋‚˜์˜ ๋ด‰์šฐ๋ฆฌ์— ๋Œ€ํ•ด์„œ ์™ผ์ชฝ ๋ถ€๋ถ„์€ ์—ด๋ฆฐ ๊ด„ํ˜ธ๋กœ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์€ ๋‹ซํžŒ ๊ด„ํ˜ธ์ด๋‹ค. (๊ด„ํ˜ธ๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ƒ๊ฐํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๊ณ  ๋„ˆ๋ฌด ์ž์ฑ…ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค๐Ÿ˜…) ๋˜ํ•œ, ์˜ˆ์ƒํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ด‰์šฐ๋ฆฌ๊ฐ€ ๊ฒน์ณ์ ธ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ์‹œ2
์˜ˆ์‹œ3

  ๊ด„ํ˜ธ๋ฅผ ๋‹ค ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด ๋ฌธ์ œ์—์„œ ์š”๊ตฌํ•˜๋Š” 2๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ๊ฐœ์ˆ˜('๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ'์™€ '๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ'์˜ ๊ฐœ์ˆ˜)๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ด‰์šฐ๋ฆฌ์˜ ์™ผ์ชฝ ๋ถ€๋ถ„(์‹œ์ž‘์ )๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„(๋์ )์„ ์–ด๋–ป๊ฒŒ ๊ด„ํ˜ธ๋กœ ๋‚˜ํƒ€๋‚ด๋Š”์ง€๊ฐ€ ์ด ๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ ์–ด๋ ค์šด ๋ถ€๋ถ„์ด์ž ํ•ต์‹ฌ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. 
  ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•˜๋Š” 4๊ฐ€์ง€ ์š”์†Œ์™€ ํ•จ๊ป˜ ๋ฌธ์ œ๋ฅผ ๊ฐ™์ด ํ’€์–ด๋ณด์ž.

 

1. ์‹œ์ž‘์  ์ฐพ๊ธฐ ๐Ÿ”

  ๋ฌธ์ œ์—์„œ์˜ ์ฃผ์–ด์ง„ 2๋ฒˆ ์˜ˆ์ œ ์ผ€์ด์Šค์˜ ๊ผญ์ง“์ ('1 1', '1 -1', '-1 -1', '-1 1')์„ ํ†ตํ•ด์„œ ํ•ญ์ƒ ์™ผ์ชฝ ๋ฐ‘์˜ ๊ผญ์ง“์ ์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

  ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์‹œ์ž‘ ๊ผญ์ง“์ ์„ ์ •ํ•  ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ ๊ฐ€์žฅ ์™ผ์ชฝ ๋ฐ‘์˜ ๊ผญ์ง“์ ์„ ์‹œ์ž‘์ ์œผ๋กœ ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ‘ธ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹๋‹ค. (y์ขŒํ‘œ๊ฐ€ '์–‘์ˆ˜์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ'์™€ '์Œ์ˆ˜์—์„œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒฝ์šฐ'๋ฅผ ๋‚˜๋ˆ„์–ด ์ƒ๊ฐํ•ด ๋ดค์ง€๋งŒ ์˜ˆ์™ธ ์ƒํ™ฉ์ด ๋„ˆ๋ฌด ๋งŽ๋‹ค.) ๊ผญ์ง“์ ์˜ ๊ฐœ์ˆ˜ N์€ 4 ์ด์ƒ 1,000,000 ์ดํ•˜์ด๋ฏ€๋กœ ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์—ด์— ๊ผญ์ง“์ ๋“ค์„ ์ €์žฅํ•˜๋ฉด์„œ ๊ผญ์ง“์ ์˜ ์œ„์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ์ž‘์ธ๋ฑ์Šค(startIdx)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

xCoordinates  = new int[N]; // ๊ผญ์ง“์ ์˜ x์ขŒํ‘œ๋“ค
yCoordinates = new int[N]; // ๊ผญ์ง“์ ์˜ y์ขŒํ‘œ๋“ค

// 1. ์‹œ์ž‘์ (startIdx)(๋งจ ์™ผ์ชฝ ์•„๋ž˜์˜ ์ง€์ )์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํ™œ๋™
int minLeft = Integer.MAX_VALUE;
int minBottom = Integer.MAX_VALUE;
for(int i = 0; i < N; i++) {
    ss = in.readLine().split(" ");
    xCoordinates[i] = Integer.parseInt(ss[0]);
    yCoordinates[i] = Integer.parseInt(ss[1]);

    if(xCoordinates [i] <= minLeft && yCoordinates[i] <= minBottom) {
        minLeft = xCoordinates[i];
        minBottom = yCoordinates[i];
        startIdx = i;
    }
}

 

2. ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๊ณผ ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ) ์ง€์ • ๐ŸŸ

  ํ•œ ๊ฐœ์˜ ๋ด‰์šฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ํ•ด๋‹น ๋ด‰์šฐ๋ฆฌ๋ฅผ ๋ฌด์กฐ๊ฑด ์™„์„ฑํ•ด์•ผ์ง€ ๋‹ค์Œ ๋ด‰์šฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. (๊ทธ๋ฆผ์„ ๊ทธ๋ ค๋ณด๋ฉด ์‰ฝ๊ฒŒ ๊ทธ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.) ์ด ์ ์—์„œ ์ฐฉ์•ˆํ•˜์—ฌ, ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๋์ ์ด ๋  ์ˆ˜ ์žˆ๋Š” ์ขŒํ‘œ๊ฐ€ ๋‚˜์˜ค๋ฉด ์ดํ›„์— ๋‚˜์˜ค๋Š” ๋ด‰์šฐ๋ฆฌ์˜ ๋์  ๋˜๋Š” ์‹œ์ž‘์ ์€ ๋ฌด์กฐ๊ฑด ๊ฐ™์€ ๋ด‰์šฐ๋ฆฌ์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค.
  ๊ทธ๋ž˜์„œ pointCount๋ผ๋Š” ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ pointCount๊ฐ€ 2๊ฐœ๊ฐ€ ๋˜๋Š” ๊ฒฝ์šฐ(๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์ด ๋ชจ๋‘ ๋‚˜์˜จ ๊ฒฝ์šฐ)์— ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๊ณผ ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ํ•˜๋‚˜์˜ ๋ด‰์šฐ๋ฆฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๊ณผ ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์€ ๋‘ ์ง€์ ์˜ x์ขŒํ‘œ์˜ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋ฅผ ์ด์šฉํ•˜์—ฌ, x์ขŒํ‘œ๊ฐ€ ์ž‘์€ ๊ฒฝ์šฐ์—๋Š” ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)์„ ๋ถ€์—ฌํ•˜๊ณ  x์ขŒํ‘œ๊ฐ€ ํฐ ๊ฒฝ์šฐ์—๋Š” ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์„ ๋ถ€์—ฌํ•œ๋‹ค.

// y๋กœ ํ‘œ์‹œ๋œ ํ˜„์žฌ ๊ผญ์ง“์ ์˜ y์ขŒํ‘œ์™€ ny๋กœ ํ‘œ์‹œ๋œ ๋‹ค์Œ ๊ผญ์ง“์ ์˜ y์ขŒํ‘œ์˜ ๋ถ€ํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ์— 
// ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๊ผญ์ง“์ ์ด ๋งŒ๋“ค์–ด์ง„๋‹ค.
if((y > 0 && ny < 0) || (y < 0 && ny > 0)) {
    twoPointsInPeak[pointCount++] = x;
    if(pointCount == 2) { // ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๋ชจ๋‘ ์ฐพ์€ ๊ฒฝ์šฐ
        // 2๊ฐœ์˜ ๋ถ€๋ถ„์—์„œ ์–ด๋А ๋ถ€๋ถ„์ด ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๋˜๋Š” ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์ธ์ง€๋Š” x์ขŒํ‘œ์˜ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œ์‹œ
        int xCoordinateAtOpenPoint = Math.min(twoPointsInPeak[0], twoPointsInPeak[1]);
        int xCoordinateAtClosePoint = Math.max(twoPointsInPeak[0], twoPointsInPeak[1]);
        points.add(new Point(xCoordinateAtOpenPoint, true));
        points.add(new Point(xCoordinateAtClosePoint, false));
        pointCount = 0;
    }
}

 

3. ๋ด‰์šฐ๋ฆฌ๋“ค์˜ ์ขŒํ‘œ ์ •๋ ฌ ๐ŸŒญ

  ๋ด‰์šฐ๋ฆฌ๋“ค์€ x์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌด์ž‘์œ„๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋ชจ๋“  ๋ด‰์šฐ๋ฆฌ๋“ค์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๋ชจ๋‘ ์ €์žฅํ•œ ํ›„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ ์ขŒํ‘œ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” Point ํด๋ž˜์Šค์— Comparable์„ ์„ค์ •ํ•ด ์ฃผ๊ณ  Collections.sort()๋ฅผ ์ด์šฉํ•˜์˜€๋‹ค.

// ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๋์ ์„ ํ‘œ์‹œ
static class Point implements Comparable<Point> {
    // x์ขŒํ‘œ
    int x;
    // ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ ์ธ ๊ฒฝ์šฐ(์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ) -> true
    // ๋ด‰์šฐ๋ฆฌ์˜ ๋์ ์ธ ๊ฒฝ์šฐ(๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ) -> false
    boolean isOpenParenthesis;

    public Point(int x, boolean isOpenParenthesis) {
        super();
        this.x = x;
        this.isOpenParenthesis = isOpenParenthesis;
    }

    @Override
    public int compareTo(Point o) {
        return Integer.compare(x, o.x);
    }
}

// 3. ๋ด‰์šฐ๋ฆฌ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ (๋ด‰์šฐ๋ฆฌ๋Š” x์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ๊ณผ์ •์ด ํ•„์š”ํ•จ)
Collections.sort(points);

 

4. ์Šคํƒ(๊ด„ํ˜ธ ๋ฌธ์ œ)์„ ์ด์šฉํ•œ ์š”๊ตฌ์กฐ๊ฑด 2๊ฐ€์ง€ ์นด์šดํŠธ ๐Ÿ•

  ์ด ๋ถ€๋ถ„์€ ๋งค์šฐ ๊ฐ„๋‹จํ•œ๋‹ค. "๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ"๋Š” stack์ด ๋น„์–ด์žˆ๋Š” ์ƒํ™ฉ์—์„œ ์ƒˆ๋กœ์šด ๋ด‰์šฐ๋ฆฌ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— ์นด์šดํŠธํ•ด ์ฃผ๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  "๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ ๊ฐœ์ˆ˜"๋Š” ์—ด๋ฆฐ ๊ด„ํ˜ธ์™€ ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ๋Š” ๊ฒฝ์šฐ์— ์นด์šดํŠธํ•ด ์ค€๋‹ค.

// 4. ์š”๊ตฌ์กฐ๊ฑด 2๊ฐ€์ง€์˜ ๊ฐœ์ˆ˜ ์นด์šดํŠธ
// (1) ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ (countA) = ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๋ด‰์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ (Stack์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒฝ์šฐ)
// (2) ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ ๊ฐœ์ˆ˜ (countB) = ๋ด‰์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์—ด๋ฆฐ ๊ด„ํ˜ธ ๋‹ค์Œ์— ๋ฐ”๋กœ ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋”ฐ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ) 
Stack<Character> stack = new Stack<>();
for(int i = 0; i < points.size(); i++) {
    if(points.get(i).isOpenParenthesis) { // ์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
        if(stack.isEmpty()) { // (1)์˜ ๊ฒฝ์šฐ
            countA++;
        }
        stack.push('(');

        if(!points.get(i + 1).isOpenParenthesis) { // (2)์˜ ๊ฒฝ์šฐ
            countB++;
        }
    }
    else { // ๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
        stack.pop();
    }
}

 

์ „์ฒด์ฝ”๋“œ ๐Ÿฅž

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

public class Main {

	static StringBuilder sb = new StringBuilder();
	static int N, y, x, ny, nx, countA, countB, pointCount, startIdx, hereIdx, nextIdx;
	static String[] ss;
	static List<Point> points = new ArrayList<>();
	static int[] twoPointsInPeak = new int[2];
	static int[] xCoordinates, yCoordinates;


	// 0. ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๋์ ์„ ํ‘œ์‹œ
	static class Point implements Comparable<Point> {
		int x;
		// ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ ์ธ ๊ฒฝ์šฐ(์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ) -> true
		// ๋ด‰์šฐ๋ฆฌ์˜ ๋์ ์ธ ๊ฒฝ์šฐ(๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ) -> false
		boolean isOpenParenthesis; 

		public Point(int x, boolean isOpenParenthesis) {
			super();
			this.x = x;
			this.isOpenParenthesis = isOpenParenthesis;
		}

		@Override
		public int compareTo(Point o) {
			return Integer.compare(x, o.x);
		}
	}

	public static void main(String[] args) throws Exception {
		
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(in.readLine());
		xCoordinates  = new int[N]; // ๊ผญ์ง“์ ์˜ x์ขŒํ‘œ๋“ค
		yCoordinates = new int[N]; // ๊ผญ์ง“์ ์˜ y์ขŒํ‘œ๋“ค

		// 1. ์‹œ์ž‘์ (startIdx)(๋งจ ์™ผ์ชฝ ์•„๋ž˜์˜ ์ง€์ )์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํ™œ๋™
		int minLeft = Integer.MAX_VALUE;
		int minBottom = Integer.MAX_VALUE;
		for(int i = 0; i < N; i++) {
			ss = in.readLine().split(" ");
			xCoordinates[i] = Integer.parseInt(ss[0]);
			yCoordinates[i] = Integer.parseInt(ss[1]);
			
			if(xCoordinates [i] <= minLeft && yCoordinates[i] <= minBottom) {
				minLeft = xCoordinates[i];
				minBottom = yCoordinates[i];
				startIdx = i;
			}
		}

		// 2. ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๊ณผ ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์„ ์ง€์ •
		hereIdx = startIdx;
		while(true) {
			nextIdx = hereIdx + 1;
			if(nextIdx == N) { 
				nextIdx = 0;
			}
			
			x = xCoordinates [hereIdx];
			y = yCoordinates[hereIdx];
			nx = xCoordinates [nextIdx];
			ny = yCoordinates[nextIdx];
		
			// ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์  ๋˜๋Š” ๋์ ์ด ๋งŒ๋“ค์–ด์ง€๋Š” ์ƒํ™ฉ
			if((y > 0 && ny < 0) || (y < 0 && ny > 0)) {
				twoPointsInPeak[pointCount++] = x;
				if(pointCount == 2) { // ๋ด‰์šฐ๋ฆฌ์˜ ์‹œ์ž‘์ ๊ณผ ๋์ ์„ ๋ชจ๋‘ ์ฐพ์€ ๊ฒฝ์šฐ
					// 2๊ฐœ์˜ ๋ถ€๋ถ„์—์„œ ์–ด๋А ๋ถ€๋ถ„์ด ์‹œ์ž‘์ (์—ด๋ฆฐ ๊ด„ํ˜ธ)๋˜๋Š” ๋์ (๋‹ซํžŒ ๊ด„ํ˜ธ)์ธ์ง€๋Š” x์ขŒํ‘œ์˜ ์ƒ๋Œ€์ ์ธ ์œ„์น˜๋ฅผ ์ด์šฉํ•˜์—ฌ ํ‘œ์‹œ
					int xCoordinateAtOpenPoint = Math.min(twoPointsInPeak[0], twoPointsInPeak[1]);
					int xCoordinateAtClosePoint = Math.max(twoPointsInPeak[0], twoPointsInPeak[1]);
					points.add(new Point(xCoordinateAtOpenPoint, true));
					points.add(new Point(xCoordinateAtClosePoint, false));
					pointCount = 0;
				}
			}

			hereIdx++;
			if(hereIdx == N) {
				hereIdx = 0;
			}
			if(hereIdx == startIdx)
				break;
		}
	
		// 3. ๋ด‰์šฐ๋ฆฌ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ (๋ด‰์šฐ๋ฆฌ๋Š” x์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ๊ณผ์ •์ด ํ•„์š”ํ•จ)
		Collections.sort(points);
		
		// 4. ์š”๊ตฌ์กฐ๊ฑด 2๊ฐ€์ง€์˜ ๊ฐœ์ˆ˜ ์นด์šดํŠธ
		// (1) ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ํฌํ•จ๋˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ (countA) = ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ํฌํ•จ๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ๋ด‰์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒฝ์šฐ (Stack์ด ๋น„์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ ์—ด๋ฆฐ ๊ด„ํ˜ธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๊ฒฝ์šฐ)
		// (2) ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋ด‰์šฐ๋ฆฌ ๊ฐœ์ˆ˜ (countB) = ๋ด‰์šฐ๋ฆฌ๊ฐ€ ๋‹ค๋ฅธ ๋ด‰์šฐ๋ฆฌ์— ์˜ํ•ด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š” ๊ฒฝ์šฐ (์—ด๋ฆฐ ๊ด„ํ˜ธ ๋‹ค์Œ์— ๋ฐ”๋กœ ๋‹ซํžŒ ๊ด„ํ˜ธ๊ฐ€ ๋”ฐ๋ผ์˜ค๋Š” ๊ฒฝ์šฐ) 
		Stack<Character> stack = new Stack<>();
		for(int i = 0; i < points.size(); i++) {
			if(points.get(i).isOpenParenthesis) { // ์—ด๋ฆฐ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
				if(stack.isEmpty()) { // (1)์˜ ๊ฒฝ์šฐ
					countA++;
				}
				stack.push('(');
				
				if(!points.get(i + 1).isOpenParenthesis) { // (2)์˜ ๊ฒฝ์šฐ
					countB++;
				}
			}
			else { // ๋‹ซํžŒ ๊ด„ํ˜ธ์ธ ๊ฒฝ์šฐ
				stack.pop();
			}
		}
		
		System.out.println(countA + " " + countB);
	}
}

 

์ฃผ์˜์  (์‹œ๊ฐ„๋ณต์žก๋„) ๐ŸฅŸ

  ๊ผญ์ง“์ ๋“ค์„ ์ €์žฅํ•˜๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ArrayList๊ฐ€ ์•„๋‹Œ LinkedList๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•˜์ž.

List<Point> points = new ArrayList<>(); // O
List<Point> points = new LinkedList<>(); // X

  ๊ผญ์ง“์ (N)์€ ์ตœ๋Œ€ 1,000,000๊ฐœ ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋•Œ LinkedList๋ฅผ ์ด์šฉํ•ด์„œ ์กฐํšŒํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค. LinkedList์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ผญ์ง“์ (1,000,000๊ฐœ)์„ ์กฐํšŒ(O(1,000,000)) ํ•˜๋ฉด 1,000,000,000,000 => 10,000์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ํ’€๋ฉด N <= 10,000์ธ ์„œ๋ธŒ ํ…Œ์ŠคํŠธ๋งŒ ํ†ต๊ณผํ•˜์—ฌ '100์ '์ด ์•„๋‹Œ '๋ถ€๋ถ„ ์ ์ˆ˜'๋งŒ ๋ฐ›๊ฒŒ ๋œ๋‹ค.

 

'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด > BOJ_๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€ BOJ / JAVA] ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ (2143๋ฒˆ)  (1) 2023.12.29
[๋ฐฑ์ค€ BOJ / JAVA] ๋ฉ€ํ‹ฐ๋ฒ„์Šค โ…ก (18869๋ฒˆ)  (1) 2023.12.27
[๋ฐฑ์ค€ BOJ / JAVA] ๊ด„ํ˜ธ์˜ ๊ฐ’ (2504๋ฒˆ)  (1) 2023.12.26
    '๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด/BOJ_๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [๋ฐฑ์ค€ BOJ / JAVA] ๋‘ ๋ฐฐ์—ด์˜ ํ•ฉ (2143๋ฒˆ)
    • [๋ฐฑ์ค€ BOJ / JAVA] ๋ฉ€ํ‹ฐ๋ฒ„์Šค โ…ก (18869๋ฒˆ)
    • [๋ฐฑ์ค€ BOJ / JAVA] ๊ด„ํ˜ธ์˜ ๊ฐ’ (2504๋ฒˆ)
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”