코딩테스트/SWEA

[Python, 파이썬] SWEA 3809. 화섭이의 정수 나열

알코딩 2024. 11. 10. 13:52

주어진 정수열로 만들 수 없으면서 가장 작은 정수를 구하는 문제.

예) 위와 같은 정수가 주어질 때, 주어진 문자열로 만들 수 없는 가장 작은 수는 12!

 

 

def find(A):

    number = ''.join(A) # 문자열로 변환

    for i in range(int(number)): # number 수만큼 반복
        if(str(i) not in number): # number 안에 없으면
            return i # 없는 수 return

T = int(input()) # 테스트케이스의 개수 T

for test_case in range(1, T+1):

    N = int(input()) # 숫자 N

    A = [] # 정수 N개

    # 주어진 개수 만큼 입력 받음
    while len(A) < N:
        A.extend(input().split())

    answer = find(A) # 없는 수 찾기
    print("#%d %d" %(test_case, answer)) # 정답 출력  
 

 

 

[문제풀이]


 

처음엔 이 문제, 입력부터 난관이였다.

3 6 7 5 3 5 6 2 9 1 2 7 0 9 3 6 0 6 2 6
1 8 7 9 2 0 2 3 7 5 9 2 2 8 9 7 3 6 1 2
9 3 1 9 4 7 8 4 5 0 3 6 1 0 6 3 2 0 6 1
5 5 4 7 6 5 6 9 3 7 4 5 2 5 4 7 4 4 3 0
7 8 6 8 8 4 3 1 4 9 2 0 6 8 9 2 6 6 4 9
 

입력의 for문을 돌리는 숫자가 정해진 게 아니라 줄바꿈 문자로 구분되어 있고, 그걸 정해진 개수가 입력받을 때까지 계속 입력받아야 한다.

while len(A) < N:
        A.extend(input().split())
 

그래서 이렇게 N의 개수가 될때까지 계속 while문을 돌려 입력받게 하였다.

그 후 주어진 문자열에서 연속된 부분으로 만들 수 없는 가장 작은 수를 찾았다.

 

처음엔 set으로 모든 조합을 찾는 걸로 하였지만 이건 시간초과가 난다....

시간 복잡도 내론 충분히 가능할 거 같았는데, 왜인진 모르겠다.

for i in range(int(number)): # number 수만큼 반복
        if(str(i) not in number): # number 안에 없으면
            return i # 없는 수 return
 

그래서 다른 분 코드를 좀 참고하여, for문을 돌려 문자열에서 포함 여부를 확인하는 in 메소드를 사용해 있으면 그 수를 return하는 방식으로 찾았다.