[Python] 숫자 뒤집기

nimoh·2023년 1월 2일

백준 2908번 문제를 푸는 중 숫자를 두 개 입력받아 뒤집은(reverse) 값이 큰 수를 출력하는 문제가 나왔다.

각 숫자를 list로 만들어 sorted(,reverse=True) 한 다음 다시 숫자로 만들려고 했으나 너무 번거로운 작업이었고, 이를 간단하게 줄일 수 있는 좋은 해결책을 발견했다.

a = int(input())
a = int(str(a)[::-1])

먼저 해결책이 무엇인지 대해 알아보고, 다시 다루겠다.

Extended Slice [ : : ]

[::] 는 Extended Slices라고 하며, [A:B:C] 인 경우 A 인덱스부터 B 인덱스까지 C 간격으로 새로운 배열을 만드는 것이다. 중요한 것은 A 인덱스는 포함되지만 B 인덱스는 포함되지 않는다. 즉 A 부터 B-1 인덱스까지이다.
-> 리스트[시작인덱스:(끝인덱스+1):간격]


간격이 양수일 경우

a = [1,2,3,4,5,6,7,8,9,10]
a = a[1:7:2]

위 코드는 a의 1번 인덱스(2)에서 6번(7) 인덱스까지 인덱스 2 간격으로 새로운 배열을 만든다. 2부터 7까지 인덱스 2씩 증가시켜보면 2, 4, 6이다. a를 출력해보면 역시 [2, 4, 6] 이다.

간격이 음수일 경우

이 방법은 특별하게 간격에 음수를 넣으면 list를 뒤집어 준다. 대신 설정한 인덱스 부분도 뒤집어 주어야 한다.

a = [1,2,3,4,5,6,7,8,9,10]
a = a[7:1:-2]
#[8, 6, 4]

뒤집지 않았을 때는 결과가 [2,4,6] 이었는데 뒤집으니 [8,4,2]가 됐다. 이유는 시작 인덱스와 끝 인덱스가 바뀌었기 때문이다. 뒤집기 전에는 1번 인덱스부터 6번인덱스(7-1) 이었지만 이를 뒤집은 위의 코드는
7번 인덱스부터 2번 인덱스(1+1)까지이다.

인덱스 없이 간격만 넣고 모두 출력하기

만일 시작 인덱스와 끝 인덱스가 설정되지 않은 [::1]과 같은 상태라면 간격만 맞추고 리스트의 전체를 포함시킨 새로운 리스트를 생성해준다.

a = [1,2,3,4]
a = a[::1]
b = a[::2]
# [1,2,3,4]
# [1,3]

간격이 음수일 경우 마찬가지로 모두 출력하되 리스트를 뒤집어 출력한다.

a = [1,2,3,4,5,6,7,8,9,10]
b = a[::-1]
c = a[::-2]
print(b) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
print(c) # [10, 8, 6, 4, 2]

본론으로 돌아가서..

a = int(input())
a = int(str(a)[::-1])

다시 보니 뭐 하는 코드인지 보이는가?
숫자 a를 문자열로 변경해주고, 역순으로 변경([::-1])한 다음 다시 int()로 감싸주어 문자열을 정수로 만든다. 그럼 뒤집힌 정수가 될 것이다.
여기서 의문이 들 수도 있다. 문자열은 리스트가 아닌데 어떻게 인덱스로 접근을 할 수 있을까? 문자열은 문자의 리스트이다. 여기서 문자라 함은 'a', 'b' 처럼 문자 하나 하나를 말한다. hello 문자열이 있다고 하면 사실 리스트(배열) ['h','e','l','l','o']가 메모리에 저장되는 것이다. 이렇게 되는 이유는 CS와 관련되어 있으므로 여기서 설명하자면 너무 길고 다른 포스트에서 다루어 보도록 하겠다.

profile
부족함을 인정하는 순간이 성장의 시작점이다.

0개의 댓글