[백준] 민균이의 비밀번호(Python)

규갓 God Gyu·2024년 7월 27일

백준

목록 보기
29/96

문제

창영이는 민균이의 컴퓨터를 해킹해 텍스트 파일 하나를 자신의 메일로 전송했다. 파일에는 단어가 한 줄에 하나씩 적혀있었고, 이 중 하나는 민균이가 온라인 저지에서 사용하는 비밀번호이다.

파일을 살펴보던 창영이는 모든 단어의 길이가 홀수라는 사실을 알아내었다. 그리고 언젠가 민균이가 이 목록에 대해서 얘기했던 것을 생각해냈다. 민균이의 비밀번호는 목록에 포함되어 있으며, 비밀번호를 뒤집어서 쓴 문자열도 포함되어 있다.

예를 들어, 민균이의 비밀번호가 "tulipan"인 경우에 목록에는 "napilut"도 존재해야 한다. 알 수 없는 이유에 의해 모두 비밀번호로 사용 가능하다고 한다.

민균이의 파일에 적혀있는 단어가 모두 주어졌을 때, 비밀번호의 길이와 가운데 글자를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 단어의 수 N (2 ≤ N ≤ 100)이 주어진다. 다음 N개 줄에는 파일에 적혀있는 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 소문자로만 이루어져 있으며, 길이는 2보다 크고 14보다 작은 홀수이다.

출력

첫째 줄에 비밀번호의 길이와 가운데 글자를 출력한다. 항상 답이 유일한 경우만 입력으로 주어진다.

예제 입력 1

4
las
god
psala
sal

예제 출력 1

3 a

입력 2

4
kisik
ptq
tttrp
tulipan

출력 2

5 s

최종 코드

# 뒤집어도 존재해야함
# 문자열 길이 / 가운데 글자 출력(홀수)나누기2+1 인덱스

import sys

N = int(sys.stdin.readline())
hacking_text_list = [sys.stdin.readline().strip() for _ in range(N)]

# reversed_hacking_text_list = hacking_text_list[::-1]
# print(hacking_text_list)
# for j in range(len(hacking_text_list)):
#   #문자열이 뒤집어도 있어야함
#   for k in range(len(hacking_text_list)):
#     if hacking_text_list[j] ==    reversed_hacking_text_list[k]:
#       password = hacking_text_list[i]
#       password_length = len(hacking_text_list[i])
#       password_middle_word = hacking_text_list[password_length//2]
#       print(password_length, password_middle_word)
#       break
# =============================================
# 뒤집은 수를 구하기 위해 뒤집은 수의 리스트를 만듬 = 불필요한 과정
# 그래서 예제 입력 출력이 잘못된 예시라고 판단함

# for j in range(N):
#   password = ''
#   for k in range(N):
#     if hacking_text_list[j][::-1] == hacking_text_list[k]:
#       password = hacking_text_list[k]

# def result():
#   password_len = len(password)
#   password_middle_word = password[password_len//2]
#   print(password_len, password_middle_word)
#   return
# result()
# ============================================
# for문을 너무 많이 사용해서 런타임 에러가 뜸

for word in hacking_text_list:
  if word[::-1] in hacking_text_list:
    password = word
    break
  
password_len = len(password)
password_middle_word = password[password_len//2]

print(password_len, password_middle_word)

풀이 과정

import sys

N = int(sys.stdin.readline())
hacking_text_list = [sys.stdin.readline().strip() for _ in range(N)]

일단 입력을 N으로 리스트 개수, hacking_text_list 변수 안에는 실제 한 줄씩 적힌 텍스트 목록을 하나의 리스트 안에 담았다
여기서 strip()을 사용하였기에 양옆 기준 공백이 있으면 다음 요소는 다음 줄에서 가져오는 방식으로 채택하였다.

# reversed_hacking_text_list = hacking_text_list[::-1]
# print(hacking_text_list)
# for j in range(len(hacking_text_list)):
#   #문자열이 뒤집어도 있어야함
#   for k in range(len(hacking_text_list)):
#     if hacking_text_list[j] ==    reversed_hacking_text_list[k]:
#       password = hacking_text_list[i]
#       password_length = len(hacking_text_list[i])
#       password_middle_word = hacking_text_list[password_length//2]
#       print(password_length, password_middle_word)
#       break
# =============================================
# 뒤집은 수를 구하기 위해 뒤집은 수의 리스트를 만듬 = 불필요한 과정
# 그래서 예제 입력 출력이 잘못된 예시라고 판단함
  • 첫번째 풀이 방법
  1. 일단 뒤집어도 비밀번호가 있어야하기에, [::-1]을 통해 문자열을 뒤집은 reversed_hacking_text_list 리스트를 선언해줬다.
  2. j로 for문 반복 시키면서 이중 for문을 작성했는데 hacking_text_list의 [j]가 reversed_hacking_text_list의 [k]가 일치하면 해당 값을 password에 담았고, 그렇게 password의 길이와 중간 단어까지 구해서 출력을 했었다. 그러나 for문을 두번이나 사용하지 않고도 풀수 있을 거라 생각하였고, 굳이 뒤집은 문자열 리스트도 필요 없다 판단하였다. 왜냐면 입력예제2를 보면 kisik가 뒤집어도 kisik인데 예제 1번처럼 las, sal 나누어서 나오지 않아서 예시 자체가 잘못되었다 판단하였기 때문이다. 이건 그냥 집중도 이슈
# for j in range(N):
#   password = ''
#   for k in range(N):
#     if hacking_text_list[j][::-1] == hacking_text_list[k]:
#       password = hacking_text_list[k]

# def result():
#   password_len = len(password)
#   password_middle_word = password[password_len//2]
#   print(password_len, password_middle_word)
#   return
# result()
# ============================================
# for문을 너무 많이 사용해서 런타임 에러가 뜸
  • 두번째 풀이방법
    for문을 두번 사용해서 뒤집은 문자열이 hacking_text_list안에 있다면 password에 값을 담아줬다. 뒤집은 문자열 리스트를 구현하지 않고 풀었던 방법인데, for문을 너무 많이 사용해서인지 어디선가 에러가 발생되는 코드였다.
    그래서 for문을 한번 사용하는 코드로 고민해보았다.
for word in hacking_text_list:
  if word[::-1] in hacking_text_list:
    password = word
    break
  
password_len = len(password)
password_middle_word = password[password_len//2]

print(password_len, password_middle_word)
  • 세번째 풀이방법
    여기서 for문을 한번만 실행하며 if조건문으로 뒤집은 문자열이 존재하면 password안에 담고 break를 사용해서 for문을 강제 종료 시켰다.
    그렇게 하니까 정상적으로 풀게된 문제였던 것 같다. 처음부터 너무 복잡하게 생각말고 내가 풀었던 고민의 흔적을 기록해놓으니까 좀 더 문제 풀이가 명확해지는 효과가 있는 것 같다 ㅎㅎ
profile
웹 개발자 되고 시포용

0개의 댓글