티스토리 뷰

- 오늘의 학습 키워드 : 백준 1032(명령프롬프트) 문자열 비교

N = int(input())
if N <= 50: # 입력의 조건
    my_input = [ input() for _ in range(N)]

    len_list = len(set(list(map(lambda x : len(x), my_input)))) # 모든 문자열의 길이가 같은지 확인
    if len_list == 1:
        str_len = len(my_input[0])

        result_list = []
        for i in range(str_len):
            tmp = list(map(lambda x: x[i], my_input)) # 배열의 각 요소의 i번째를 추출
            if len(set(tmp)) == 1: # set()으로 중복을 없앤 후 길이가 1이면 모두 같다는 의미
                result_list.append(tmp[0]) # 결과 리스트에 추가
            else:
                result_list.append('?') # 같지 않은 경우 '?' 추가
        result = ''.join(result_list) # 문자열 join
        print(result)

- 오늘의 회고:
문자열 문제였고, 배열에 있는 문자열을 비교하여 정규표현식을 추측하는 문제였다.

처음에는 for문으로 해결하려다가 모든 문자열의 길이가 동일하기 때문에 map, lamba를 사용하여 각 자릿수의 문자열을 추출하여 같은 문자라면 set으로 하나밖에 나오지 않는 것을 활용하였다.

기초적인 것부터 하나씩 복습하는 마음으로 실천 중이다.

다른 사람들 문제를 보니 for문을 사용했던데 어떤게 효율적인 걸까?

ChatGPT를 참고한 결과, 내 코드의 경우 반복문마다 새로운 리스트를 만드는 게 비효율적이었다.

  • 시간복잡도 비교

둘 다 결국 모든 문자 위치에 대해 비교를 하므로:

  • 시간복잡도: O(N × L) (N: 문자열 개수, L: 문자열 길이)

하지만 구현의 차이로 인해:

  • 당신의 코드는 매 i마다 새로운 리스트(tmp)를 생성하므로 약간의 오버헤드 있음.
  • 다른 사람들의 코드는 한 리스트를 in-place로 수정하므로 메모리 및 속도 측면에서 더 효율적.

📌 결론

기준 당신의 코드 다른 사람 코드
시간복잡도 O(NL) O(NL)
메모리 사용 더 많음 (tmp 리스트) 더 적음 (in-place 수정)
가독성 함수형 스타일, 약간 어려울 수 있음 직관적, 읽기 쉬움
효율성 보통 더 효율적

실전 코딩 테스트에서는 두 번째 방식이 더 적합합니다.빠르고 간결하며, 면접이나 온라인 테스트에서 오해 없이 동작을 전달하기 좋기 때문입니다.

개선한 코드

N = int(input())
files = [input() for _ in range(N)]

# 파일 이름의 길이는 모두 같다고 보장됨
file_len = len(files[0])
pattern = []

for i in range(file_len):
    char = files[0][i]
    for j in range(1, N):
        if files[j][i] != char:
            char = '?'
            break
    pattern.append(char)

print(''.join(pattern))

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함