본문 바로가기
I can do it on my own!/백준

[백준] 2908번 파이썬(Python)

by zivvon 2023. 5. 23.
목차 접기

문제

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

출력

첫째 줄에 상수의 대답을 출력한다.


'정답 코드'

a, b = input().split()

a_list = []
b_list = []

for i in a:
    a_list.append(i)

for i in b:
    b_list.append(i)
    
temp_a = a_list[2]
a_list[2] = a_list[0]
a_list[0] = temp_a

temp_b = b_list[2]
b_list[2] = b_list[0]
b_list[0] = temp_b

a = int(''.join(a_list))
b = int(''.join(b_list))

if a < b:
    print(b)
else:
    print(a)

하하.. 분명 문자열 정렬하는 함수가 있을텐데 모르겠어서 입력 받은 두 문자열을 각각 리스트에 알파벳 하나가 원소가 되게끔 넣어주었고, 세 자리 수이기 때문에 리스트의 첫 번째와 마지막 원소의 위치를 바꾸어 join() 함수로 공백 없이 문자열 하나로 합쳐주고 정수형으로 형변환 해주어 변수 a, b에 다시 할당했다.

 

사실 처음에는 리스트에 안 넣고 바로 문자열 인덱스의 값을 변경하려 했는데, 문자열은 특정 인덱스의 값을 변경 못 한다는 사실을 까맣게 잊고 있었다. 까먹지 말자!

 

그리고 join() 메소드 사용할 때도 구분자 없이 사용해서 런타임 에러(NameError)가 났었다.

join() 메소드의 구조는 '구분자.join(리스트)'임을 잊지말자!

 

'돌아보며'

a, b = input().split()

a = int(a[::-1])
b = int(b[::-1])

if a > b:
  print(a)
else:
  print(b)

위 코드를 보고 엄청난 현타가 왔다.

얼마 전에 슬라이싱 공부를 했는데 까맣게 잊어버리고 있었다.정렬은 무슨.. 슬라이싱이면 해결되는 문제였다.

 

🖍️ 다시 복기해보자..- 슬라이싱 : 리스트, 튜플, 문자열에 범위를 지정해 선택하여 객체들을 가져오는 방법 및 표기법~> 슬라이싱은 문자열에도 적용이 가능하기 때문에 따로 리스트를 만드는 수고를 안 해도 된다. 😱~> 형태 : a[start:end:step]~> 특정 시작위치부터 끝까지 : a[start : ]~> 시작점부터 특정위치까지 : a[ : end]~> 특정 위치부터 특정 위치까지 : a[start : end]~> step이 양수일 때 : 오른쪽으로 step만큼 이동하면서 가져옴ex) a = ['1', '2', '3']일 때 a[::2]의 output은 '13'~> step이 음수일 떄 : 왼쪽으로 step만큼 이동하면서 가져옴

ex) a = ['1', '2', '3']일 때 a[::-2]의 output은 '31'

~> 전체를 거꾸로 가져올 때 : a[::-1] (끝에서부터 왼쪽으로 1씩 이동하면서 가져오니까)

 

또한 한 가지 더 상기시키고 가자!

a, b = input().split()

a_list = []
b_list = []

for i in a:
    a_list.append(i)

for i in b:
    b_list.append(i)
    
a_list.reverse()
b_list.reverse()

a = int(''.join(a_list))
b = int(''.join(b_list))

if a < b:
    print(b)
else:
    print(a)

리스트를 사용할 거라면 reverse() 함수를 사용하자!

입력 받은 수가 세 자리 수여서 망정이지 10자리 수였으면 어쩔 뻔했나.. 있는 내장함수는 잘 써먹자!

 

이때 또 하나, sort(reverse=True)는 reverse가 아니라 단지 '내림차순'이다.

제발!! 역순 정렬과 내림차순 정렬은 다르니 잘 알고 쓰자.

또한 sorted() 메소드처럼 본체 리스트는 그대로고 정렬한 새로운 리스트를 반환하는 메소드면 모르겠는데, sort() 메소드나 reverse() 메소드는 본체의 리스트를 정렬하기 때문에 리스트에 대입하는 일은 절대 금지다. 에러 뜸!