-
[Softeer][21년 재직자 대회 예선] 비밀메뉴개발 이야기/알고리즘 및 코테 준비 2024. 9. 4. 11:13
문제
회사 식당에는 전설처럼 전해 내려오는 비밀 메뉴에 대한 소문이 있다.
소문의 내용은 대강 이러하다.
식권 자판기의 버튼을 특정 순서대로 누르고 결제를 하면, 평소와는 다른 색깔의 식권이 나온다. 이 식권을 배식대에 제출하면, 어떤 비밀 메뉴를 받을 수 있다는 것이다.
물론 이를 실제로 본 사람은 아무도 없어서, 어떤 메뉴가 나오는지는 커녕 눌러야 하는 버튼의 순서조차 알려져 있지 않다.
주방장인 당신은 이 소문의 실체를 알고 있다. 이는 분명한 사실이다!
정해진 버튼 조작법을 사용하면 비밀 메뉴의 식권을 얻을 수 있다. 그러나 얼마 전 식권 자판기가 고장으로 교체되면서,
새 자판기에서는 비밀 메뉴 조작법이 작동하지 않게 되었다.
당신은 프로그래밍 실력을 살려, 사용자의 버튼 조작 중 비밀 메뉴 조작법이 포함되어 있는지를 판단하는 회로를 추가하려 한다. 자판기에는 총 K개의 버튼이 있다.
각 버튼마다 1부터 K까지 번호가 붙어 있어서,
조작 과정은 1 이상 K 이하의 정수 여러 개로 나타낼 수 있다. 비밀 메뉴 조작법은 M개의 버튼 조작으로 이루어져 있으며, 이 순서대로 버튼을 누르면 반드시 비밀 메뉴 식권이 발매된다. 이때, 이 조작법 앞뒤로 다른 버튼 조작이 있어도 비밀 메뉴로 인정된다.
사용자가 누른 N개의 버튼 조작이 주어질 때, 사용자가 비밀 메뉴 식권을 받을 수 있는지를 확인하는 프로그램을 작성하여라.
제약조건
1 ≤ K ≤ 9 1 ≤ M ≤ 100 1 ≤ N ≤ 100
각 버튼의 번호는 1 이상 K 이하이다.
예제
입력예제 1
3 10 5
1 4 5
3 3 1 2 4 1 4 5 1 4
출력예제1
secret
입력예제2
4 10 3
2 1 3 2
1 3 2
1 3 2 1 3 2 1
출력예제2
secret
입력예제3
4 10 9
2 7 1 8
3 1 4 1 5 9 2 6 5 3
출력예제3
normal
입력예제4
4 3 5
1 2 3 4
3 2 1
출력예제4
normal
내 풀이
문자열 검색 문제계열이다.
사죵자가 누른 버튼 순서에서 비밀 메뉴 조작법이 순서대로 포함되어있는지 확인하기 위해 for문을 이용, 슬라이딩 윈도우 방식으로 하나씩 확인했다.
m, n, k = map(int, input().split()) secretCode = input() secretCode = secretCode.replace(" ", "") userInput = input() userInput = userInput.replace(" ", "") check = 0 try: for i in range((n-m+1)): code = userInput[i:i+m] print(code) if code == secretCode: check = 1 break finally: if check == 1: print('secret') else: print('normal')
나는 위와 같이 풀이를 진행했다. try 문으로 혹시 모를 에러에 대비했다, 이 경우 n이 m보다 작은 경우에 대비하였다.
GPT 풀이
풀이는 대체로 비슷하나 함수를 이용해서 우선 깔끔한 풀이였고, 두번째로 replace로 공백을 모두 제거한 나와 달리 list를 통해 문자열이 아닌 list로 변형하고 진행했다. 그 외에도 변수명이 좋았다.
# 입력 받기 M, N, K = map(int, input().split()) secret_menu = list(map(int, input().split())) user_input = list(map(int, input().split())) # 비밀 메뉴가 사용자 입력에 포함되어 있는지 확인 def is_secret_menu_included(secret_menu, user_input): m_len = len(secret_menu) n_len = len(user_input) if n_len < m_len: return False # 비밀 메뉴가 사용자 입력보다 길다면 포함될 수 없음 for i in range(n_len - m_len + 1): if user_input[i:i + m_len] == secret_menu: return True return False # 결과 출력 if is_secret_menu_included(secret_menu, user_input): print("secret") else: print("normal")
'개발 이야기 > 알고리즘 및 코테 준비' 카테고리의 다른 글
[Softeer][21년 재직자 예선] 회의실 예약 (1) 2024.09.09 [Softeer][21년 재직자 대회 예선] 전광판 문제 (0) 2024.09.04 [알고리즘 실습환경 구축] 알고리즘 튜토리얼 및 개요 (9) 2024.09.03 python 우선순위 que vs 힙 자료구조 (0) 2023.01.27 Python Counter와 Counter 사용 문제(백준 2108, 최빈값 찾기) (0) 2023.01.24