소프티어 lv2 문제
https://softeer.ai/practice/info.do?idx=1&eid=623
언어별 시간/메모리
Python : 1초, 1024MB
메모리가 크네?
문제
회사 식당에는 전설처럼 전해 내려오는 비밀 메뉴에 대한 소문이 있다. 소문의 내용은 대강 이러하다.
식권 자판기의 버튼을 특정 순서대로 누르고 결제를 하면, 평소와는 다른 색깔의 식권이 나온다.
이 식권을 배식대에 제출하면, 어떤 비밀 메뉴를 받을 수 있다는 것이다. 물론 이를 실제로 본 사람은 아무도 없어서, 어떤 메뉴가 나오는지는 커녕 눌러야 하는 버튼의 순서조차 알려져 있지 않다.
주방장인 당신은 이 소문의 실체를 알고 있다. 이는 분명한 사실이다!
정해진 버튼 조작법을 사용하면 비밀 메뉴의 식권을 얻을 수 있다. 그러나 얼마 전 식권 자판기가 고장으로 교체되면서, 새 자판기에서는 비밀 메뉴 조작법이 작동하지 않게 되었다.
당신은 프로그래밍 실력을 살려, 사용자의 버튼 조작 중 비밀 메뉴 조작법이 포함되어 있는지를 판단하는 회로를 추가하려 한다.
자판기에는 총 K개의 버튼이 있다. 각 버튼마다 1부터 K까지 번호가 붙어 있어서, 조작 과정은 1 이상 K 이하의 정수 여러 개로 나타낼 수 있다.
비밀 메뉴 조작법은 M개의 버튼 조작으로 이루어져 있으며, 이 순서대로 버튼을 누르면 반드시 비밀 메뉴 식권이 발매된다. 이때, 이 조작법 앞뒤로 다른 버튼 조작이 있어도 비밀 메뉴로 인정된다.
사용자가 누른 N개의 버튼 조작이 주어질 때, 사용자가 비밀 메뉴 식권을 받을 수 있는지를 확인하는 프로그램을 작성하여라.
제약조건
1 ≤ K ≤ 9
1 ≤ M ≤ 100
1 ≤ N ≤ 100
각 버튼의 번호는 1 이상 K 이하이다.
입력형식
첫째 줄에 M, N, K가 공백을 사이에 두고 주어진다.
둘째 줄에 비밀 메뉴 조작법을 나타내는 M개의 정수가 공백을 사이에 두고 주어진다. 각 정수는 1 이상 K 이하이다.
셋째 줄에 사용자의 버튼 조작을 나타내는 N개의 정수가 공백을 사이에 두고 주어진다. 각 정수는 1 이상 K 이하이다.
출력형식
사용자가 비밀 메뉴 식권을 받을 수 있다면 secret을, 그렇지 않다면 normal을 첫째 줄에 출력한다.
작년 학교 알고리즘 수업 때 배웠던 것으로 기억한다. 그런데 코드로 짜보진 않았었다.
오답1
# 비밀메뉴
# k개 버튼, 1부터 k까지 번호
# 비밀메뉴 : m개의 버튼 조작
# 사용자의 n개의 버튼 조작이 있을 때 비밀메뉴 받을 수 있는지
m, n, k = map(int, input().split())
secret = list(map(int,input().split()))
command = list(map(int,input().split()))
def isSecret(command, secret):
if n<m:
print("normal")
return
count = 0
for i in range(n):
if count == m:
print("secret")
return
for j in range(m):
if command[i] == secret[j+count]:
count += 1
break;
else:
count = 0
break;
print("normal")
return
isSecret(command,secret)
처음 코드다.
예시로 나온 테스트 케이스들은 모두 통과가 나왔는데 제출해보니 틀렸다.

케이스를 추가해 보니까 마지막에 입력키의 마지막에 비밀키가 입력되었을 때는 for 문이 끝나서 secret이 안나오는 케이스가 있어서 마지막 부분을 다음처럼 수정했더니 그래도 틀렸다.
오답2
...
else:
count = 0
break;
if count == m:
print("secret")
else:
print("normal")
return

60개의 TC중 4개가 오답이었다. 뭐가 있을까?
# 비밀메뉴
# k개 버튼, 1부터 k까지 번호
# 비밀메뉴 : m개의 버튼 조작
# 사용자의 n개의 버튼 조작이 있을 때 비밀메뉴 받을 수 있는지
m, n, k = map(int, input().split())
secret = list(map(int,input().split()))
command = list(map(int,input().split()))
def isSecret(command, secret):
if n<m: # 입력키가 비밀키보다 짧으면
print("normal")
return
count = 0
for i in range(n):
for j in range(m):
if j+count >= m:
print("normal")
return
if command[i] == secret[j+count]:
count += 1
break;
else:
count = 0
break;
if count == m: # 비밀키를 입력받으면
print("secret")
return
print("normal")
isSecret(command,secret)
그리고 방금까지의 코드는 겹치는 부분이 있어서 위처럼 조금 수정했다.
모르겠다............. 뭐있지? ? ? ? ?? ? ?
GPT가 짜준코드
m, n, k = map(int, input().split())
secret = list(map(int, input().split()))
command = list(map(int, input().split()))
def isSecret(command, secret):
if n < m: # 입력키가 비밀키보다 짧으면
print("normal")
return
for i in range(n - m + 1): # 비밀 메뉴의 길이를 초과하지 않도록 범위 설정
is_secret = True # 비밀 메뉴인지 확인하는 플래그
for j in range(m):
if command[i + j] != secret[j]:
is_secret = False
break
if is_secret: # 비밀 메뉴를 입력받으면
print("secret")
return
print("normal")
isSecret(command, secret)
https://softeer.ai/class/algotutor/detail.do?id=76
m, n, k = map(int, input().split())
M = input().split()
N = input().split()
secret = False
for i in range(n-m+1):
if M==N[i:i+m]:
secret = True
break
if secret == True:
print('secret')
else:
print('normal')
허허 정말 쉽게 푸셨다.
현타오네