※ 모든 문제의 저작권은 SW Expert 아카데미에 있습니다. 학습 기록용으로 문제시 삭제하겠습니다.
4864. [파이썬 S/W 문제해결 기본] 3일차 - 문자열 비교
두 개의 문자열 str1과 str2가 주어진다. 문자열 str2 안에 str1과 일치하는 부분이 있는지 찾는 프로그램을 만드시오.
예를 들어 두 개의 문자열이 다음과 같이 주어질 때, 첫 문자열이 두번째에 존재하면 1, 존재하지 않으면 0을 출력한다.
ABC
ZZZZZABCZZZZZ
두번째 문자열에 첫번째 문자열과 일치하는 부분이 있으므로 1을 출력.
ABC
ZZZZAZBCZZZZZ
문자열이 일치하지 않으므로 0을 출력.
입력_
첫 줄에 테스트 케이스 개수 T가 주어진다. (1≤T≤50)
다음 줄부터 테스트 케이스 별로 길이가 N인 문자열 str1과 길이가 M인 str2가 각각 다른 줄에 주어집니다. (5≤N≤100, 10≤M≤1000, N≤M)
3
XYPV
EOGGXYPVSY
STJJ
HOFSTJPVPP
ZYJZXZTIBSDG
TTXGZYJZXZTIBSDGWQLW
출력_
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
#1 1
#2 0
#3 1
[문제 풀이]
# 테스트 케이스 입력
for t in range(int(input())):
# 각 문자 입력
str1 = input()
str2 = input()
# 개수를 세기위한 변수 초기화
cnt = 0
# str1이 str2안에 있으면 cnt+1
if str1 in str2:
cnt += 1
# 형식에 맞게 출력
print(f'#{t+1}', cnt)
4861. [파이썬 S/W 문제해결 기본] 3일차 - 회문
ABBA처럼 어느 방향에서 읽어도 같은 문자열을 회문이라 한다. NxN 크기의 글자판에서 길이가 M인 회문을 찾아 출력하는 프로그램을 만드시오.
회문은 1개가 존재하는데, 가로 뿐만 아니라 세로로 찾아질 수도 있다.
예를 들어 N=10, M=10 일 때, 다음과 같이 회문을 찾을 수 있다.
입력_
첫 줄에 테스트 케이스 개수 T가 주어진다. (1≤T≤50)
다음 줄부터 테스트 케이스 별로 길이가 N인 문자열 str1과 길이가 M인 str2가 각각 다른 줄에 주어집니다. (5≤N≤100, 10≤M≤1000, N≤M)
3
10 10
GOFFAKWFSM
OYECRSLDLQ
UJAJQVSYYC
JAEZNNZEAJ
WJAKCGSGCF
QKUDGATDQL
OKGPFPYRKQ
TDCXBMQTIO
UNADRPNETZ
ZATWDEKDQF
10 10
WPMACSIBIK
STWASDCOBQ
AMOUENCSOG
XTIIGBLRCZ
WXVSWXYYVU
CJVAHRZZEM
NDIEBIIMTX
UOOGPQCBIW
OWWATKUEUY
FTMERSSANL
20 13
ECFQBKSYBBOSZQSFBXKI
VBOAIDLYEXYMNGLLIOPP
AIZMTVJBZAWSJEIGAKWB
CABLQKMRFNBINNZSOGNT
NQLMHYUMBOCSZWIOBINM
QJZQPSOMNQELBPLVXNRN
RHMDWPBHDAMWROUFTPYH
FNERUGIFZNLJSSATGFHF
TUIAXPMHFKDLQLNYQBPW
OPIRADJURRDLTDKZGOGA
JHYXHBQTLMMHOOOHMMLT
XXCNJGTXXKUCVOUYNXZR
RMWTQQFHZUIGCJBASNOX
CVODFKWMJSGMFTCSLLWO
EJISQCXLNQHEIXXZSGKG
KGVFJLNNBTVXJLFXPOZA
YUNDJDSSOPRVSLLHGKGZ
OZVTWRYWRFIAIPEYRFFG
ERAPUWPSHHKSWCTBAPXR
FIKQJTQDYLGMMWMEGRUZ
출력_
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
#1 JAEZNNZEAJ
#2 MWOIVVIOWM
#3 TLMMHOOOHMMLT
[문제 풀이]
# 테스트 케이스 입력
for t in range(int(input())):
# 각 문자 입력
n, m = map(int, input().split())
result = []
lst = []
# 입력받기
for _ in range(n):
lst.append(input())
# 행 회문검사
for i in range(n):
for j in range(n - m + 1):
if (lst[i][j:m+j] == lst[i][j:j+m][::-1]):
result.append(lst[i][j:m+j])
# 열 회문검사
for i in range(n - m + 1):
for j in range(n):
r_lst = []
for z in range(m):
# 행렬 뒤집는 과정
r_lst.append(lst[i+z][j])
if r_lst == r_lst[::-1]:
result.append(''.join(r_lst))
# 형식에 맞게 출력
print(f'#{t+1}', result[0])
4865. [파이썬 S/W 문제해결 기본] 3일차 - 글자수
두 개의 문자열 str1과 str2가 주어진다. 문자열 str1에 포함된 글자들이 str2에 몇 개씩 들어있는지 찾고, 그중 가장 많은 글자의 개수를 출력하는 프로그램을 만드시오.
예를 들어 str1 = "ABCA", str2 = "ABABCA"인 경우, str1의 A가 str2에 3개 있으므로 가장 많은 글자가 되고 3을 출력한다.
파이썬의 경우 딕셔너리를 이용할 수 있다.
입력_
두 개의 첫 줄에 테스트 케이스 개수 T가 주어진다. 1≤T≤50
다음 줄부터 테스트 케이스 별로 길이가 N인 문자열 str1과 길이가 M인 str2가 각각 다른 줄에 주어진다. 5≤N≤100, 10≤M≤1000, N≤M
3
XYPV
EOGGXYPVSY
STJJ
HOFSTJPVPP
ZYJZXZTIBSDG
TTXGZYJZXZTIBSDGWQLW
출력_
각 줄마다 "#T" (T는 테스트 케이스 번호)를 출력한 뒤, 답을 출력한다.
#1 2
#2 1
#3 3
[문제 풀이]
# 테스트 케이스 입력
for t in range(int(input())):
# 각 문자열 리스트로 입력
str1 = list(map(str, input()))
str2 = list(map(str, input()))
# 딕셔너리 컴프리헨션
# w는 str2를 순회하며 str1에 있다면 키로 w를 값으로 str2에 w의 갯수를 갖는 딕셔너리 생성
dic = {w:str2.count(w) for w in str2 if w in str1}
# for문으로 풀어 쓴 내용
# dic = {}
# for w in str2:
# if w in str1:
# dic.setdefault(w , str2.count(w))
# 형식에 맞게 출력
print(f'#{t+1}', max(dic.values()))