취뽀 기록

#열심히 살자 #취업 #공부

Python/[코드트리]

[코드트리] 탐색 > 연속부분수열일까

hyunnn_00 2023. 7. 2. 13:50

 

n1개의 원소로 이루어져 있는 수열 A의 정보와, n2개의 원소로 이루어져 있는 수열 B의 정보가 주어졌을 때 수열 B가 수열 A의 연속부분수열인지를 판단하는 프로그램을 작성해보세요.
수열 B가 수열 A의 원소들을 연속하게 뽑았을 때 나올 수 있는 수열이라면 연속부분수열이라 부릅니다.
예를 들어 수열 A가 [1, 5, 2, 6] 일때 수열 B가 [5, 2]라면 수열 B는 수열 A의 연속 부분 수열이지만, 만약 수열 B가 [5, 6]이라면 연속 부분 수열이 아닙니다.

 

 

 

 

 

 

import sys

# 정수 n1과 n2를 입력받습니다.
n1, n2 = tuple(map(int, input().split()))

# arr1을 입력받습니다.
arr1 = list(map(int, input().split()))

# arr2를 입력받습니다.
arr2 = list(map(int, input().split()))
	
# arr2이 arr1의 연속부분수열인지 확인합니다.
for i in range(n1):
	# arr1의 i번 index부터의 수열이 arr2와 완전히 일치하는지 확인합니다.
	# 즉, arr1[i] == arr2[0], arr1[i+1] == arr2[1]...이 성립하는지 확인합니다.
	# success : arr1의 i번 index부터의 수열이 arr2와 완전히 일치할때만 true, 그 외 false
	success = True
	
	for j in range(n2):
		# arr1의 index가 범위 밖으로 벗어날때
		if i + j >= n1:
			success = False
			break

		# arr1과 arr2가 일치하지 않을때
		if arr1[i + j] != arr2[j]:
			success = False
			break
		
	# 완전히 일치할 경우, arr2는 arr1의 연속부분수열이 맞습니다.
	# 구현의 편의를 위해 sys라이브러리를 가져와 sys.exit()으로 프로그램을 강제 종료하였습니다.
	if success:
		print("Yes")
		sys.exit()
	
# 완전히 일치하는 경우가 하나도 없을 경우, arr2는 arr1의 연속부분수열이 아닙니다.
print("No")

# 나의 풀이 --------------------------------------------
n1, n2 = tuple(map(int,input().split()))

arr1 = list(map(int, input().split()))
arr2 = list(map(int, input().split()))

found = False

# 시작점이 같은 코드 찾기
for i in range(len(arr1) - len(arr2) + 1): # arr1의 개수만큼 찾기
    if arr1[i] == arr2[0]: # arr2의 첫 시작점이 arr1의 원소와 같으면
        match = True # 매치함
        for j in range(1, len(arr2)): # arr2의 길이만큼 찾기
            if arr1[i+j] != arr2[j]: # 다음 원소가 같지 않으면 그만하고
                match = False # 매치하지 않음
                break # 구문을 빠져나감
        if match: # 만약 매치하면
            found = True # found 변수를 True로 변경
            break # 그리고 구문을 빠져나감

if found == True:
    print("Yes")
else:
    print("No")

오류 코드

n1, n2 = tuple(map(int,input().split()))

arr1 = list(map(int, input().split()))
arr2 = list(map(int, input().split()))

if arr2 in arr1:
    print("Yes")
else:
    print("No")
n1, n2 = tuple(map(int,input().split()))

arr1 = list(map(int, input().split()))
arr2 = list(map(int, input().split()))

# 시작점이 같은 코드 찾기
for i in range(len(arr1)): # len 
    for j in range(len(arr2)):
        if arr1[i] == arr2[j]:
            for k in range(len(arr2)):
                if arr1[i+k] != arr2[j+k]:
                    break
                print("Yes")
        else:
            print("No")