공부하기/백준

[Python] 백준 풀기 1032 - 명령 프롬프트

XEV 2023. 2. 11. 23:06

파이썬 백준 1032번

브론즈 1

https://www.acmicpc.net/problem/1032

 

1032번: 명령 프롬프트

첫째 줄에 파일 이름의 개수 N이 주어진다. 둘째 줄부터 N개의 줄에는 파일 이름이 주어진다. N은 50보다 작거나 같은 자연수이고 파일 이름의 길이는 모두 같고 길이는 최대 50이다. 파일이름은

www.acmicpc.net

 

 

 

 

 

문제 보기

분류: 구현, 문자열

 

 

 

 

 

문제 풀기

출력된 결과들의 알파벳을 나누어 2 차원 리스트에 저장을 하고 세로로 모두 같은 문자인지 판단을 한다.

이때 for loop 을 이용하는 방법 보다는 column 형태로 새롭게 묶어고 함수 set() 을 통해 중복 제거를 통해 판단하기로 하였다. 2 차원 리스트를 column 으로 새롭게 묶는게 문제였는데 검색을 통해 zip() 함수를 찾게 되었다. 정말 정말 유용하게 사용할 것 같다.

 column 의 요소들을 튜플 형태로 새롭게 묶고 set() 을 이용하여 중복을 제거한다. 이때, 중복된 결과를 모두 제거하고 남은 원소의 개수가 1 이면 그 column 의 원소들은 모두 같음을 말한다.

이를 통해 command 의 각 자리에 누적해 나가면서 알파벳을 추가할지 "?" 를 추가할지 판단할 수 있다.

 

 

 

 

 

코드 보기

import sys
inputdata = sys.stdin.readline


def fnFindCommand():
    character_ls = list(zip(*file_ls)) # 2 차원 리스트에서 세로방향의 요소들을 다시 묶음. (같은 알파벳인지 아닌지 확인하기 위한.)
    print(character_ls) ## TEST PRINT
    
    command_str = "" # 찾고자 하는 명령어를 집어 넣을 빈 공간 생성.
    for ch in character_ls: # 동일한 순서 위치에 있는 알파벳끼리 묶여진 리스트를 하나씩 뽑음.
        if len(set(ch)) == 1: # 중복되는 문자를 set() 으로 없애고 그 길이가 1 이면 모두 같은 문자.
            command_str += ch[0] # 그 때의 문자를 순차적으로 합침.
        else: # len(set(ch)) == 1 이 아니라면 2 개 이상의 다른 문자가 섞여 있음.
            command_str += "?" # 서로 다른 문자가 존재하면 "?" 를 합침.
    
    return command_str


if __name__ == "__main__":
    files = int(inputdata().strip())
    file_ls = [list(map(str, inputdata().strip())) for _ in range (files)]
    print(file_ls) ## TEST PRINT
    
    result = fnFindCommand()
    print(result)