← 실전 문제

이웃 숫자를 피하는 코드

Python완성형

서로 다른 숫자 digits를 각각 한 번씩 사용해 한 개의 코드를 만들어요. 첫 자리는 0이 아니어야 하고, 이웃한 두 숫자의 차이의 절댓값이 1이면 안 돼요. 가능한 코드 중 왼쪽부터 비교했을 때 가장 작은 숫자 순서를 반환해요. 가능한 코드가 없으면 [-1]을 반환해요.

solution(digits)를 작성해 주세요. 예를 들어 [2,0,3]에서는 [2,0,3]과 [3,0,2]가 가능하며 앞의 코드가 더 작아요.

매개변수와 반환값

  • digits의 길이 n은 17, 항목은 09이고 서로 달라요.
  • 결과는 정수 자체가 아닌 숫자들을 담은 리스트예요. 길이 1에서는 이웃 조건이 없지만 첫 자리 조건은 적용해요.
  • 가능한 순서가 없으면 길이 1인 [-1]을 반환해요.

예시

  1. digits = [2, 0, 3]이면 결과는 [2, 0, 3]이에요.
  2. digits = [1, 2]이면 결과는 [-1]이에요.

실행용 입출력

첫 줄에 n, 둘째 줄에 숫자 n개를 입력해요. 반환 리스트를 한 줄에 출력해요.

예시 입력

3
2 0 3

예상 결과

2 0 3

예시 입력

2
1 2

예상 결과

-1
핵심 개념
  • brute-force: n이 최대 7이라 모든 순서를 확인하는 방법도 가능해요. 만들어 가는 도중 이웃 조건을 어기면 그 경로를 더 만들 필요가 없어요.
  • array-1d: 결과 리스트를 왼쪽부터 비교해요. sorted(digits)는 정렬된 새 리스트를 반환하고, .append·.pop은 경로의 마지막 항목을 추가·제거해요.
  • conditionals: abs(a - b)는 차이의 절댓값이에요. 첫 자리 조건과 이웃 조건을 따로 확인해요.

재귀는 작은 부분 순서를 만든 뒤 같은 함수를 다시 호출하는 방식이에요. 재귀에서 돌아오면 방문 표시와 경로를 되돌려야 다음 후보를 확인할 수 있어요. path[:]는 현재 경로를 복사해 이후 변경과 분리해요. None은 결과가 없음을 나타내는 별도 값이에요.

path[-1]은 마지막 항목이에요. if path는 경로에 항목이 있으면, not path는 비어 있으면 참이에요. continue는 이번 후보를 건너뛰어요. found is None은 결과가 없는지를 확인하며 is not None은 결과가 있음을 뜻해요.

solution 안에 search()라는 재귀 함수를 둘 수 있어요. 경로 리스트를 path, 사용 표시를 used라고 두면 이 내부 함수는 바깥의 두 리스트를 함께 읽고 바꿔요. 후보를 추가하고 재귀로 나머지를 확인한 뒤, 돌아오면 마지막 항목과 방문 표시를 되돌려 다음 후보와 상태를 분리해요. 모든 숫자를 썼으면 path[:] 복사본을 반환하고, 더 만들 수 없는 경로는 None을 반환해요. 후보를 작은 숫자부터 확인하므로 처음 완성된 유효 경로가 왼쪽부터 비교한 가장 작은 결과예요.

입력 하네스의 input()은 한 줄의 문자열을 읽고, .split()은 공백으로 항목을 나눠요. map(int, ...)는 각 항목을 정수로 바꾸고 list(...)는 그 결과를 리스트로 모아요. range(n)은 0부터 n-1까지 반복해요. 하네스는 함수 호출을 위한 자체 연결이며 풀이의 반환 계약과 구분해요.

코드 작성과 채점은 로그인 후 이용해요

로그인하고 풀기