Skip to content

Conversation

@giljihun
Copy link
Member

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

๋ฐฑ์ค€ - IOIOI

image

์ €๋Š” ๊น€์†Œํ˜œ ์›ํ”ฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

1h

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

ํ‹€๋ฆฐ ์ ‘๊ทผ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-04-30 01 48 06

์ผ๋‹จ ๋จผ์ € ํ‹€๋ฆฐ ์ ‘๊ทผ ๋จผ์ € ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
์œ„์— ์‚ฌ์ง„ ๋ณด๋ฉด ๋ณด์ด์‹œ๊ฒ ์ง€๋งŒ, ์‹œ๊ฐ„ ์ดˆ๊ณผ ์•ผ๋ฌด์ง€๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค !
๊ทผ๋ฐ ๋ญ. ๊ตฌํ˜„์€ ์ผ๋‹จ ๋ฐ•๊ณ  ๋ณด๋Š”๊ฑฐ ์•„๋‹ˆ๊ฒ ์œผ์˜ˆ(์ด๊ฑฐ ๋งž์Šต๋‹ˆ๊บผ ๋ฐ๋ฏธ์•ˆ)

  1. ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” "ํŒจํ„ด"์„ ๋จผ์ € ๋งŒ๋“ ๋‹ค.
    ์˜ˆ๋ฅผ๋“ค์–ด N = 2, pattern = "IOIOI".

  2. ๋ฌธ์ž์—ด ์ธ๋ฑ์Šค ์‹œ์ž‘์ , ๋์ ์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ค๋ฉฐ ๋๊นŒ์ง€ ๋ˆ๋‹ค.
    (๋์ ์ด ์ดˆ๊ณผ๋˜์ง€ ์•Š์„๋•Œ๊นŒ์ง€)

// MARK: - Input
guard let N = Int(readLine() ?? "") else { exit(0) }
guard let M = Int(readLine() ?? "") else { exit(0) }
guard let S = readLine() else { exit(0) }

// MARK: - M ์ธ๋ฑ์Šค๋ฅผ +1 ํ•˜๋ฉด์„œ ์ฒดํ‚น
let patternLength = 2 * N + 1
var result = 0

// ํŒจํ„ด ์ƒ์„ฑ
var pattern = "I"
for _ in 0..<N {
    pattern += "OI"
}

for i in 0...(M - patternLength) {
    let start = S.index(S.startIndex, offsetBy: i)
    let end = S.index(start, offsetBy: patternLength)
    let window = String(S[start..<end])

    if window == pattern {
        result += 1
    }
}

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ !

image

์ด์œ ๋Š” ๋‘๊ฐ€์ง€๋กœ ํ™•์ธ์ด ๋ฉ๋‹ˆ๋‹ค.

  1. ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ์€ ๋งค์šฐ ๋А๋ฆฌ๋‹ค.

Swift์—์„œ ์„œ๋ธŒ์ŠคํŠธ๋ง์„ ์ถ”์ถœํ•  ๋•Œ๋Š” ๋ณต์žกํ•œ ๊ณ„์‚ฐ์ด ๋“ค์–ด๊ฐ„๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฌธ์ž์—ด์„ ์ „๋ถ€ ์ˆœํšŒํ•˜๋ฉฐ ๋น„๊ต

S์˜ ๊ธธ์ด M์€ ๋ฌธ์ œ ์กฐ๊ฑด์ƒ ์ตœ๋Œ€ 1,000,000์ด์ฃ ?
์ด๊ฑธ ๊ธธ์ด 2N + 1 ์งœ๋ฆฌ ๋ฌธ์ž์—ด๊ณผ ๊ณ„์† ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
์‹œ๊ฐ„๋ณต์žก๋„? => O(M x N)

๊ฒฐ๋ก ์ ์œผ๋กœ ํŒจํ„ด ์Šฌ๋ผ์ด์‹ฑ + ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ์‹œ๊ฐ„ ๋ถ๋ถ !


์œ„ ์—๋Ÿฌ๋ฅผ ํ†ตํ•ด ์ฐพ์•„์•ผํ•  ๋ฐฉ๋ฒ•์€?
๋‹น์žฅ ๋ง‰ ๋– ์˜ค๋ฅด์ง„ ์•Š์ž–์•„์š”. ๊ทธ๋ ‡์ง€๋งŒ ํ™•์‹คํ•œ ๊ฒƒ์€ ์žˆ๋‹ค.

"์ตœ๋Œ€ M๋ฒˆ๋งŒ ๋น„๊ตํ•˜๋„๋ก ๋งŒ๋“ค์–ด์•ผํ•œ๋‹ค."

= "ํ•œ ๋ฒˆ์˜ ์Šค์บ”๋งŒ ํ•˜๋„๋ก ๋กœ์ง์„ ๋ฐ”๊ฟ”์•ผํ•œ๋‹ค."


์ •๋‹ต์„ ๊ฐ€์ ธ๋‹ค์ค€ ์ ‘๊ทผ

  1. N์˜ ์ˆซ์ž์— ๋”ฐ๋ผ ํŒจํ„ด์€ ์ •ํ•ด์ง„๋‹ค.
    N: 1-> "IOI",
    N: 2 -> "IOIOI",
    N: 3 -> "IOIOIOI".

๊ฒฐ๊ตญ, "IOI"๊ฐ€ ๋ฐ˜๋ณต๋œ๋‹ค๋Š” ๊ฒƒ.

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, N์ด 2๋ฉด.
IOI ๋‹ค์Œ์— ๋งˆ์ง€๋ง‰ I์— ์ด์–ด์„œ OI๊ฐ€ ์˜ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ!

  1. IOI๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด, ์‹œ์ž‘ ์ธ๋ฑ์Šค์— +2๋กœ ์ ํ”„ํ•˜์ž. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ IOI๋ฅผ ์ฐพ์•„!

์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ IOI๋ฅผ ์ฐพ์„ ๋•Œ๋งˆ๋‹ค, count๋ฅผ ์˜ฌ๋ ค์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
๋งŒ์•ฝ count๊ฐ€ ์ž…๋ ฅ๊ฐ’ N๊ณผ ๋™์ผํ•ด์ง€๋ฉด ์ด๊ฑด ์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ํŒจํ„ด!

  1. ์ฝ”๋“œ๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด๋ณด์ž.
while i < M - 1 {
    // IOI๊ฐ€ ๋“ฑ์žฅ? -> ์นด์šดํŠธ๋ฅผ 1๊ฐœ ์˜ฌ๋ฆผ
    if chars[i - 1] == "I", chars[i] == "O", chars[i + 1] == "I" {
        count += 1
        // ์นด์šดํŠธ๊ฐ€ ๋งŒ์•ฝ N์ด ๋˜์—ˆ๋‹ค? ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” ํŒจํ„ด์ด ๋“ฑ์žฅํ•œ ๊ฒƒ.
        if count == N {
            result += 1
            // ๊ทผ๋ฐ ๋ฐ”๋กœ ๋‹ค์Œ์— ์ค‘๋ณต์ ์œผ๋กœ ํŒจํ„ด์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ, 1์„ ์ค„์ด๊ธฐ.
            count -= 1
        }
        i += 2
    }
    // ๋‹ค์Œ์œผ๋กœ ์ด๋™ํ–ˆ๋”๋‹ˆ IOI๊ฐ€ ์•ˆ๋‚˜์˜ด? -> 0์œผ๋กœ ์ดˆ๊ธฐํ™”.
    // ๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ๋‹ค์‹œ ๋น„๊ต์‹œ์ž‘.
    else {
        count = 0
        i += 1
    }
}

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

1. ๋ฌธ์ž์—ด ํƒ์ƒ‰ ์ตœ์ ํ™”์˜ ์ค‘์š”์„ฑ

  • Swift์—์„œ String์„ ์Šฌ๋ผ์ด์‹ฑํ•˜๋Š” ์—ฐ์‚ฐ (String[start..<end] ์ด๋Ÿฐ๊ฑฐ)์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋งค์šฐ ๋А๋ฆผ.
  • ์ด ๋ฐฉ์‹์„ ์‹ฌ์ง€์–ด ๋ฐ˜๋ณต๋ฌธ์—์„œ ์‚ฌ์šฉ?! -> ๊ฐœ๋А๋ฆผ, ์•ต๊ฐ„ํ•˜๋ฉด ์ฝ”ํ…Œ์—์„œ ์‹œ๊ฐ„์ดˆ๊ณผ ๊ฐ์˜ค.

2. ์บ๋ฆญํ„ฐ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์ธ๋ฑ์Šค ์ ‘๊ทผํ•˜๊ธฐ

// MARK: - Input
guard let N = Int(readLine() ?? "") else { exit(0) }
guard let M = Int(readLine() ?? "") else { exit(0) }
guard let S = readLine() else { exit(0) }

let chars = Array(S)
var result = 0
var count = 0

์ €๋Š” ๋ฌธ์ž์—ด์„ ์บ๋ฆญํ„ฐ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”.
์ด๋Ÿฐ ๋ฌธ์ž์—ด ๋ฌธ์ œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฉํ–ฅ์„ฑ์„ ์ฐพ๊ธฐ ์ข‹์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
(์‚ฌ์‹ค ์ด๊ฒŒ ๋˜๊ฒŒ key์˜€๋˜ ๊ฒƒ ๊ฐ™์•„์š”.)

3. ๋ฌธ์ž์—ด ํƒ์ƒ‰ ๋ฌธ์ œ์—์„œ์˜ ์‹œ๊ฐ„๋ณต์žก๋„

  • ์‹œ๊ฐ„ ์กฐ๊ฑด์„ ๋„ˆ๋ฌด ์ž์„ธํ•˜๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ ๋ณด๋‹ค๋Š”, ๋‚ด๊ฐ€ ์งœ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ตœ๋Œ€ํ•œ ๋ฌธ์ž์—ด์„ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•œ๋‹ค๋ฉด ๋Œ€๋ถ€๋ถ„ ๋‹ค ํ†ต๊ณผ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์‚ฌ์‹ค ๋ง์ด ์‰ฝ์ง€..์ง€๋งŒ์š”..

ํ›„๊ธฐ

์นดํ†ก์ธ๊ฐ€ ์–ด๋”˜๊ฐ€์—์„œ "๋ฌธ์ž์—ด ํƒ์ƒ‰" ํ‘ธ์…จ๋‹ค๊ณ  ๋“ค์–ด์„œ..
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์Šฌ๋ผ์ด์‹ฑ์ด ํŒŒ์ด์ฌํ•˜๊ณ ๋Š” ํ™•์‹คํžˆ ๋‹ฌ๋ž๋˜ ๊ฒƒ ๊ฐ™๊ณ ํ•ด์„œ
๋‹ค์‹œ ์Šฌ๋ผ์ด์‹ฑ์— ๋Œ€ํ•ด ๊ณต๋ถ€๊ฒธ ํ’€์–ด๋ดค๋Š”๋ฐ.

๊ฑ ํ™•์‹คํžˆ Swift์—์„œ ๋ฌธ์ž์—ด ์Šฌ๋ผ์ด์‹ฑ์€ ์“ฐ๋ ˆ๊ธฐ๊ฐ€ ๋งž๋Š”๊ฑธ๋กœ..
(์•„๋‹ˆ๋ฉด ๋ฐ˜๋ฐ•์ข€ ํ•ด์ฃผ์„ธ์š” ์ œ๋ฐœ. ์ €๋„ ์•„๋‹ˆ๋ผ๊ณ  ํ•˜๊ณ ์‹ถ์–ด์š”.)

Comment on lines +4 to +6
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ž…๋ ฅ๋ฐ›๋Š” ๋ถ€๋ถ„ ์ž˜ ํ™œ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.. ๐Ÿ‘

Comment on lines +20 to +23
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด ๋ถ€๋ถ„๋งŒ ์‚ด์ง๋‹ค๋ฅด๋„ค์š”! ์ €๋Š” Array์— ๋‹ด์•„์คฌ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒํ•˜๋ฉด ๋‚˜์ค‘์— filter,map,reduce์“ฐ๋ฉด์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๋А๋ผ ์‹œ๊ฐ„,๋ฉ”๋ชจ๋ฆฌ ๋‹ค ์ข€ ์†ํ•ด๋ณด๋Š” ๋А๋‚Œ์ด์—ˆ๊ฑฐ๋“ ์š”..
๊ธธ์„ ์ƒ๋‹˜์ด ํ‘ธ์‹ ๊ฒŒ ๋” ์ง๊ด€์ ์ด๊ณ  ๋ฉ”๋ชจ๋ฆฌ์—๋„ ํšจ์œจ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค..!

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ใ…‹ใ…‹
์Œ Array์— ๋‹ด์•„์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ๊ฐ€๋…์„ฑ์€ ๋” ์ข‹์„ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”

์ง€๊ธˆ ๊ตฌ์กฐ๊ฐ€ ํŒจํ„ด์„ ์ˆ˜์ง‘ -> ํ›„์ฒ˜๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ์ธ๋ฐ,
์ค‘๊ฐ„ ๋กœ์ง์ด ๋ณต์žกํ•˜๋‹ค๋ฉด ์‚ฌ์‹ค ์ œ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋กœ๋Š” ํ๋ฆ„์„ ๋ถ„๋ฆฌํ•˜๊ณ  ํ…Œ์ŠคํŒ…ํ•˜๊ธฐ์—” ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์†ํ•ด์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ •ํ™•ํ•œ ์บ์น˜๋ฅผ ํ•˜์‹  ๊ฒƒ ๊ฐ™๋„ค์š”!! ๊ตฟ์ž…๋‹ˆ๋‹ค

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•„๋ž˜ ์ฝ”๋“œ๋„ ํ™•์ธํ•ด๋ณด๋‹ˆ ํ›„์ฒ˜๋ฆฌ๋ฅผ ํด๋กœ์ €๋กœ ํ•œ ๋ฒˆ์— ์กฐ์ง€์‹œ๋Š”(?) ๋ถ€๋ถ„์ด ์•ผ๋ฌด์ง€๋„ค์š”..

Copy link
Collaborator

@bishoe01 bishoe01 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import Foundation
func IOIOI(_ time: Int, _ length: Int, _ s: String) {
    let arr = Array(s)
    var cnt = 0
    var cntArr = [Int]()
    var cursor = 0
    while cursor < length - 2 {
//        print(cursor)
        if arr[cursor] == "I", arr[cursor + 1] == "O", arr[cursor + 2] == "I" {
            cnt += 1
            cursor += 2
        } else {
            cntArr.append(cnt)
            cnt = 0
            cursor += 1
        }
    }
    cntArr.append(cnt) // ๋‚จ์€์• 
//    print(cntArr.filter { item in
//        item >= time
//    }.reduce(0, +))  ์ด ๋ถ€๋ถ„ ํ‹€๋ ค์„œ ์ˆ˜์ •ํ–ˆ์Œ, ์—ฐ์†๋œ๊ฑฐ์— ๋งค๋ชฐ๋ผ์„œ, ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ ์—ฐ์†๋œ๊ฑฐ์—์„œ - ๋ฐ˜๋ณต์ˆ˜ + 1 ํ•ด์ค˜์•ผ ์ง„์งœ ์›ํ•˜๋Š” ๊ฐœ์ˆ˜๊ฐ€ ๋‚˜์˜ด ๋”ฑ๋งž์ถฐ์„œ ๋  ์ˆ˜๋Š” ์—†์œผ๋‹ˆ๊นŒ

    print(cntArr.filter { $0 >= time }.map { $0 - time + 1 }.reduce(0, +))
}

์ฒ˜์Œ์—๋Š” String.Index์จ์„œ ๊ณ„์† slicingํ•ด์ฃผ๋ฉด์„œ ์ฐพ์•„์ฃผ๋ คํ–ˆ๋Š”๋ฐ, (์•ฝ๊ฐ„ ์Šฌ๋ผ์ด๋”ฉ์œˆ๋„์šฐ)
์ง„์งœ ์—„์ฒญ๋‚˜๊ฒŒ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋จธ๋ฆฌ๊ฐ€ ์ „ํ˜€ ์•ˆ๋Œ์•„๊ฐ€์„œ ๋ฆฌ์…‹ํ•˜๊ณ  Array๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค์Œ์— ๋ฐฐ์—ด[์ˆซ์ž]๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์คฌ์Šต๋‹ˆ๋‹ค..!

์œ„์— ๋ฆฌ๋ทฐ์—์„œ ๋ง์”€๋“œ๋ฆฐ ์ฐจ์ด์ ์ด๋ผํ•˜๋ฉด
1, var cntArr = [Int]()๋ฅผ ์„ ์–ธํ•ด์ฃผ๊ณ 
2, else ์— ๊ฑธ๋ฆฌ๋ฉด (์—ฐ์†์ด ์•ˆ๋˜๋ฉด) cntArr์— ๋‹ด์•„์ค๋‹ˆ๋‹ค.
3. ๋งˆ์ง€๋ง‰์— print(cntArr.filter { $0 >= time }.map { $0 - time + 1 }.reduce(0, +)) ๋กœ ์ฒ˜๋ฆฌ!

์ฃผ์„์— ์จ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์™œ map์ด ์ƒ๊ฒผ๋ƒํ•˜๋ฉด.. ์ด๊ฒŒ ๊ฒน์น  ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ณด๋‹ˆ, ๋งŒ์•ฝ IOIOIOI ๋ฌธ์ž์—ด์— ์ˆซ์ž๋Š” 2๋ผ๋ฉด, ์ด๊ฒŒ 3๋ฒˆ ๋ฐ˜๋ณต๋œ๋‹ค๊ณ ํ•ด์„œ ๋‹ต์ด 3์ด ๋‚˜์˜ค๊ฒ ์ง€๋งŒ , ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ 3๋ฒˆ๋ฐ˜๋ณต - 2(ํ•„์š”์กฐ๊ฑด) + 1 ๋กœ ๋‹ต์ด 2๊ฐ€ ๋‚˜์™€์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— ์ˆ˜์ •์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค !

Copy link
Collaborator

@MuchanKim MuchanKim left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

image ์ € ๋ฐฑ์ค€ ๋ถ€๋ถ„ ์ ์ˆ˜์žˆ๋Š” ๊ฑฐ ์ฒ˜์Œ์•Œ์•˜์–ด์š” ใ…‹ใ…‹ใ…‹ ๊ธธ์ด ์‹คํŒจํ–ˆ๋˜ ์ฝ”๋“œ๋ž‘ ๋น„์Šทํ•œ ๋กœ์ง์œผ๋กœ ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์™„ํƒ์€ ์—ญ์‹œ ํ„ฐ์ง€๋Š”๊ตฐ์š”.

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋Œ€ํ•ด ์ฒ˜์Œ ์•Œ์•˜๋Š”๋ฐ ํŠน์ • ํŒจํ„ด์ด ํฌํ•จ๋œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ์ฐพ๊ธฐ์— ์šฉ์ดํ•  ๊ฒƒ ๊ฐ™๊ตฐ์š”. DP๋ž‘ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋จธ๋ฆฌ์†์—์„œ ๋Œ๋ ค๋ดค์„ ๋• '์•„ ์ด๋ ‡๊ฒŒ ๋˜๋Š” ๊ฑฐ๊ตฌ๋‚˜'ํ•˜์ง€๋งŒ, ์‹ค์ œ๋กœ ์งœ๋ณด๋ผ๊ณ  ํ•˜๋ฉด ๋ง‰๋ง‰ํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋„ค์š”. ^^

๊ธธ ์ฝ”๋“œ๋ณด๋ฉด ํ•ญ์ƒ ๊น”๋”ํ•œ ๊ฒƒ ๊ฐ™์•„์š”. ํ•œ๋ฒˆ ์ •์ œ๋ฅผ ํ•˜๊ณ  PR์˜ฌ๋ฆฌ์‹œ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ด๊ฒŒ ์•ผ์ƒ์˜ ์ฝ”๋“œ์ธ๊ฐ€์š”?

(์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋กœ๋Š” ์•ˆํ’€์–ด๋ดค์Šต๋‹ˆ๋‹ค.)

50์ ์งœ๋ฆฌ ์ฝ”๋“œ

import Foundation

let N = Int(readLine()!)!
let M = Int(readLine()!)!
let S = Array(readLine()!)

var pattern = Array("IOI" + String(repeating: "OI", count: N-1))
let patternCount = pattern.count

var count = 0

for i in 0...M-patternCount {
    var isMatch = true
    
    for j in 0..<patternCount {
        if S[i+j] != pattern[j] {
            isMatch = false
            break
        }
    }
    
    if isMatch {
        count += 1
    }
}

print(count)

Comment on lines +6 to +8
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

string์œผ๋กœ ๋ฐ›๊ณ  ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋˜ ์“ฐ์‹  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

Copy link
Collaborator

@MuchanKim MuchanKim May 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ณ„๊ฑฐ ์•„๋‹ˆ์ง€๋งŒ ์ด ๋ถ€๋ถ„ ์ €๋Š” ํŠน์ดํ•˜๊ฒŒ ๋А๊ปด์กŒ์–ด์š”! ๋ณดํ†ต ์ผ๋ฐ˜์ ์ธ ์กฐ๊ฑด๋ฌธ์—๋Š” &&์“ฐ์ง€ ์•Š๋‚˜์š”? Swift์—์„œ ์ง€ํ–ฅํ•˜๋Š” ์ปจ๋ฒค์…˜์ธ์ง€??
๋ฌผ๋ก  ๊ฒฐ๊ณผ๋Š” ๊ฐ™์ง€๋งŒ '์ฝค๋งˆ'์™€ '&&'๋ฅผ ์“ฐ๋Š” ๊ธฐ์ค€์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

if chars[i - 1] == "I" && chars[i] == "O" && chars[i + 1] == "I"

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•„์ด๊ณ .. ๋ฌด ์•„๋‹™๋‹ˆ๋‹ค ์นญ์ฐฌ ๋„ˆ๋ฌด ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

1. ํ•œ๋ฒˆ ์ •์ œ๋ฅผ ํ•˜๊ณ  PR์˜ฌ๋ฆฌ์‹œ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ด๊ฒŒ ์•ผ์ƒ์˜ ์ฝ”๋“œ์ธ๊ฐ€์š”?

์ •์ œํ•˜์ง„ ์•Š๊ณ  ๋ฐฑ์ค€์—์„œ ๋ฐ”๋กœ ๊ธ์–ด์„œ ์ฃผ์„๋งŒ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜? ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์• ์ดˆ์— ํ’€ ๋•Œ ์—„์ฒญ ์‹œ๊ฐ„์„ ์žฌ๊ณ  ํ’€์งˆ ์•Š์•„์„œ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์•„์š”! ใ…‹ใ…‹ ์ถ”๊ฐ€์ ์œผ๋กœ๋Š” ์ด ๋ฌธ์ œ๋Š” ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ์‹คํŒจํ• ๋•Œ๋Š” ๋˜๊ฒŒ ๋”๋Ÿฝ๊ฑฐ๋“ ์š”! ๊ทธ๋ƒฅ 100์  ๋ฐ›์€ ํ’€์ด๊ฐ€ ์• ์ดˆ์— ์ฝ”๋“œ์ธต์ด ์–‡์•„์„œ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ ๊ฐ™์Šด๋‹ค!

2. string์œผ๋กœ ๋ฐ›๊ณ  ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ •์—์„œ ๋ณ€์ˆ˜๋ฅผ ๋˜ ์“ฐ์‹  ์ด์œ ๊ฐ€ ์žˆ์„๊นŒ์š”?

์ด ์งˆ๋ฌธ์ด ์ œ๊ฐ€ 2๊ฐ€์ง€ ์˜๋„๋กœ ํ•ด์„์ด ๋˜๊ฐ€์ง€๊ณ , ์•ฝ๊ฐ„ ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋˜์—ˆ๋Š”๋ฐ์š”!!,,

if 1)

let chars = Array(readLine()!)

์ด๋Ÿฐ์‹์œผ๋กœ ์™œ ํ•œ ๋ฒˆ์— ๋ฐ›์ง€ ์•Š์•˜๋Š”์ง€ ์—ฌ์ญค๋ณด์‹œ๋Š”๊ฑธ๊นŒ์š”??

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•œ ์ด์œ ๋Š”, ์‚ฌ์‹ค ํฐ ์ด์œ ๋Š” ์—†๊ณ  ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์€ ๋ฐฉ์‹์„ ํƒํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

if 2)

์•„๋‹ˆ๋ฉด, ๋ฌธ์ž์—ด์„ ์ž…๋ ฅ๋ฐ›๊ณ ์„œ

let chars = Array(S)

๋ฅผ ํ†ตํ•ด Character ๋ฐฐ์—ด๋กœ ๋ฐ”๊พผ ์ด์œ ์— ๋Œ€ํ•ด ์—ฌ์ญค๋ณด์‹œ๋Š”๊ฑธ๊นŒ์š”??

์ด๊ฑด ๋ฌธ์ž์—ด ์ธ๋ฑ์‹ฑ์ด ๋ถˆํŽธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. chars[i]์ฒ˜๋Ÿผ ์ธ๋ฑ์Šค๋กœ ๊ฐ ๋ฌธ์ž๋ฅผ ๋‹ค๋ฃจ๊ณ  ์‹ถ์–ด์„œ ๋ฐฐ์—ดํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค!

3. ์ฝค๋งˆ'์™€ '&&'๋ฅผ ์“ฐ๋Š” ๊ธฐ์ค€์ด ์žˆ์œผ์‹ ๊ฐ€์š”?

์˜ค ์ด๊ฑฐ ๋˜๊ฒŒ ์ข‹์€ ๊ด€์ฐฐ์ด๋„ค์š”.

๊ฒฐ๋ก ์ ์œผ๋กœ,
์ €๋งŒ์˜ ์Šคํƒ€์ผ์ด ์žˆ๋‹ค๊ธฐ ๋ณด๋‹ค๋Š” '์ฝค๋งˆ'์™€ '&' ๋‘˜๋‹ค ๊ฐ™์€ ๋ฌธ๋ฒ•์ด๋‹ค๋ณด๋‹ˆ,
์กฐ๊ฑด์— ๋งž์ถฐ์„œ ์ž์—ฐ์Šค๋Ÿฌ์šด๊ฒŒ ๊ด€์„ฑ์ ์œผ๋กœ ๋‚˜๊ฐ€๋Š” ๊ฒƒ ๊ฐ™์•„์š”.

๊ทผ๋ฐ ์ด๋ ‡๊ฒŒ ๋ง์”€ํ•ด์ฃผ์‹œ๊ณ  ๋ณด๋‹ˆ,
๊ฐœ์ธ์ ์œผ๋กœ๋Š” &&๋ณด๋‹จ ์ฝค๋งˆ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์„œ ๊ฐ€๋…์„ฑ์ด ๋” ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2.

if 1) ์— ์ถ”๊ฐ€์ ์œผ๋กœ
์ œ๊ฐ€ guard let ๊ตฌ๋ฌธ์œผ๋กœ ์‹œ์ž‘ํ•ด๊ฐ€์ง€๊ตฌ ๋‘ ์ค„๋กœ ์จ์•ผํ–ˆ๋„ค์š”!

guard let S = Array(readLine()) else { exit(0) } => โŒ

readLine() -> String?์ด๊ธฐ์—
Array(readLine())๋กœ ์“ธ ์ˆ˜๊ฐ€ ์—†๋„ค์š”! (์˜ต์…”๋„ ํƒ€์ž…์„ ๋ฐ”๋กœ ์บ๋ฆญํ„ฐ ๋ฐฐ์—ด๋กœ ๋ฐ”๊พธ๋ คํ•˜๊ธฐ ๋•Œ๋ฌธ)

Copy link
Collaborator

@YooGyeongMo YooGyeongMo left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์“ธ๋ฐ์—†์ด ๋ฌธ์ž์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ผ๋‹ค๊ฐ€ ๋จธ๋ฆฌํ†ต ๋ฐ•์‚ด๋‚œ ์ €์ž…๋‹ˆ๋‹ค.

  • ์ €์˜ ์ตœ์• ๋Š” ์ „์†Œ๋ฏธ์™€ ๊น€๋„์—ฐ์ด์—ˆ์Šต๋‹ˆ๋‹ค ... ํ˜ธํ˜ธ

Comment on lines +15 to +34
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์Œ .... ๋ช‡๋ฒˆ ๋‚˜์˜ค๋Š”์ง€ ๋ฐ˜๋ณต๋˜๋Š”๊ฒŒ IOI์ด๋‹ˆ ์ด๊ฒƒ๋งŒ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ์ฒดํฌํ•ด์ฃผ๋ฉด ๋˜๋Š”๊ฒƒ์ด์—ˆ๊ตฐ์š”...

์ฒ˜์Œ์— ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ + ๋ธŒ๋ฃจํŠธ ํฌ์Šค๋กœ ํ’€์—ˆ์„๋•Œ ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ๋ปฅ ! ํ•˜๊ณ  ํ„ฐ์ ธ์„œ ํ•™๋ถ€๋•Œ ๋ฐฐ์šด๊ฒŒ ์ƒ๊ฐ๋‚˜์„œ ์–•์€ ์ง€์‹์œผ๋กœ KMP๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์—ฌ ๋งŒ๋“ค์–ด๋ณด์•˜๋Š”๋ฐ.... ์ดํ•ดํ•˜๋Š” ์‹œ๊ฐ„์ด ์—„์ฒญ ์˜ค๋ž˜ ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค...

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-05-06 แ„‹แ…ฉแ„’แ…ฎ 10 06 23

์‹œ๊ฐ„๊ณผ ๊ณต๊ฐ„์ด ์ œ์ผ ์ข‹์€๊ฒŒ ์ ค ์œ„์—๊ฐ€ ๊ธธ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค ใ…‹ใ…‹ใ…‹
๋ฐ˜๋ณต์ด ๋ณด์žฅ๋œ ๊ณณ์—์„œ๋Š” ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ํ’€๋ฉด๋˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค... ใ…‹ใ…‹ใ…‹...

์•„๋ž˜๋Š” KMP ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์ ‘๋ฏธ์‚ฌ, ์ ‘๋‘์‚ฌ๋กœ ์–ด๋””๊นŒ์ง€ ๋ฐ˜๋ณต๋˜๋Š”์ง€ pi ๋ฐฐ์—ด์„ ๋‹ด์•„์„œ intํ˜•์œผ๋กœ ๊ณ„์‚ฐํ•œ ํ›„ KMP๋ฅผ ํ†ตํ•ด ์–‘์ชฝ ๋์—์„œ ๋ถ€ํ„ฐ ๋ธŒ๋ฃจํŠธ ํฌ์Šค์ฒ˜๋Ÿผ ์ผ์ผ์ด ๋‹ค ์ฒดํฌํ•˜๋Š”๊ฒƒ์ด์•„๋‹ˆ๋ผ ์–‘์ชฝ์—์„œ ์ขํ˜€์˜ค๋ฉด์„œ ์ผ์น˜ํ•˜๋‹ค๊ฐ€ ํ•˜๋‚˜๊ฐ€ ํ‹€๋ฆฐ ํŒจํ„ด์ด ๋‚˜์˜ค๋ฉด ๊ทธ๋งŒํผ ๋„์–ด๋„˜๊ณ  ๊ทธ ๋’ค์— ๋ถ€ํ„ฐ ์ฒดํฌํ•˜๋Š” ์—„์ฒญ ํšจ์œจ์ ์ธ ๋ฌธ์ž์—ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.

KMP ๋ธ”๋กœ๊ทธ
https://velog.io/@hwan2da/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-KMP-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
KMP ์˜์ƒ
https://www.youtube.com/watch?v=yWWbLrV4PZ8

import Foundation

// N = 'O' ์˜ ๊ฐœ์ˆ˜ N+1 = 'I'์˜ ๊ฐœ์ˆ˜
// PN์˜ ๊ธธ์ด๋Š” 2N+1 -> I๋งŒ ๋ถ™์ด๊ณ  ๋’ค์— OI๋งŒ ๋ถ™์ด๋ฉด ?
// ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ์™€ KMP ์‚ฌ์šฉํ•˜๋ฉด ๋ ๋“ฏํ•จ ?
// ์ตœ์†Œ N์€ 1์ด์ƒ์ž„

// 1. ํŒจํ„ด ๋งŒ๋“ค๊ธฐ: "IOI"๊ฐ€ N๋ฒˆ ๋ฐ˜๋ณต๋œ PN
func makePattern(n: Int) -> String {
    var pattern = "I"
    for _ in 0..<n {
        pattern += "OI"
    }
    return pattern
}

// 2. ์ ‘๋‘์‚ฌ ๋ฐฐ์—ด (pi ๋ฐฐ์—ด) ์ƒ์„ฑ
func makePi(_ pattern: String) -> [Int] {
    let p = Array(pattern)
    var pi = Array(repeating: 0, count: p.count)
    var j = 0
    
    for i in 1..<p.count {
        while j > 0 && p[i] != p[j] {
            j = pi[j - 1]
        }
        if p[i] == p[j] {
            j += 1
            pi[i] = j
        }
    }
    return pi
}


// 3. KMP ๋งค์นญ
func kmp(_ text: String, _ pattern: String) -> Int {
    let t = Array(text)
    let p = Array(pattern)
    let pi = makePi(pattern)
    
    var j = 0
    var count = 0
    
    for i in 0..<t.count {
        while j > 0 && t[i] != p[j] {
            j = pi[j - 1]
        }
        if t[i] == p[j] {
            if j == p.count - 1 {
                count += 1
                j = pi[j]
            } else {
                j += 1
            }
        }
    }
    return count
}

// 4. ๋ฉ”์ธ ์‹คํ–‰
let N = Int(readLine()!)!
let _ = Int(readLine()!)!        // S์˜ ๊ธธ์ด๋Š” ์•ˆ ์จ๋„ ๋จ
let S = readLine()!

let pattern = makePattern(n: N)
let result = kmp(S, pattern)
print(result)

@sep037
Copy link
Collaborator

sep037 commented May 7, 2025

์ €๋Š” ๋„์ €ํžˆ ํ’€ ๋ฐฉ๋ฒ•์ด ์ƒ๊ฐ ์•ˆ ๋‚˜์„œ ๋ฐ๋ฏธ์•ˆ ์ฝ”๋“œ๋ž‘ ๊ธธ ์ฝ”๋“œ ์ดํ•ดํ•˜๋ฉด์„œ ์ œ๊ฐ€ ๋‹ค์‹œ ์งœ๋ดค์–ด์š” !
๊ทธ๋ƒฅ ๋‹จ์ˆœํ•œ ๊ณ„์‚ฐ ? ๋ฌธ์ œ๋กœ ๋งŒ๋‚ฌ์œผ๋ฉด ํŽธ์•ˆํ–‡์„ ๋ฌธ์ œ์ธ๋ฐ ์ฝ”๋“œ๋กœ ์น˜๋ ค๋‹ˆ ์ง„์ ˆ๋จธ๋ฆฌ๊ฐ€ ๋‚˜๋˜๋ฐ์š” .

//
//  main.swift
//  5525
//
//  Created by Seungeun Park on 5/7/25.
//

import Foundation

let N = Int(readLine()!)!
let _ = Int(readLine()!)! // ๋ฌธ์ž์—ด ๊ธธ์ด๋Š” ํ•„์š” ์—†์Œ
let S = Array(readLine()!) // ๋ฌธ์ž์—ด์„ ๋ฐฐ์—ด๋กœ ๋ฐ”๊ฟ” ์ธ๋ฑ์‹ฑํ•˜๊ธฐ ์‰ฝ๊ฒŒ

var i = 0
var match = 0
var count = 0

while i < S.count - 2 {
    if S[i] == "I" && S[i+1] == "O" && S[i+2] == "I" {
        match += 1
        if match == N {
            count += 1
            match -= 1 // ์ค‘์ฒฉ ๊ฐ€๋Šฅํ•œ ํŒจํ„ด ๊ณ ๋ ค
        }
        i += 2 // IOI ๋‹ค์Œ์€ 'I'๋ถ€ํ„ฐ ๋‹ค์‹œ ๊ฒ€์‚ฌ
    } else {
        match = 0
        i += 1
    }
}

print(count)

Copy link
Member

@alstjr7437 alstjr7437 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‹ค๋ฅธ๋ถ„๋“ค์ด ์ด๋ฏธ ๋ฆฌ๋ทฐ๋ฅผ ๋„ˆ๋ฌด ์ž˜ํ•ด๋†”์ฃผ์…”์„œ ๋” ํ• ๋ง์ด ์—†๋„ค์š”!!...

์ €๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ’€์—ˆ์Šต๋‹ˆ๋‹ค!

let n = Int(readLine()!)!
let m = Int(readLine()!)!

let s = readLine()!.map{$0}

var result = 0
var cur = 0
var count = 0

while cur < m-2{
    if String(s[cur...cur + 2]) == "IOI"{
        count += 1
        cur += 2
        if count == n{
            result += 1
            count -= 1
        }
    } else {
        count = 0
        cur += 1
    }
}

print(result)

Comment on lines +12 to +17
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

index์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๋ช…์„ ์‚ฌ์šฉํ•ด๋„ ๊ดœ์ฐฎ์•˜์„ ๊ฒƒ ๊ฐ™์€๋ฐ i๋กœ ์‚ฌ์šฉํ•˜์‹  ์ด์œ ๋Š” ๊ฐ„๊ฒฐ์„ฑ ๋•Œ๋ฌธ์ผ๊นŒ์š”?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋งž์Šด๋‹ค ์กฐ๊ฑด์ด ๋‹จ์ˆœํ•˜๊ธดํ•ด๋„ ๊ธธ์–ด์„œ ์ด๋•Œ๋Š” ๊ฐ„๊ฒฐ์„ฑ์ด ๋” ์ค‘์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šด๋‹ค!

@giljihun giljihun merged commit 49e463a into main May 9, 2025
6 checks passed
@alstjr7437 alstjr7437 deleted the 3-giljihun branch May 23, 2025 06:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants