We will find a way, we always have.

-interstellar

Problem Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 5015๋ฒˆ: ls

Redddy 2024. 11. 16. 23:59

๐Ÿ”ˆ ๋ฌธ์ œ

ํ˜„์ง„์ด๋Š” ์ง‘์—์„œ ์ทจ๋ฏธ๋กœ ์šด์˜ ์ฒด์ œ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค. ์˜ค๋Š˜์€ ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์˜ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” "ls"๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•  ์ฐจ๋ก€์ด๋‹ค. ํ˜„์ง„์ด๋Š” ์‚ฌ์šฉ์ž๋“ค์ด ์™€์ผ๋“œ์นด๋“œ(*)๋ฅผ ์ด์šฉํ•ด์„œ ํŒจํ„ด๊ณผ ์ผ์น˜ํ•œ ํŒŒ์ผ ์ด๋ฆ„์„ ๋ณด์—ฌ์ฃผ๊ฒŒ ํ•˜๋ ค๊ณ  ํ•œ๋‹ค. ์™€์ผ๋“œ ์นด๋“œ๋Š” ์–ด๋–ค ๋ฌธ์ž์˜ 0๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ์— ํ•ด๋‹นํ•œ๋‹ค.

 

 

๐Ÿ“์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํŒจํ„ด P๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. P๋Š” 1๊ธ€์ž~100๊ธ€์ž์ด๊ณ , ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ '.', '*'๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๋””๋ ‰ํ† ๋ฆฌ์˜ ํŒŒ์ผ ๊ฐœ์ˆ˜ N์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100) ๋‹ค์Œ N๊ฐœ์˜ ์ค„์—๋Š” ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„์ด ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ํŒŒ์ผ์˜ ์ด๋ฆ„์€ 1๊ธ€์ž~100๊ธ€์ž์ด๊ณ , ์•ŒํŒŒ๋ฒณ ์†Œ๋ฌธ์ž์™€ '.'์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

 

๐Ÿ“‘์ถœ๋ ฅ

ํŒจํ„ด P์™€ ์ผ์น˜ํ•˜๋Š” ํŒŒ์ผ์˜ ์ด๋ฆ„์„ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ์„œ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“š ๋ฌธ์ œ ํ’€์ด

 

์žฌ๋ฏธ์žˆ๋Š” ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฌธ์ œ์˜€๋‹ค. dp[i][j]๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๊ฒƒ์€ ํŒจํ„ด๋ฌธ์ž[i]์™€ ํŒŒ์ผ๋ฌธ์ž[j] ๊นŒ์ง€์˜ ๋งค์น˜์—ฌ๋ถ€์ด๋‹ค. 

dp[i][j] ๊ฐ€ -1 ์ด๋ฉด ์•„์ง ๊ณ„์‚ฐ๋˜์ง€ ์•Š์€ ๊ฒƒ์ด๊ณ , dp[i][j] = 0 ์ด๋ฉด ๋งค์นญ๋˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•˜๊ณ , dp[i][j] = 1 ์ด๋ฉด ๋งค์นญ๋จ์„ ์˜๋ฏธํ•œ๋‹ค. 

 

ํŒจํ„ด๋ฌธ์ž์™€ ํŒŒ์ผ๋ฌธ์ž๊ฐ€ ๋™์ผํ•  ๋•Œ๊นŒ์ง€ i์™€ j ๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. 

 

1
2
3
4
if p_idx < p.len() && s_idx < s.len() && p.as_bytes()[p_idx] == s.as_bytes()[s_idx] {
        dp[p_idx][s_idx] = solve(dp, p, s, p_idx + 1, s_idx + 1);
        return dp[p_idx][s_idx];
}    
cs

 

 

๊ทธ๋Ÿฌ๋‹ค ๋งŒ์•ฝ ํŒจํ„ด๋ฌธ์ž ๋๊นŒ์ง€ ๋„๋‹ฌํ–ˆ์„ ๋•Œ, ํŒŒ์ผ๋ฌธ์ž๋„ ๋๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด dp[i][j] = 1์ด๋˜๊ณ , ํŒŒ์ผ๋ฌธ์ž๊ฐ€ ์•„์ง ๋๋‚˜์ง€ ์•Š์•˜๋‹ค๋ฉด dp[i][j] = 0์ด ๋œ๋‹ค. 

 

1
2
3
4
if p_idx == p.len() {
        dp[p_idx][s_idx] = if s_idx == s.len() { 1 } else { 0 };
        return dp[p_idx][s_idx];
}
cs

 

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

 

*๊ฐ€ ๋นˆ๋ฌธ์ž์—ด์ผ๋•Œ, ๋งค์นญ๋˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด i์˜ ์ธ๋ฑ์Šค๋งŒ ํ•˜๋‚˜ ์ฆ๊ฐ€์‹œ์ผœ์„œ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ , *๊ฐ€ ํ˜„์žฌ ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜๋Š” ๊ฒฝ์šฐ๋Š” j์˜ ์ธ๋ฑ์Šค๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ ์žฌ๊ท€๋ฅผ ํ†ตํ•ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

1
2
3
4
5
6
if p.as_bytes()[p_idx] == b'*' {
    if solve(dp, p, s, p_idx + 1, s_idx) == 1 || (s_idx < s.len() && solve(dp, p, s, p_idx, s_idx + 1== 1) {
        dp[p_idx][s_idx] = 1;
        return dp[p_idx][s_idx];
    }
}
cs

 

 

์‹œ๊ฐ„๋ณต์žก๋„๋Š” $O(n^2)$ ์ด ๋œ๋‹ค. 

 

 

๐Ÿ’ป ์ฝ”๋“œ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
use std::io::{self, BufRead};
 
fn solve(dp: &mut Vec<Vec<i8>>, p: &str, s: &str, p_idx: usize, s_idx: usize) -> i8 {
    if dp[p_idx][s_idx] != -1 {
        return dp[p_idx][s_idx];
    }
 
    if p_idx < p.len() && s_idx < s.len() && p.as_bytes()[p_idx] == s.as_bytes()[s_idx] {
        dp[p_idx][s_idx] = solve(dp, p, s, p_idx + 1, s_idx + 1);
        return dp[p_idx][s_idx];
    }
 
    if p_idx == p.len() {
        dp[p_idx][s_idx] = if s_idx == s.len() { 1 } else { 0 };
        return dp[p_idx][s_idx];
    }
 
    if p.as_bytes()[p_idx] == b'*' {
        if solve(dp, p, s, p_idx + 1, s_idx) == 1 || (s_idx < s.len() && solve(dp, p, s, p_idx, s_idx + 1== 1) {
            dp[p_idx][s_idx] = 1;
            return dp[p_idx][s_idx];
        }
    }
 
    dp[p_idx][s_idx] = 0;
    dp[p_idx][s_idx]
}
 
fn main() {
    let stdin = io::stdin();
    let mut input = stdin.lock().lines();
 
    let p = input.next().unwrap().unwrap();
    let n: usize = input.next().unwrap().unwrap().parse().unwrap();
    let m = 100;
    let mut res = Vec::new();
 
    for _ in 0..n {
        let mut dp = vec![vec![-1; m + 1]; m + 1];
        let s = input.next().unwrap().unwrap();
        if solve(&mut dp, &p, &s, 00== 1 {
            res.push(s);
        }
    }
 
    for r in res {
        println!("{}", r);
    }
}
cs

 

 

color scipter์—์„œ rust ํฌ๋งท์€ ์ œ๊ณตํ•ด์ฃผ์ง€ ์•Š์•„์„œ ๋‹ค๋ฅธ ๊ฑธ ์ฐพ์•„๋ด์•ผ ๊ฒ ๋‹ค...ใ…  

 

์—ฌ๋‹ด์œผ๋กœ ํŒŒ์ด์ฌ์—์„œ๋Š” fnmatch๋ผ๋Š” ๊ฐœ์ฉŒ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค,,,

 

1
2
3
4
5
6
7
8
9
10
11
import sys, fnmatch
input = sys.stdin.readline
 
= input().rstrip()
= int(input())
res = []
for _ in range(n):
    s = input().rstrip()
    if fnmatch.fnmatch(s, p):
        res.append(s)
print(*res,sep='\n')
cs

 

 

๋‹คํ–‰์ด(?) dp ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ๋Š๋ฆฌ๋‹ค. 

 

๐Ÿญ ์‹œํ–‰์ฐฉ์˜ค

 

 

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