[Python 문제풀이(CodeSignal) #3] 3번 문제

파이썬 문제풀이 / / 2020. 2. 3. 07:23

<이전글>

2020/01/18 - [파이썬 문제풀이] - [Python 문제풀이(CodeSignal) #2] 2번 문제

2020/01/13 - [파이썬 문제풀이] - [Python 문제풀이(CodeSignal) #1] 튜토리얼 & 1번 문제

2020/01/12 - [파이썬 문제풀이] - [Python 문제풀이(CodeSignal) #0] 회원가입

 

 

 

3번 문제

이번엔 3번 문제입니다.

 

문제 설명

"문자열을 고려하여, 그것이 팔레드롬인지 확인한다." -by 파파고

 

여기서 팔레드롬(palindrome)이 무엇일까요?

 

palindrome 이란 쉽게 말해 대칭인 문자를 뜻합니다.

한글로는 대표적인 예로 '토마토'나 '기러기'등이 있겠네요.

 

 

예를 보면 더 쉽게 이해가 갑니다.

 

어떤 문자열을 대입했을 때, 그것이 대칭인지 아닌지만 확인해 주면 되겠네요.

특이사항은 짝수일 때는 값이 거짓, 한 글자일 때는 참이다 정도가 있겠네요.

 

 

INPUT/OUTPUT 역시 마찬가지인 말들입니다.

 

그럼 이제 직접 함수를 제작해 봅시다.

 

파이썬 문법 설명

다른 풀이 방법들도 많겠지만 저의 풀이를 이해하기 위해서는

파이썬의 슬라이싱 기법과 여러 함수들의 개념을 알고 가야 합니다.

 

>> 간단한 설명과 예 (아래의 예 말고도 다양한 경우를 생각하여 직접 실행해 보세요!)

>> 슬라이싱

a = ["a", "b", "c", "d", "e"]

a[ 0 : 3 ] = ["a", "b", "c"]

a[ 1 : 2 ] = ["b"]

a[ 2 :  ] = ["c", "d", "e"]

a[  : 4 ] = ["a", "b", "c", "d"]

a[ : : 2 ] = ["a", "c", "e"]

a[ 2 : : 2 ] = ["c", "e"]

a[ : : 3 ] = ["a", "d"]

a[ : : -1 ] = ["e", "d", "c", "b", "a"]

a[ 3 : : -1 ] = ["d", "c", "b", "a"]

a[ 3 : 1 : -1 ] = ["d", "c"]



>> 함수

len()

괄호안의 문자열의 길이를 반환합니다.

len("hello") = 5



round()

괄호안의 수를 소숫점에서 반올림합니다.

round(3.1415, 2) = 3.14

round(3.1415, 0) = 3.0

round(3.1415, ) = round(3.1415) = 3

문제 풀이

만약 a = "aabbccbbaa" 일 때

그 절반인 "aabbc"부분 만을 가지고 오고 싶을 때는 어떻게 해야 할까요?

a[:5]을 하면 성공적으로 aabbc를 반환합니다.

하지만 a가 "aabbaa" 의 절반인 "aab"를 가지고 오고 싶을 때에는

a[:5]는 "aabba"를 가져오게 됩니다.

 

그렇다면 어떠한 문자열을 넣어도 그 절반을 반환하려면 어떻게 해야 할까요?

앞서 설명한 len함수를 사용하면 될 것입니다.

 

 a = "aabbaa" 일 때

a[:len(a)/2]를 하면 "aab"를 가져올까요?

실행해보면 위처럼 오류가 나게 됩니다.

 

그 이유는 파이썬에서 '/' 을 사용하여 무언가를 나누면

항상 소수점을 같이 반환하기 때문입니다.

#3 / 2 = 1.5

#10 / 2 = 5.0

 

슬라이싱은 [ : 2.0 ] 이나 [ 3.0 : ] 처럼 소수점이 들어가게 되면 오류가 걸리게 됩니다.

이를 해결하려면 어떻게 해야 할까요?

 

정답은 위 예에도 있습니다.

위처럼 round 함수에 두 번째 인자 값이 생략되면 소수점이 없어지게 됩니다.

다른 방법들도 많겠지만 이번에는 이 방법을 통해 소수점을 없애도록 하겠습니다.

 

문자열을 a = "aabbccbbaa"

로 잡은 상태로 반으로 나누었을 때의 뒷부분인 'cbbaa'를 뒤집어 'aabbc'로 바꾸려면 어떻게 해야 할까요?

 

위처럼 두 가지 방법이 나올 수 있습니다.

첫 번째 방법은 한 줄로 해결하는 방법으로

# a[ : round(len(a)/2) -1 : -1 ]

슬라이싱 기법을 완벽히 이해했을 때 이해되실 겁니다.

초심자분들은 많이 어려울 수 있죠.

(위 코드는 스스로 이해했을 때에 가치 있기 때문에 변숫값을 바꿔보며 직접 실행해 보세요!)

 

두 번째 방법은 첫 번째보다는 코드가 늘어나지만 더 가독성 있고 쉬운 방법입니다.

# b = a[ : : -1 ]

# b[ : 5 ]

바로 새로운 변수를 만들어 a의 값을 뒤집고 뒤집은 것의 앞에 부분을 출력하는 것입니다.

 

저는 첫 번째 방법을 사용하여 함수를 제작해 보겠습니다.

문제와 맞게 주어진 문자열의 앞부분과 뒷부분이 같으면 true,

다르면 false를 반환하는 함수를 만들어 봅시다.

 

저는 위와 같이 제작했습니다.

(파이썬에서 ture와 false의 첫 글자가 대 문자인 것을 잊지 마세요!)

 

이제 코드를 실행해 볼까요?

 

10개의 예제 중 7개만 성공했다고 나오네요.

 

위처럼 성공한 예제들도 있지만

 

실패한 예제들도 있네요.

 

성공한 예제와 실패한 예제의 차이점을 찾아보니

홀 수 일 때의 경우를 생각하지 못했습니다.

 

5의 절반인 2.5의 소수점이 사라져 2로 슬라이싱해버려 나타는 문제 같네요.

 

그럼 문자열이 홀수일 때만 if문으로 처리해 줍시다.

아까 제작한 함수는 짝수일 때만(문자열 길이의 나머지가 0일 때만) 실행되게 하고

홀수 일 때는 문자열의 길이에서 1을 빼주고(짝수로 만들고) 뒷부분의 길이도 조정을 한 함수입니다.

 

다시 테스트해 보겠습니다.

 

이번에는 10개의 예제 모두 성공했네요!

 

제출을 눌러 이번 문제도 완성해 봅시다.

 

이번 문제는 여기까지입니다.

 

다음은 4번 문제로 돌아오겠습니다!

 

 

 

dduckyee(떡이)의 티스토리

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기