본문 바로가기
👩🏻‍💻 Front-end/👾 Algorithm

백준 1032 - 명령 프롬프트 (Python)

by su-no 2022. 4. 23.

문제

시작 -> 실행 -> cmd를 쳐보자. 검정 화면이 눈에 보인다. 여기서 dir이라고 치면 그 디렉토리에 있는 서브디렉토리와 파일이 모두 나온다. 이때 원하는 파일을 찾으려면 다음과 같이 하면 된다.

dir *.exe라고 치면 확장자가 exe인 파일이 다 나온다. "dir 패턴"과 같이 치면 그 패턴에 맞는 파일만 검색 결과로 나온다. 예를 들어, dir a?b.exe라고 검색하면 파일명의 첫 번째 글자가 a이고, 세 번째 글자가 b이고, 확장자가 exe인 것이 모두 나온다. 이때 두 번째 문자는 아무거나 나와도 된다. 예를 들어, acb.exe, aab.exe, apb.exe가 나온다.

이 문제는 검색 결과가 먼저 주어졌을 때, 패턴으로 뭘 쳐야 그 결과가 나오는지를 출력하는 문제이다. 패턴에는 알파벳과 "." 그리고 "?"만 넣을 수 있다. 가능하면 ?을 적게 써야 한다. 그 디렉토리에는 검색 결과에 나온 파일만 있다고 가정하고, 파일 이름의 길이는 모두 같다.

입력

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은 알파벳 소문자와 '.' 로만 이루어져 있다.

출력

첫째 줄에 패턴을 출력하면 된다.

풀이

import sys

n = int(sys.stdin.readline())
files = [list(sys.stdin.readline().rstrip()) for _ in range(n)]

# 파일 이름의 길이 구하고 result 초기화
len = len(files[0])
result = files[0]

# 파일을 순환하면서 result와 i번째 글자가 다르면 '?'로 변환
for file in files:
    for i in range(len):
        if result[i] != file[i]:
            result[i] = '?'

# 리스트를 문자열로 바꿔 출력
print(''.join(result))

 

생각

백준 브론즈3부터 순차적으로 문제풀이를 진행하려고 했는데, 시간 대비 효율이 좋지 않을 거란 생각이 들었다.

내 목표는 실버1 정도 난이도이기 때문에.. 브론즈1을 유형별로 몇문제 풀고, 실버로 넘어가려고 한다.

그런데 생각보다 알고리즘보다는,, 자료구조와 파이썬 문법에서 계속 난관에 부딪히고 있다..ㅋㅋ

원래 구현문제가 그렇듯이 머리로는 알겠는데 이걸 어떻게 구현해야할지 해보다가 30분은 그냥 흘러가는 것 같다 ㅠ_ㅠ

아무튼!!! 고민할 시간에 뭐라도 해야겠다.

 

여기서 부족했던 것: 문제를 똑바로 안 읽었다.

문자열 길이는 다 똑같다고 했는데, 쓸데없이 최대 문자열 길이를 구하고, 짧은 애들은 공백으로 채우고...

그리고 str 자료형은 특정 index의 문자를 바로 치환할 수가 없는데, 굳이굳이 그걸 string()으로 해결해보려고 삽질했다.

간단하게 list 자료형으로 결과를 구하고, join()을 이용해서 다시 str로 출력하면 되는 거였다 ㅋㅋ

 

어쨌든 결론은 문제 똑바로 읽고, 쳐낼건 바로바로 쳐내자.

 

▼ 조잡했던 첫 풀이 코드

import sys

n = int(sys.stdin.readline())
files = [sys.stdin.readline().rstrip() for _ in range(n)]

# 입력된 문자열의 최대 길이 구하기
max_length = max(len(file) for file in files)

# 최대 길이 문자열 이외의 문자열 공백으로 채우기
for i in range(len(files)):
    files[i] = files[i].ljust(max_length)

# 문자열을 리스트로 바꾸기
for i in range(len(files)):
    files[i] = list(files[i])

# result를 첫번째 파일 이름으로 초기화
result = files[0]

# 파일 이름을 순서대로 돌면서, i번째 글자가 result와 다르면 그 자리에 '?' 넣기
for file in files:
    for i in range(len(file)):
        if file[i] == result[i]:
            continue
        else:
            result[i] = '?'

print(''.join(result))