백준

11478: 서로 다른 부분 문자열의 개수

rabbit-jun 2026. 3. 4. 15:53

링크:https://www.acmicpc.net/problem/11478

유튜브:https://youtu.be/ZtoOahFlmkI

 

틀린 정답

import os
reader = os.read(0,os.fstat(0).st_size)


def solve(reader):
    num = len(reader)
    result=[]
    for i in range(1,num+1):
        start=0
        end= i

        for _ in range(num):
            result.append(reader[start:end])
            if end ==num:
                break
            start +=1
            end +=1
    os.write(1,b'%d' %len(set(result)))
    return 0

solve(reader)

피드백

로컬(개인 컴퓨터) 테스트 환경에서는 엔터 키 입력 없이 딱 5글자만 들어가도록 깔끔하게 처리가 된 것 같습니다.

하지만 백준 서버의 채점 환경(리눅스) 에서는 이야기가 조금 다릅니다. 백준의 테스트 케이스 입력 파일들은 보통 맨 마지막에 줄바꿈 문자(\n)를 포함하고 있습니다.

 

따라서 백준 서버가 os.read로 입력 파일을 통째로 읽어올 때는 b'ababc'가 아니라 b'ababc\n'처럼 뒤에 특수 문자가 붙어서 들어오게 됩니다. (이 경우 길이는 6이 됩니다.)

 

결국 이 \n 문자까지 하나의 글자로 취급되어 b'c\n', b'bc\n' 같은 원치 않는 부분 문자열들이 만들어졌기 때문에 오답 판정을 받은 것입니다. 작성하신 이중 for문 로직 자체는 아주 정확합니다.

 


나의 정답(444ms)

import os
reader = os.read(0,os.fstat(0).st_size).rstrip()


def solve(reader):
    num = len(reader)
    result=[]
    for i in range(1,num+1):
        start=0
        end= i

        for _ in range(num):
            result.append(reader[start:end])
            if end ==num:
                break
            start +=1
            end +=1
    os.write(1,b'%d' %len(set(result)))
    os._exit(0)
    return 0

solve(reader)

 

 

 

 


 

반응형