728x90
 
 

위 그림과 같이 1부터 8까지 여덟 개의 숫자를 포함하는 하나의 리스트가 있습니다.

파이썬에서는 아래와 같이 start, stop, step 세 개의 숫자를 사용해서 리스트를 다양하게 슬라이싱할 수 있습니다.

 
 
  • start를 입력하지 않으면 0을 입력한 것과 같습니다.
  • stop을 입력하지 않으면 리스트의 길이 (len(my_list))를 입력한 것과 같습니다.
  • step을 입력하지 않으면 1을 입력한 것과 같습니다.
1) 시작, 끝 지점 사용하기
 
 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[3:])
print(my_list[:5])
print(my_list[2:6])
[4, 5, 6, 7, 8]
[1, 2, 3, 4, 5]
[3, 4, 5, 6]

my_list[3:]은 리스트의 인덱스 3의 위치에서 끝까지 슬라이싱합니다.

앞에서 3개의 성분을 제외하는 것과 같습니다.

my_list[:5]은 리스트의 처음부터 인덱스 5의 위치까지 슬라이싱합니다.

앞에서 5개의 성분을 선택하는 것과 같습니다.

my_list[2:6]은 리스트의 인덱스 2의 위치에서 인덱스 6의 위치까지 슬라이싱합니다.

앞에서 6개를 선택하고 2개를 제외하는 것과 같습니다.

 
 
 

2) 음의 인덱스 사용하기

 
 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[:-2])
print(my_list[-4:])
print(my_list[-5:-2])
[1, 2, 3, 4, 5, 6]
[5, 6, 7, 8]
[4, 5, 6]

my_list[:-2]은 리스트의 처음부터 인덱스 -2의 위치까지 슬라이싱합니다.

뒤에서 2개의 성분을 제외하는 것과 같습니다.

my_list[-4:]은 리스트의 인덱스 -4의 위치에서 끝까지 슬라이싱합니다.

뒤에서 4개의 성분을 선택하는 것과 같습니다.

my_list[-5:-2]은 리스트의 인덱스 -5의 위치에서 인덱스 -2의 위치까지 슬라이싱합니다.

뒤에서 5개를 선택하고 2개를 제외하는 것과 같습니다.

 
 
 

3) 리스트 복사하기

 
 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[:])
[1, 2, 3, 4, 5, 6, 7, 8]

my_list[:]은 리스트의 처음부터 끝까지 슬라이싱합니다.

리스트 전체를 복사하는 것과 같으며, 얕은 복사 (Shallow copy)에 해당합니다.

 
 
 

4) 간격 (step) 사용하기

 

 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[::2])
print(my_list[::3])
[1, 3, 5, 7]
[1, 4, 7]

my_list[::2]은 리스트의 처음부터 끝까지 간격 2 단위로 슬라이싱합니다.

my_list[::3]은 리스트의 처음부터 끝까지 간격 3 단위로 슬라이싱합니다.

 
 
 

5) 시작 (start)/끝 (stop)/간격 (step) 사용하기

 
 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[1::2])
print(my_list[1::3])
print(my_list[2:6:2])
[2, 4, 6, 8]
[2, 5, 8]
[3, 5]

my_list[1::2]은 리스트의 인덱스 1의 위치에서 끝까지 간격 2 단위로 슬라이싱합니다.

my_list[1::3]은 리스트의 인덱스 1의 위치에서 끝까지 간격 3 단위로 슬라이싱합니다.

my_list[2:6:2]은 리스트의 인덱스 2의 위치에서 인덱스 6의 위치까지 간격 2 단위로 슬라이싱합니다.

 
 
 

6) 음의 간격 (step) 사용하기

 
 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[::-1])
print(my_list[::-2])
print(my_list[::-3])
[8, 7, 6, 5, 4, 3, 2, 1]
[8, 6, 4, 2]
[8, 5, 2]

my_list[::-1]은 리스트의 처음부터 끝까지 간격 -1 단위로 슬라이싱합니다.

뒤집어진 리스트 전체를 복사하는 것과 같습니다.

마찬가지로 my_list[::-2]은 리스트의 처음부터 끝까지 간격 -2 단위로 슬라이싱합니다.

my_list[::-3]은 리스트의 처음부터 끝까지 간격 -3 단위로 슬라이싱합니다.

 

전체 내용은 아래 그림을 참고하세요.

 
 
728x90
728x90

문제

정수가 담긴 배열 numbers와 문자열 direction가 매개변수로 주어집니다. 배열 numbers의 원소를 direction방향으로 한 칸씩 회전시킨 배열을 return하도록 solution 함수를 완성해주세요.

<풀이>

def solution(numbers, direction):
    return [numbers[-1]] + numbers[:-1] if direction == 'right' else numbers[1:] + [numbers[0]]

 

1) 시작, 끝 지점 사용하기

 
 
예제
my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[3:])
print(my_list[:5])
print(my_list[2:6])
[4, 5, 6, 7, 8]
[1, 2, 3, 4, 5]
[3, 4, 5, 6]

my_list[3:]은 리스트의 인덱스 3의 위치에서 끝까지 슬라이싱합니다.

앞에서 3개의 성분을 제외하는 것과 같습니다.

my_list[:5]은 리스트의 처음부터 인덱스 5의 위치까지 슬라이싱합니다.

앞에서 5개의 성분을 선택하는 것과 같습니다.

my_list[2:6]은 리스트의 인덱스 2의 위치에서 인덱스 6의 위치까지 슬라이싱합니다.

앞에서 6개를 선택하고 2개를 제외하는 것과 같습니다.

 
 
 

2) 음의 인덱스 사용하기

예제
my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[:-2])
print(my_list[-4:])
print(my_list[-5:-2])
[1, 2, 3, 4, 5, 6]
[5, 6, 7, 8]
[4, 5, 6]

my_list[:-2]은 리스트의 처음부터 인덱스 -2의 위치까지 슬라이싱합니다.

뒤에서 2개의 성분을 제외하는 것과 같습니다.

my_list[-4:]은 리스트의 인덱스 -4의 위치에서 끝까지 슬라이싱합니다.

뒤에서 4개의 성분을 선택하는 것과 같습니다.

my_list[-5:-2]은 리스트의 인덱스 -5의 위치에서 인덱스 -2의 위치까지 슬라이싱합니다.

뒤에서 5개를 선택하고 2개를 제외하는 것과 같습니다.

 
 
 

3) 리스트 복사하기

예제
my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[:])
[1, 2, 3, 4, 5, 6, 7, 8]

my_list[:]은 리스트의 처음부터 끝까지 슬라이싱합니다.

리스트 전체를 복사하는 것과 같으며, 얕은 복사 (Shallow copy)에 해당합니다.

 
 
 

4) 간격 (step) 사용하기

 
 
예제
my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[::2])
print(my_list[::3])
[1, 3, 5, 7]
[1, 4, 7]

my_list[::2]은 리스트의 처음부터 끝까지 간격 2 단위로 슬라이싱합니다.

my_list[::3]은 리스트의 처음부터 끝까지 간격 3 단위로 슬라이싱합니다.

 
 
 

5) 시작 (start)/끝 (stop)/간격 (step) 사용하기

 

예제

my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[1::2])
print(my_list[1::3])
print(my_list[2:6:2])
[2, 4, 6, 8]
[2, 5, 8]
[3, 5]

my_list[1::2]은 리스트의 인덱스 1의 위치에서 끝까지 간격 2 단위로 슬라이싱합니다.

my_list[1::3]은 리스트의 인덱스 1의 위치에서 끝까지 간격 3 단위로 슬라이싱합니다.

my_list[2:6:2]은 리스트의 인덱스 2의 위치에서 인덱스 6의 위치까지 간격 2 단위로 슬라이싱합니다.

 
 
 

6) 음의 간격 (step) 사용하기

 
 
예제
my_list = [1, 2, 3, 4, 5, 6, 7, 8]

print(my_list[::-1])
print(my_list[::-2])
print(my_list[::-3])
[8, 7, 6, 5, 4, 3, 2, 1]
[8, 6, 4, 2]
[8, 5, 2]

my_list[::-1]은 리스트의 처음부터 끝까지 간격 -1 단위로 슬라이싱합니다.

뒤집어진 리스트 전체를 복사하는 것과 같습니다.

마찬가지로 my_list[::-2]은 리스트의 처음부터 끝까지 간격 -2 단위로 슬라이싱합니다.

my_list[::-3]은 리스트의 처음부터 끝까지 간격 -3 단위로 슬라이싱합니다.

 

728x90
728x90

파이썬 코딩 테스트에서 자주 사용되는 데큐(deque)에 대해 알아보자.

 


deque()

  • Stack이나 queue처럼 한 방향에서 삽입과 삭제가 일어나는게 아니라 양방향에서 삽입과 삭제가 일어나는 자료구조이다.
  • 리스트의 양쪽 끝에서 삽입과 삭제를 모두 허용하는 자료의 구조. 이것은 스택과 큐의 자료 구조를 복합한 형태이다.
  • 파이썬에서 list를 사용하는 것과 유사하지만 deque를 사용하는 이유는 시간복잡도 때문이다.

 

  • 리스트에서 0번 인덱스를 삭제한다고 생각해보자. 이때 리스트 내부에서는 0번 인덱스를 제거하고 끝이 아니라 뒤에있는 원소들을 앞으로 하나씩 당겨주는 연산을 더 수행하게된다. 따라서 list의 삭제연산은 O(n)이 걸리는데 반면 deque의 삭제연산은 O(1)이다. 따라서 push, pop이 빈번한 알고리즘의 경우 list보다 deque를 사용하는 것이 효율적이다.

 
 
from collections import deque

데큐는 위와 같이 불러올 수 있다.


deque를 사용하면 얻는 장점

  • 엄격한 리스트를 만들 수 있다.
  • 속도가 리스트에 비해 굉장히 빠르다. List = O(n), deque = O(1)
  • 당연하지만 큐작업이 훨씬 편해진다.

1. 큐(QUEUE)에 대한 이해.

큐는 기본적으로 선입 선출 (FIFO : First In First Out)구조이다.

 

예시로는 다음이 있다.

  • 프린터기 : 프린터기는 먼저 인쇄를 누른 것부터 차례대로 작동한다.
  • 은행 대기표 : 은행에서는 먼저 대기표를 뽑은 사람부터 차례대로 서비스를 진행한다.

 

deque 함수는 큐에 제한되어 있는 선입선출 제한을 풀어서, 더 여러곳에 사용할 수 있도록 한 함수이다.


2. deque 사용하기

from collections import deque
data = [1, 2, 3, 4, 5]
d = deque(data)
print(d)

#출력
deque([1, 2, 3, 4, 5])

 

데큐의 함수 목록은 다음과 같다.

 

함수 목록:

  • append
  • appendleft
  • clear
  • copy
  • count
  • extend
  • extendleft
  • index
  • insert
  • maxlen
  • pop
  • popleft
  • remove
  • reverse
  • rotate

 

여기서 눈여겨 볼 함수는 다음과 같다.

  • appendleft : 왼쪽에 개체를 추가
  • extendleft : 왼쪽에 리스트를 연장
  • maxlen : 큐의 길이를 반환
  • popleft : 큐의 맨 왼쪽에 있는 개체를 반환
  • rotate : 큐를 회전

여기서 로테이트는 처음 접하면 생소할 것이다. 

 

그래서 간단한 예시 2개를 들어보자.

#1
 
d = deque([1, 2, 3, 4, 5])
print(d)
d.rotate(2)
print(d)
d.rotate(-2)
print(d)

#출력
deque([1, 2, 3, 4, 5])
deque([4, 5, 1, 2, 3])
deque([1, 2, 3, 4, 5])

큐 [1 ,2 ,3 ,4 ,5]가 오른쪽에서 왼쪽 방향으로 2 회전하여 [4, 5, 1, 2, 3]이 되었다.

이번에는 반대로 -2로 회전하여  [1 ,2 ,3 ,4 ,5]가 되었다.

 

#2

 from collections import deque
 test = [1, 2, 3, 4, 5, 6, 7, 8, 9]
 test = deque(test)
 test.rotate(2) 
 result = list(test)
 result
[8, 9, 1, 2, 3, 4, 5, 6, 7]

 

 

 

파이썬 알고리즘을 풀다보면 리스트를 회전하는 문제에 많이 직면하게 된다.

이는 python collection 모듈의 deque 자료형을 사용하면된다.

함수안에 음수 를 넣게 된다면 왼쪽회전 양수는 오른쪽회전이다.

728x90
728x90

삼항 연산자 (삼항 표현식)

 

if-else 조건식을 한 줄로 간결하게 표현할 수 있다. 코드를 줄이는데 용이하게 사용할 수 있지만 조건식이 복잡한 경우에는 가독성을 떨어뜨릴 수 있니 적절한 경우에 사용하는 것이 좋다. 이번 포스팅에서는 삼항 표현식 문법의 사용 예시와 중첩 삼항 표현식에 대해서 정리해본다.

 

- 순서 -
1. 삼항 표현식 문법
2. 중첩 삼항 표현식

3. 정리

 

1. 삼항 표현식 문법

true_value if condition else false_value

condition의 Boolean 값을 기반으로 반환된다. if조건식의 condition값이 True이면 true_value를 반환하고 False이면 false_value를 반환한다. 위와 같은 식을 삼항표현식과 if - else 조건식으로 작성해보는 예시는 아래와 같다.

 

삼항 표현식과 if-else 조건식 비교

# 삼항표현식
value = true_value if condition else false_value

# if-else 조건식
if condition:
    value = treue_value
else:
    value = false_value

같은 결과를 출력하지만 삼항 표현식을 사용할 때 코드를 간결하게 작성할 수 있다. 위와 같은 조건식에 직접 값을 대입해서 사용해보면 아래와 같다. 삼항표현식과 if-else 조건식이 같은 결과를 도출하지만 표현하는 방식이 달라진다. 코드는 숫자 10을 기준으로 10이면 ten을 10이 아니면 not ten을 출력하도록 작성하고서 삼항 표현식과 if-else 조건식을 비교해 보았다.

# 삼항표현식
>>> n = 10
>>> value = 'ten' if n == 10 else 'not ten'
ten

# if-else 조건식
>>> n = 1
>>> if n == 10:
>>>     value = 'ten'
>>> else:
>>>     value = 'not ten'
not ten

 

2. 중첩 삼항 표현식

중첩 삼항 표현식은 이름 그대로 삼항 표현식을 중첩된 표현식으로 작성하는 코드이다. 두 개 이상의 if 조건식을 한 줄로 작성할 수 있다. 기본적인 작성 방법은 아래와 같다. 대괄호는 임의로 보기 편하게 하려고 표시한 것이다. 실제로 코드를 작성할 때는 [ ] 괄호는 빼야 한다. 

true_value if condition1 else [ true_value2 if condition2 else false_value ]

if조건식의 condition1 값이 True이면 true_value를 반환하고 False이면 두 번째 조건식의 Boolean 값을 반환한다. condition2의 값이 True이면 true_value2를 False이면 false_value를 반환한다.

 

위의 삼항 중첩 삼항 표현식을 코드로 작성해보면 아래와 같다. 이번에는 임의의 수가 입력 될 때 숫자가 10이면 ten, 10보다 작으면 low, 10보다 크면 high를 출력하는 코드를 작성해보았다.

# 삼항표현식
>>> n = 10
>>> value = 'ten' if n == 10 else 'low' if n < 10 else 'high'
ten

# if-else 조건식
>>> n = 1
>>> if n != 10:
>>>     if n < 10 :
>>>         value = 'low'
>>>     else:
>>>         value = 'high'
>>> else:
>>>     value = 'ten'
low

if-else 조건식으로 작성하면 여러줄에 걸쳐서 작성해야 하는데 비해 삼항 표현식은 한 줄로 작성할 수가 있다. 간편하게 사용이 가능하다. if-else 조건식은 if-elif-else 조건식으로 작성도 가능하다.

 

3. 정리

1) if조건식을 삼항연산자(삼항표현식)를 이용하여 한 줄로 간단하게 작성할 수 있다.

2) 삼항표현식의 기본적인 작성방법은 " true_value if condition else false_value " 형태이다.

3) 삼항표현식은 조건식이 중첩된 경우에도 작성할 수 있다. 중첩 삼항 표현식의 작성방법은 "true_value if condition1 elsetrue_value2if condition2 else false_value " 형태이다.

728x90
728x90

1. count 함수

문자열 안에서 찾고 싶은 문자의 개수를 찾을 수 있다. 어떤 함수는 문자열에서만 사용 가능한 함수도 있는데 count 함수는 튜플, 리스트, 집합과 같은 반복 가능한 iterable 자료형에서도 사용 가능하다. 모든 자료형에서 사용 가능한 것은 아니어서 사용되지 않는 자료형은 아래에서 마저 설명하도록 하겠다.

 

사용방법은 '변수. count(찾는 요소)' 형태로 사용한다. 괄호( ) 안에 찾고자 하는 값을 입력하면 함수를 사용한 변수 안에서 해당 값의 개수를 숫자로 반환한다. 

 

 

2. 문자열 사용예시

'ooyyy'라는 아무 의미 없는 문자열을 예로 들어본다. 해당 문자열에서 y가 몇 개인지 를 count 함수를 사용하여 찾아보겠다. 

>>> 'ooyyy'.count('y')
3

문자열이 짧아서 육안으로도 금방 확인이 가능하다. y의 개수를 숫자인 3으로 반환하였다. 이런 짧은 문자열의 경우 함수를 굳이 사용하지 않겠지만 문자가 길어지거나 요소가 많은 iterable 자료형의 경우 유용하게 사용될 수 있다.

 

이번엔 임의의 변수에 문자열을 선언하여 사용해보겠다. 

'ox o x oxoxox'라는 의미 없는 문자의 나열을 b라는 변수에 선언해보았다. 사용방법은 위와 동일하다.

b.count( )로 사용하면 되고 괄호 안에 찾고자 하는 문자를 찾는다. 'ox'라는 'o'와 'x'가 붙은 문자열이 몇 개인지를 찾아본다.

>>> b = 'ox o x oxoxox'
>>> b.count('ox')
4

'o'와 'x'가 떨어져 있는 경우를 제외한 개수 4를 반환하였다.

 

 

3. 리스트 사용 예시

위에 문자열을 사용한 것과 동일한 패턴으로 사용해보았다. a라는 변수에 리스트를 선언하고서 count 함수를 사용해보고 변수로 선언하지 않은 리스트에서 곧바로 count 함수를 사용했다.

>>> a = [1, 1, 1, 2, 3]
>>> a.count(1)
3

>>> ['ox', 'o', 'x', 'oxoxox'].count('ox')
1

 

4. 에러가 발생하는 자료형

dictionary, set 자료형에서는 count 함수를 사용할 수 없었다. 에러코드는 AttributeError가 발생했다.

그 밖에 bool타입을 변수에 저장한 경우에는 출력되었는데 tuple로 인식되었기 때문에 사용이 되었다.

bool이라는 변수에 쉼표를 이용해서 True, False의 불리언 값 세 개를 선언했더니 bool이라는 변수가 tuple 타입으로 저장되었다. 즉, count 함수를 사용할 수 있는 tuple 타입이었기에 사용된 것이다.

>>> bool = True, False, True
>>> bool.count(True)
2

>>> type(bool)
<class 'tuple'>

 

728x90
728x90

이번에는 리스트에 map을 사용해보겠습니다. map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다(map은 원본 리스트를 변경하지 않고 새 리스트를 생성합니다).

  • list(map(함수, 리스트))
  • tuple(map(함수, 튜플))

예를 들어 실수가 저장된 리스트가 있을 때 이 리스트의 모든 요소를 정수로 변환하려면 어떻게 해야 할까요? 먼저 for 반복문을 사용해서 변환해보겠습니다.

>>> a = [1.2, 2.5, 3.7, 4.6]
>>> for i in range(len(a)):
...     a[i] = int(a[i])
...
>>> a
[1, 2, 3, 4]

for range(len(a))를 사용해서 인덱스를 가져왔습니다. 그리고 가져온 인덱스로 요소 하나 하나에 접근한 뒤 int로 변환하여 다시 저장했습니다.

매번 for 반복문으로 반복하면서 요소를 변환하려니 조금 번거롭습니다. 이때는 map을 사용하면 편리합니다.

>>> a = [1.2, 2.5, 3.7, 4.6]
>>> a = list(map(int, a))
>>> a
[1, 2, 3, 4]

a = list(map(int, a)) 한 줄로 변환이 끝났습니다. map int와 리스트를 넣으면 리스트의 모든 요소를 int를 사용해서 변환합니다. 그다음에 list를 사용해서 map의 결과를 다시 리스트로 만들어줍니다.

 그림 리스트에 map 함수 사용

사실 map에는 리스트뿐만 아니라 모든 반복 가능한 객체를 넣을 수 있습니다.

이번에는 range를 사용해서 숫자를 만든 뒤 숫자를 문자열로 변환해보겠습니다.

>>> a = list(map(str, range(10)))
>>> a
['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']

range로 0부터 9까지 숫자를 만들고, str을 이용해서 모두 문자열로 변환했습니다. 리스트를 출력해보면 각 요소가 ' '(작은따옴표)로 묶인 것을 볼 수 있습니다.

1.  input().split()과 map

input().split()의 결과가 문자열 리스트라서 map을 사용할 수 있었습니다.

다음과 같이 input().split()을 사용한 뒤에 변수 한 개에 저장해보면 리스트인지 확인할 수 있습니다.

>>> a = input().split()
10 20 (입력)
>>> a
['10', '20']

10 20을 입력하면 ['10', '20']처럼 문자열 두 개가 들어있는 리스트가 만들어집니다.

이제 map을 사용해서 정수로 변환해봅니다.

>>> a = map(int, input().split())
10 20 (입력)
>>> a
<map object at 0x03DFB0D0>
>>> list(a)
[10, 20]

다시 10 20을 입력하면 맵 객체(map object)가 만들어집니다. 이 상태로는 안에 들어있는 값을 볼 수 없으므로 list를 사용해서 리스트로 출력했습니다. 리스트를 보면 [10, 20]처럼 정수 두 개가 들어있습니다.

이 리스트 [10, 20]을 변수 두 개에 저장하면 지금까지 사용한 a, b = map(int, input().split())와 같은 동작이 됩니다.

>>> a, b = [10, 20]
>>> a
10
>>> b
20

사실 map이 반환하는 맵 객체는 이터레이터라서 변수 여러 개에 저장하는 언패킹(unpacking)이 가능합니다. 그래서 a, b = map(int, input().split())처럼 list를 생략한 것입니다

.

a, b = map(int, input().split())을 풀어서 쓰면 다음과 같은 코드가 됩니다.

x = input().split()    # input().split()의 결과는 문자열 리스트
m = map(int, x)        # 리스트의 요소를 int로 변환, 결과는 맵 객체
a, b = m               # 맵 객체는 변수 여러 개에 저장할 수 있음

 

728x90
728x90

문제 설명

대문자와 소문자가 섞여있는 문자열 s가 주어집니다. s에 'p'의 개수와 'y'의 개수를 비교해 같으면 True, 다르면 False를 return 하는 solution를 완성하세요. 'p', 'y' 모두 하나도 없는 경우는 항상 True를 리턴합니다. 단, 개수를 비교할 때 대문자와 소문자는 구별하지 않습니다.

예를 들어 s가 "pPoooyY"면 true를 return하고 "Pyy"라면 false를 return합니다.

def solution(s):
    cnt1=0
    cnt2=0

    for c in s:
        if c == "p" or c == "P":
            cnt1 = cnt1 + 1

        if c == "y" or c == "Y":
            cnt2 = cnt2 + 1  

    if cnt1 == cnt2:
        return True
    else:
        return False

위의 나의 코드를 보면 정석..? 그냥 문제를 하나하나 해석해서 풀었다.. 시간도 오래걸리고 코드도 길다..

def solution(s):
    
    return s.lower().count('p') == s.lower().count('y')

사실 문자열 메서드에 포함된 글자의 개수를 알려주는 문자열의 메서드 count()가 있습니다. 위의 코드 처럼 count() 함수를 사용해서 하는 것이 간단하다.!

728x90
728x90
def solution(n):    
    a=n**0.5
    if int(a)==a:
        return (a+1)**2
    else:
        return -1
def solution(n):    

    sqrt = n ** (1/2)

    if sqrt % 1 == 0:
        return (sqrt + 1) ** 2
    return -1

먼저 문제의 알고리즘을 적어 보면

  1. 주어진수가 정수의 제곱인지 확인
  2. 만약 정수의 제곱이면 정수(제곱근)에 1을 더한 수를 제곱한수를 리턴 
  3. 정수의 제곱이 아니면 -1 을 리턴 

그러면 우리는 먼저 제곱근 구하는 함수, 자료형 확인하는 함수, 자료형이 맞는지 확인해주는 함수 등을 생각한다. 그 함수들은 각각 math.sqrt(), type(), isinstance() 이고,

하지만 이 함수들을 단순히 사용하는 것으로는 답을 구하는 것이 쉽지 않을 것이다.

 

방법은 어떤 값이 정수인지 확인하는 방법은 원래 값과 정수로 바꾼 값이 같은지 확인하는 것이다.

즉, 3.0과 int(3.0)의 값이 같으면 그 값은 정수 값인 것.

이제 math.sqrt() 함수를 이용하여 문제를 해결할 수 있다.

 

import math

def solution(n):    
    a=math.sqrt(n)
    if int(a)==a:
        return (a+1)**2
    else:
        return -1
728x90

+ Recent posts