BOJ#5015 ls
* 문제 https://www.acmicpc.net/problem/5015
* 풀이
재귀 형태로 풀었습니다.
입력 파라미터는 패턴 문자열 P의 index인 p와 검사할 문자열 S의 index인 s입니다.
반환값은 memoization값인 dp[p][s]이며, dp[p][s]는 P[p]와 S[s]를 비교한 결과(매칭 여부)를 의미합니다.
dp[p][s] = TRUE(1) or FALSE(0)
static int checkStringPattern ( int p , int s )
일단 패턴은 와일드카드(*) 와 그 외 문자로 분류할 수 있습니다.
1. 와일드 카드(*)의 경우
와일드카드는 어떤 문자의 0개 또는 그 이상에 해당하므로 아래의 3가지 경우로 나누어 탐색할 수 있습니다.
1) 0개에 해당하는 경우
if ( checkStringPattern ( p + 1 , s ) == TRUE )
2) 1개에 해당하는 경우
if ( checkStringPattern ( p + 1 , s + 1 ) == TRUE )
3) 그 이상에 해당하는 경우
if ( checkStringPattern ( p , s + 1 ) == TRUE )
즉,
int isMatch = FALSE ;if ( s <= sLength ) { if ( checkStringPattern ( p + 1 , s ) == TRUE ) isMatch = TRUE ; if ( checkStringPattern ( p + 1 , s + 1 ) == TRUE ) isMatch = TRUE ; if ( checkStringPattern ( p , s + 1 ) == TRUE ) isMatch = TRUE ;} return dp [ p ][ s ] = isMatch;
2. 패턴이 그 외 문자인 경우 무조건 패턴과 문자열을 비교해야 합니다.
if ( P [ p ] == S [ s ]) return dp [ p ][ s ] = checkStringPattern ( p + 1 , s + 1 ) ;else return dp [ p ][ s ] = FALSE ;
* Test Case 더보기 접기
출처 :
1.
x*y
8
xy
xay
xaby
xabcy
xyz
xayz
xabyz
xabcyz
2.
*.h
100
aio.h
aliases.h
alloca.h
a.out.h
argp.h
argz.h
ar.h
arpa
asm
assert.h
bits
byteswap.h
clif.h
complex.h
cpio.h
crypt.h
ctype.h
dirent.h
dlfcn.h
elf.h
endian.h
envz.h
err.h
errno.h
error.h
execinfo.h
fcntl.h
features.h
fenv.h
fmtmsg.h
fnmatch.h
fstab.h
fts.h
ftw.h
gconv.h
getopt.h
glob.h
gnu
grp.h
gshadow.h
iconv.h
ifaddrs.h
initreq.h
inttypes.h
langinfo.h
lastlog.h
libgen.h
libintl.h
libio.h
libltdl
limits.h
link.h
linux
locale.h
ltdl.h
malloc.h
math.h
mcheck.h
memory.h
mntent.h
monetary.h
mqueue.h
mtd
net
netash
netatalk
netdb.h
neteconet
netinet
netipx
netiucv
netpacket
netrom
netrose
nfs
nss.h
numpy
obstack.h
openssl
openvpn
paths.h
poll.h
printf.h
protocols
pthread.h
pty.h
pwd.h
rdma
regex.h
regexp.h
resolv.h
rpc
rpcsvc
sched.h
scsi
search.h
semaphore.h
setjmp.h
sgtty.h
shadow.h
aio.h
aliases.h
alloca.h
a.out.h
argp.h
argz.h
ar.h
assert.h
byteswap.h
clif.h
complex.h
cpio.h
crypt.h
ctype.h
dirent.h
dlfcn.h
elf.h
endian.h
envz.h
err.h
errno.h
error.h
execinfo.h
fcntl.h
features.h
fenv.h
fmtmsg.h
fnmatch.h
fstab.h
fts.h
ftw.h
gconv.h
getopt.h
glob.h
grp.h
gshadow.h
iconv.h
ifaddrs.h
initreq.h
inttypes.h
langinfo.h
lastlog.h
libgen.h
libintl.h
libio.h
limits.h
link.h
locale.h
ltdl.h
malloc.h
math.h
mcheck.h
memory.h
mntent.h
monetary.h
mqueue.h
netdb.h
nss.h
obstack.h
paths.h
poll.h
printf.h
pthread.h
pty.h
pwd.h
regex.h
regexp.h
resolv.h
sched.h
search.h
semaphore.h
setjmp.h
sgtty.h
shadow.h
3.
*
100
aio.h
aliases.h
alloca.h
a.out.h
argp.h
argz.h
ar.h
arpa
asm
assert.h
bits
byteswap.h
clif.h
complex.h
cpio.h
crypt.h
ctype.h
dirent.h
dlfcn.h
elf.h
endian.h
envz.h
err.h
errno.h
error.h
execinfo.h
fcntl.h
features.h
fenv.h
fmtmsg.h
fnmatch.h
fstab.h
fts.h
ftw.h
gconv.h
getopt.h
glob.h
gnu
grp.h
gshadow.h
iconv.h
ifaddrs.h
initreq.h
inttypes.h
langinfo.h
lastlog.h
libgen.h
libintl.h
libio.h
libltdl
limits.h
link.h
linux
locale.h
ltdl.h
malloc.h
math.h
mcheck.h
memory.h
mntent.h
monetary.h
mqueue.h
mtd
net
netash
netatalk
netdb.h
neteconet
netinet
netipx
netiucv
netpacket
netrom
netrose
nfs
nss.h
numpy
obstack.h
openssl
openvpn
paths.h
poll.h
printf.h
protocols
pthread.h
pty.h
pwd.h
rdma
regex.h
regexp.h
resolv.h
rpc
rpcsvc
sched.h
scsi
search.h
semaphore.h
setjmp.h
sgtty.h
shadow.h
aio.h
aliases.h
alloca.h
a.out.h
argp.h
argz.h
ar.h
arpa
asm
assert.h
bits
byteswap.h
clif.h
complex.h
cpio.h
crypt.h
ctype.h
dirent.h
dlfcn.h
elf.h
endian.h
envz.h
err.h
errno.h
error.h
execinfo.h
fcntl.h
features.h
fenv.h
fmtmsg.h
fnmatch.h
fstab.h
fts.h
ftw.h
gconv.h
getopt.h
glob.h
gnu
grp.h
gshadow.h
iconv.h
ifaddrs.h
initreq.h
inttypes.h
langinfo.h
lastlog.h
libgen.h
libintl.h
libio.h
libltdl
limits.h
link.h
linux
locale.h
ltdl.h
malloc.h
math.h
mcheck.h
memory.h
mntent.h
monetary.h
mqueue.h
mtd
net
netash
netatalk
netdb.h
neteconet
netinet
netipx
netiucv
netpacket
netrom
netrose
nfs
nss.h
numpy
obstack.h
openssl
openvpn
paths.h
poll.h
printf.h
protocols
pthread.h
pty.h
pwd.h
rdma
regex.h
regexp.h
resolv.h
rpc
rpcsvc
sched.h
scsi
search.h
semaphore.h
setjmp.h
sgtty.h
shadow.h
4.
*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a*a
4
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
xbaacyadaeafagahaiajakalamanaoapaqarasatauavawaxayazabacadaeafagahaiajakalamanaoapaqarasatauavawaxaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
xbaacyadaeafagahaiajakalamanaoapaqarasatauavawaxayazabacadaeafagahaiajakalamanaoapaqarasatauavawaxaa
5.
6.
*.c*
4
1074.cpp
1463.c
2295.cpp
2503.cpp
1074.cpp
1463.c
2295.cpp
2503.cpp
접기
* 나의 코드 (Java) https://github.com/stack07142/BOJ/blob/master/BOJ%235015/src/Main.java
import java.io.BufferedReader ;import java.io.IOException ;import java.io.InputStreamReader ;import java.util.Arrays ;public class Main { static final int NONE = -1 ; static final int FALSE = 0 ; static final int TRUE = 1 ; // Pattern : P, File Name String :S static char [] P , S ; static int pLength , sLength ; static int [][] dp = new int [ 102 ][ 102 ] ; public static void main ( String [] args ) throws IOException { BufferedReader br = new BufferedReader( new InputStreamReader( System .in )) ; P = br.readLine () .toCharArray () ; pLength = P .length ; int N = Integer .parseInt ( br.readLine ()) ; for ( int i = 0 ; i < N; i++) { S = br.readLine () .toCharArray () ; sLength = S .length ; initMemoization () ; if ( checkStringPattern ( 0 , 0 ) == TRUE ) System .out .println ( S ) ; } } static int checkStringPattern ( int p , int s ) { // 종료 조건 if ( p == pLength && s == sLength ) return TRUE ; if ( p >= pLength ) return FALSE ; if ( s >= sLength && P [ p ] != '*' ) return FALSE ; // Memoization if ( dp [ p ][ s ] != NONE ) { return dp [ p ][ s ] ; } // 탐색 // Pattern : * if ( P [ p ] == '*' ) { int isMatch = FALSE ; if ( s <= sLength ) { if ( checkStringPattern ( p + 1 , s ) == TRUE ) isMatch = TRUE ; if ( checkStringPattern ( p + 1 , s + 1 ) == TRUE ) isMatch = TRUE ; if ( checkStringPattern ( p , s + 1 ) == TRUE ) isMatch = TRUE ; } return dp [ p ][ s ] = isMatch; } // Pattern : . 또는 영어 소문자 else { if ( P [ p ] == S [ s ]) return dp [ p ][ s ] = checkStringPattern ( p + 1 , s + 1 ) ; else return dp [ p ][ s ] = FALSE ; } } static void initMemoization () { for ( int i = 0 ; i < 102 ; i++) { Arrays .fill ( dp [ i] , NONE ) ; } } }