(Python) 알고리즘문제 D+2

Kepler·2020년 2월 11일
0

알고리즘

목록 보기
2/8

문제

reverse 함수에 정수인 숫자를 인자로 받습니다. 그 숫자를 뒤집어서 return해주세요.

x: 숫자
return: 뒤집어진 숫자를 반환!

예를 들어,
x: 1234
return: 4321

x: -1234
return: -4321

x: 1230
return: 321

해답_1 (my solution)

 def reverse(x):
  str_x = str(x)

  if str_x[0] == '-':
    if str_x[-1] == 0:
      y = int('-'+ str_x[-2:0:-1])
      return str(y)
    else:
      y = int('-'+str_x[-1:0:-1])
      return str(y)

  elif str_x[-1] == 0:
      y = int(str_x[-2::-1])
      return str(y)

  else:
    y = int(str_x[::-1])
    return str(y)
  • integer는 iterable이 아니므로, slice를 사용할수 없기에, 먼저 iterable한 객체인 string으로 바꾸어 주었다. (하지만 해답은 처음부터 string을 인자로 받으므로 바꿀 필요가 없었다..)
  • 4가지 케이스를 가정하여 if/else 코드로 작성해보았다.
    • 음수의 경우 : '-'을 concatenate하여 처음에 붙여주었다.
      • 0으로 끝날때 : slice시, -2부터 카운트.
      • 0으로 끝나지 않을때 : 변수길이만큼 역으로 slice.
    • 양수의 경우
      • 0으로 끝날때 : slice시, -2부터 카운트.
      • 0으로 끝나지 않을때: 변수길이만큼 역으로 slice

해답_2 (model solution)

# -3820
## 3820

def reverse(string):
	if string[0] == '-':
		string = string[::-1]                    # 0283-
		new_string = int(string[-1]+string[:-1]) # -283 정수
		return str(new_string)                   # -283 문자열
	string = int(string[::-1])     ##  283 정수
	return str(string)             ##  283 	문자열
  • string을 받는다고 처음부터 가정.
  • 음수일때:
    • reverse한 결과를 string으로 변수 선언.
    • new_string은 string의 마지막인덱스 + string 처음 요소부터 -2까지 가져옴.
    • 0을 제거하기위해 문자열을 정수로 한번 변환
    • 마지막 return에서 다시 문자열로 변환
  • 양수일때: reverse한 결과를 정수로 바꾼 후 다시 문자열로return함

개념정리 : slice

list, tuple, string, set, dictionary와 같은 sequence 자료형에는 slice기능을 자주 사용한다. slice는 말 그대로 무언가를 잘라낸다는 뜻으로, sequence 객체의 일부를 잘라내는것을 의미한다.

시퀀스객체[시작인덱스:끝인덱스]

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[0:4]     # 인덱스 0부터 3까지 잘라서 새 리스트를 만듦
[0, 10, 20, 30]

이 때 주의할 점은, 끝 인덱스는 가져오려는 범위에 포함되지 않는다는 점이다.
역으로 slice 할때도 이는 적용된다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[-1:-5:-1]     # 인덱스 0부터 3까지 잘라서 새 리스트를 만듦
[90, 80, 70, 60]

따라서, 처음부터 끝까지 가져오려면, 1을 더 크게 지정해야한다. 참고로, 끝 인덱스가 3이라고 하더라도 4를 지정해도 오류가 나지 않는다.

다음과 같은 방법으로 시작인덱스 자신을 리턴할 수 있다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[1:1]    # 인덱스 1부터 0까지 잘라서 새 리스트를 만듦
[]            # 해당 인덱스가 없으므로 빈 리스트 리턴
>>> a[1:2]    # 인덱스 1부터 1까지 잘라서 새 리스트를 만듦
[10]          # 인덱스 1을 리턴

양수 인덱스와 음수 인덱스를 섞어서 사용도 가능하다.

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[4:-1]    # 인덱스 4부터 -2까지 요소 5개를 가져옴
[40, 50, 60, 70, 80]

시퀀스객체[시작인덱스:끝인덱스:인덱스증가폭]

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[2:8:3]    # 인덱스 2부터 3씩 증가시키면서 인덱스 7까지 가져옴
[20, 50]

시퀀스객체[:끝인덱스] or 시퀀스객체[시작인덱스:]

시작 또는 끝 인덱스를 생략할 수 있다. 이 방법은 길이를 몰라도 되기 때문에 유용하다.

>>> a[7:]    # 인덱스 7부터 마지막 요소까지 가져옴
[70, 80, 90]

시퀀스객체[:], 시퀀스객체[::]

시작과 끝 둘다 생략하면 전체리스트를 가져오게 된다.

>>> a[:]     # 리스트 전체를 가져옴
[0, 10, 20, 30, 40, 50, 60, 70, 80, 90]

시퀀스객체[:끝인덱스:증가폭]

>>> a = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
>>> a[:7:2]    # 리스트의 처음부터 인덱스를 2씩 증가시키면서 인덱스 6까지 가져옴
[0, 20, 40, 60]

시퀀스객체[시작인덱스::증가폭]

끝인덱스를 지정하지 않을 경우 마지막 객체도 포함되는 점을 잊지말자.

>>> a[7::2]    # 인덱스 7부터 2씩 증가시키면서 리스트의 마지막 요소까지 가져옴
[70, 90]

>>>a[7:-1:2]
[70]

시퀀스객체[::증가폭]

전체 객체에서 증가폭 만큼 slice할때 사용한다.

>>> a[::2]     # 리스트 전체에서 인덱스 0부터 2씩 증가시키면서 요소를 가져옴
[0, 20, 40, 60, 80]

증가폭을 음수로 지정할때

인덱스가 감소하므로 끝 인덱스보다 시작 인덱스를 더 크게 지정해야 한다. 즉, a[5:-1:-1] 과같이는 지정할 수 없다.

특히 다음과 같이 시작 인덱스와 끝 인덱스를 생략하면서 인덱스 증가폭을 -1로 지정하면, 리스트가 반대로 뒤집힌다.

>>> a[::-1]
[90, 80, 70, 60, 50, 40, 30, 20, 10, 0]
profile
🔰

0개의 댓글