Python의 언더스코어(Underscore, _)

타 언어에서 언더스코어()는 단지 스네이크 표기법의 변수나 함수명을 위해서만 사용되어지는 반면 (물론 그렇지 않은 언어도 있다), 파이썬에서는 이 문자의 의미가 다양하다. 아마 파이썬 프로그래머라면 for _ in range(10)나 init(self)등의 문법들이 굉장히 익숙할 것이다. 이번 포스트에서는 이 언더스코어()가 언제 어떤 의미로 쓰이는지에 대해 다루어보려고 한다. 크게 기술적인 내용은 아니지만 파이썬 프로그래머로서 알아두면 좋을 것 같아 정리해보려고 한다.

파이썬에서 언더스코어(_)는 다음과 같은 상황에서 사용되는데 크게 5가지의 경우가 있다.

  1. 인터프리터(Interpreter)에서 마지막 값을 저장할 때
  2. 값을 무시하고 싶을 때 (흔히 “I don’t care”라고 부른다.)
  3. 변수나 함수명에 특별한 의미 또는 기능을 부여하고자 할 때
  4. 국제화(Internationalization, i18n)/지역화(Localization, l10n) 함수로써 사용할 때
  5. 숫자 리터럴값의 자릿수 구분을 위한 구분자로써 사용할 때

인터프리터에서 사용되는 경우

print(10) # 10
print(_) # 10
print(_ * 3) # 30
print(_ * 20) # 600

값을 무시하고 싶은 경우

_는 또한 어떤 특정 값을 무시하기 위한 용도로 사용되기도 하는데, 값이 필요하지 않거나 사용되지 않는 값을 _에 할당하기만 하면 된다.

#
x, _, y = (1, 2, 3) # x = 1, y = 3
#
x, *_, y = (1, 2, 3, 4, 5) # x = 1, y = 5
#
for _ in range(5): # test test test test test
print('test')
#
for _, val in list_of_tuple:
do_something()

특별한 의미의 네이밍을 하는 경우

파이썬에서 _가 가장 많이 사용되는 곳은 아마 네이밍일 것이다. 파이썬 컨벤션 가이드라인인 PEP8에는 다음과 같은 4가지의 언더스코어를 활용한 네이밍 컨벤션을 소개하고 있다.

  • _single_leading_underscore : 주로 한 모듈 내부에서만 사용하는 private 클래스/함수/변수/메서드를 선언할 때 사용하는 컨벤션이다. 이 컨벤션으로 선언하게 되면 from module import *시 _로 시작하는 것들은 모두 임포트에서 무시된다. 그러나, 파이썬은 진정한 의미의 private을 지원하고 있지는 않기 때문에 private을 완전히 강제할 수는 없다. 즉, 위와 같은 임포트문에서는 무시되지만 직접 가져다 쓰거나 호출을 할 경우엔 사용이 가능하다. 그래서 “weak internal use indicator”라고 부르기도 한다.
_internal_name = 'one_module' # Private Variable
_internal_version = '1.0' # Private Variable
def __init__(self, price):
self._price = price
def _double_price(self): # private
return self._price * self._hidden_factor
def get_double_price(self):
return self._double_price()
* `single_trailing_underscore_`: . .
```python
Tkinter.Toplevel(master, class_='ClassName') # class
list_ = List.objects.get(1) # list
  • __double_leading_underscores : 이는 컨벤션이라기보단 하나의 문법적인 요소이다. 더블 언더스코어는 클래스 속성명을 맹글링하여 클래스간 속성명의 충돌을 방지하기 위한 용도로 사용된다. (맹글링이란, 컴파일러나 인터프리터가 변수/함수명을 그대로 사용하지 않고 일정한 규칙에 의해 변형시키는 것을 말한다.) 파이썬의 맹글링 규칙은 더블 언더스코어로 지정된 속성명 앞에 _ClassName을 결합하는 방식이다. 즉, ClassName이라는 클래스에서 method라는 메서드를 선언했다면 이는 _ClassNamemethod로 맹글링 된다.
class A:
def _single_method(self):
pass
def __double_method(self): #
pass
class B(A):
def __double_method(self): #
pass
print(dir(A())) # ['_A_double_method', ..., '_single_method']
print(dir(B())) # ['_A_double_method', '_B_double_method', ..., '_single_method']
# .

더블 언더스코어로 지정된 속성명은 위와 같이 맹글링이 되기 때문에 일반적인 속성 접근인 ClassName.__method으로 접근이 불가능하다. 간혹, 이러한 특징으로 더블 언더스코어를 사용해 진짜 private처럼 보이게 하는 경우가 있는데 이는 private을 위한 것이 아니며 private으로의 사용도 권장되지 않는다. 이에 대한 자세한 내용은 Python Naming을 참고하면 좋을 것 같다.

  • __double_leading_and_trailing_underscores__ : 스페셜 변수나 메서드(매직 메서드라고도 부른다.)에 사용되는 컨벤션이며, __init__, __len__과 같은 메서드들이 있다. 이런 형태의 메서드들은 어떤 특정한 문법적 기능을 제공하거나 특정한 일을 수행한다. 가령, __file__은 현재 파이썬 파일의 위치를 나타내는 스페셜 변수이며, __eq__은 a == b라는 식이 수행될 때 실행되는 스페셜 메서드이다. 물론 사용자가 직접 만들 수도 있지만 그런 경우는 정말 거의 없으며, 일부 스페셜 메서드의 경우 직접 수정하거나 하는 일은 빈번히 있을 수 있다. __init__의 경우 클래스의 인스턴스가 생성될 때 처음으로 실행되는 메서드인데 인스턴스의 초기화 작업을 이 메서드의 내용으로 작성할 수 있다.
class A:
def __init__(self, a): # __init__ .
self.a = a
def __custom__(self): # . .
pass

국제화(i18n) / 지역화(l10n) 함수로 사용되는 경우

이는 어떤 특정한 문법적 규칙이라기보단 말 그대로 컨벤션이다. 즉, _가 국제화/지역화 함수라는 의미는 아니며, i18n/l10n 함수를 _로 바인딩하는 C 컨벤션에서 유래된 컨벤션이다. i18n/l10n 라이브러리인 gettext라는 파이썬 내장 라이브러리 API 문서에서도 이 컨벤션을 사용하고 있으며, i18n과 l10n을 지원하는 파이썬 웹 프레임워크인 Django의 공식 문서에서도 이 컨벤션을 소개하면서 사용하고 있다.

# gettext : https://docs.python.org/3/library/gettext.html
import gettext
gettext.bindtextdomain('myapplication', '/path/to/my/language/directory')
gettext.textdomain('myapplication')
_ = gettext.gettext
# ...
print(_('This is a translatable string.'))
from django.utils.translation import ugettext as _
from django.http import HttpResponse
def translate_view(request):
translated = _('This string will be translated.')
return HttpResponse(translated)

숫자 리터럴값의 자릿수 구분을 위한 구분자로 사용되는 경우

Python 3.6에 추가된 문법으로 언더스코어로 숫자값을 좀 더 읽기 쉽도록 자릿수를 구분할 수 있게 되었다.

dec_base = 1_000_000
bin_base = 0b_1111_0000
hex_base = 0x_1234_abcd
print(dec_base) # 1000000
print(bin_base) # 240
print(hex_base) # 305441741


Assign()

assign() 은 변수를 생성하는 함수입니다. 

assign('변수명', 변수)


Example 1

assign('x',10)

x

[1] 10


Example 2

assign('x',10)
assign('y',c(1,2))
assign('z',NA)

c(x,y,z)
[1] 10  1  2 NA


Example 3

for(i in seq(10)){
assign(paste0(i,'day'),seq(i))
}

Problem


You are given an array of integers representing coordinates of obstacles situated on a straight line.

Assume that you are jumping from the point with coordinate 0 to the right. You are allowed only to make jumps of the same length represented by some integer.

Find the minimal length of the jump enough to avoid all the obstacles.


Example


For inputArray = [5, 3, 6, 7, 9], the output should be
avoidObstacles(inputArray) = 4.

Check out the image below for better understanding:


Input/Output

  • [input] array.integer inputArray

    Non-empty array of positive integers.

    Guaranteed constraints:
    2 ≤ inputArray.length ≤ 10,
    1 ≤ inputArray[i] ≤ 40.

  • [output] integer

    The desired length.



Solution

def avoidObstacles(inputArray):

s = sorted(set(inputArray))

m = max(s)


for size in range(1, m+2):

steps = set([i for i in range(0, m+size+1, size)])

if len(steps.intersection(i)) == 0:

return step


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] isIPv4Address  (0) 2018.03.02
[Algorithm] arrayMaximalAdjacentDifference  (0) 2018.03.02
[Algorithm] areEquallyStrong  (0) 2018.03.02
[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] arrayChange  (0) 2018.02.26

Problem


An IP address is a numerical label assigned to each device (e.g., computer, printer) participating in a computer network that uses the Internet Protocol for communication. There are two versions of the Internet protocol, and thus two versions of addresses. One of them is the IPv4 address.

IPv4 addresses are represented in dot-decimal notation, which consists of four decimal numbers, each ranging from 0 to 255 inclusive, separated by dots, e.g., 172.16.254.1.

Given a string, find out if it satisfies the IPv4 address naming rules.


Example


  • For inputString = "172.16.254.1", the output should be
    isIPv4Address(inputString) = true;

  • For inputString = "172.316.254.1", the output should be
    isIPv4Address(inputString) = false.

    316 is not in range [0, 255].

  • For inputString = ".254.255.0", the output should be
    isIPv4Address(inputString) = false.

    There is no first number.


Input/Output

  • [input] string inputString

    Guaranteed constraints:
    1 ≤ inputString.length ≤ 30.

  • [output] boolean

    true if inputString satisfies the IPv4 address naming rules, false otherwise.



Solution

def isIPv4Address(inputString):

splt = inputString.split('.')

return len(splt) == 4 and all(i.isdigit() and 0 <= int(i) <= 255 for i in splt)

*splt : inputString을 점(dot)을 기준으로 나누어 반환한 값을 저장한 변수

'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] avoidObstacles  (0) 2018.03.02
[Algorithm] arrayMaximalAdjacentDifference  (0) 2018.03.02
[Algorithm] areEquallyStrong  (0) 2018.03.02
[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] arrayChange  (0) 2018.02.26

Problem


Given an array of integers, find the maximal absolute difference between any two of its adjacent elements.


Example


For inputArray = [2, 4, 1, 0], the output should be
arrayMaximalAdjacentDifference(inputArray) = 3.


Input/Output

  • [input] array.integer inputArray

    Guaranteed constraints:
    3 ≤ inputArray.length ≤ 10,
    -15 ≤ inputArray[i] ≤ 15.

  • [output] integer

    The maximal absolute difference.



Solution

def arrayMaximalAdjacentDifference(inputArray):

return max([abs(inputArray[i] - inputArray[i+1]) for i in range(len(inputArray) - 1)])


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] avoidObstacles  (0) 2018.03.02
[Algorithm] isIPv4Address  (0) 2018.03.02
[Algorithm] areEquallyStrong  (0) 2018.03.02
[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] arrayChange  (0) 2018.02.26

Problem


Call two arms equally strong if the heaviest weights they each are able to lift are equal.

Call two people equally strong if their strongest arms are equally strong (the strongest arm can be both the right and the left), and so are their weakest arms.

Given your and your friend's arms' lifting capabilities find out if you two are equally strong.


Example


  • For yourLeft = 10yourRight = 15friendsLeft = 15 and friendsRight = 10, the output should be
    areEquallyStrong(yourLeft, yourRight, friendsLeft, friendsRight) = true;
  • For yourLeft = 15yourRight = 10friendsLeft = 15 and friendsRight = 10, the output should be
    areEquallyStrong(yourLeft, yourRight, friendsLeft, friendsRight) = true;
  • For yourLeft = 15yourRight = 10friendsLeft = 15 and friendsRight = 9, the output should be
    areEquallyStrong(yourLeft, yourRight, friendsLeft, friendsRight) = false.


Input/Output

  • [input] integer yourLeft

    A non-negative integer representing the heaviest weight you can lift with your left arm.

    Guaranteed constraints:
    0 ≤ yourLeft ≤ 20.

  • [input] integer yourRight

    A non-negative integer representing the heaviest weight you can lift with your right arm.

    Guaranteed constraints:
    0 ≤ yourRight ≤ 20.

  • [input] integer friendsLeft

    A non-negative integer representing the heaviest weight your friend can lift with his or her left arm.

    Guaranteed constraints:
    0 ≤ friendsLeft ≤ 20.

  • [input] integer friendsRight

    A non-negative integer representing the heaviest weight your friend can lift with his or her right arm.

    Guaranteed constraints:
    0 ≤ friendsRight ≤ 20.

  • [output] boolean

    true if you and your friend are equally strong, false otherwise.



Solution

def areEquallyStrong(yourLeft, yourRight, friendsLeft, friendsRight):

return sorted([yourLeft, yourRight]) == sorted([friendsLeft, friendsRight])


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] isIPv4Address  (0) 2018.03.02
[Algorithm] arrayMaximalAdjacentDifference  (0) 2018.03.02
[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] arrayChange  (0) 2018.02.26
[Algorithm] areSimilar  (0) 2018.02.26

앞에서 polls 애플리케이션을 설계할 때 3개의 페이지가 필요했습니다.

이 3개의 페이지를 보여주기 위해 필요한 뷰와 템플릿을 코딩해보도록 하겠습니다.







1. 처리 흐름

URL 패턴                뷰 이름        뷰가 처리하는 내용

/polls/                index()      index.html 템플릿을 보여줍니다.

/polls/5/              detail()     detail.html 템플릿을 보여줍니다.

/polls/5/vote/         vote()       detail.html에 있는 폼을 POST 방식으로 처리합니다.

/polls/5/results/     results()    results.html 템플릿을 보여줍니다.

/admin/                (장고 기능)     Admin 사이트를 보여줍니다. (장고에서 기본적으로 제공)    

* URL 패턴에서 5는 예시로, 질문번호가 채워지는 자리입니다.


위 설계 내용을 개발하기 위해 아래 순서대로 코딩하도록 하겠습니다. 코딩 순서는 정해진 것은 없지만, 일반적으로 URLconf, 뷰, 템플릿, 뷰 순서로 코딩합니다.

urls.py 작성                // URLconf 내용을 작성

views.index() 함수 작성     // index.html 템플릿도 같이 작성

view.detail() 함수 작성     // detail.html 템플릿도 같이 작성

views.vote() 함수 작성       // redirection 처리 들어있음

views.results() 함수 작성    // results.html 템플릿도 같이 작성


URLconf 설계 내용에 따르면, Admin 사이트까지 포함하여 5개의 URL과 뷰가 필요합니다. 그 내용을 기계적으로 urls.py 파일에 코딩합니다. 코드는 아래와 같습니다.


$ cd ch3/mysite

$ vi urls.py

from django.conf.urls import patterns, url -------------------------------------------------- 1

from polls import views --------------------------------------------------------------------- 2


urlpatterns = patterns('', ------------------------------------------------------------------ 3 url(r'^polls/$', views.index, name = 'index'), url(r'^polls/(?P<question_id>\d+)/$', views.detail, name = 'detail'), url(r'^polls/(?P<question_id)\d+)/vote/$', views.vote, name = 'vote'), url(r'^polls/(?P<question_id)\d+)/results/$', views.results, name = 'results'), ----- 4 url(r'^admin/', include(admin.site.urls)), ------------------------------------------ 5 )


위의 코드를 라인별로 설명하면 아래와 같습니다.

1. 장고의 내장 함수인 patterns(), url() 두 개의 함수를 import 합니다.

2. URLconf에서 뷰를 지정하므로, 뷰가 정의되어 있는 views 모듈을 임포트합니다.

3. patterns() 함수는 URL/뷰 매핑을 처리하는 함수로, 동일한 형식으로 사용하기 때문에 보이는 그대로 코딩하면 됩니다.

4. url() 함수는 5개의 인자를 가지고 있습니다. 앞의 2개는 필수 인자이고, 뒤에 3개는 선택 인자입니다.

5. 마지막 줄에는 Admin 사이트 관련 URLconf가 정의되어 있습니다. 이처럼 이미 정의된 URLconf를 include() 함수로 가져와서 사용할 수 있습니다.


url() 함수는 장고 라이브러리 django.conf.url.py 파일에 아래처럼 정의되어 있습니다.

url(regex, view, kwargs = None, name = None, prefix = '')

    • regex : URL을 정규표현식으로 표현합니다. 정규표현식을 통해 뷰 함수에 넘겨줄 파라미터를 추출할 수 있습니다.
    • view : 요청의 URL이 regex 인자에 매칭되면 장고가 뷰 함수를 호출합니다. 뷰 함수에는 HttpRequest와 Regex에서 추출한 항목을 인자로 넘겨줍니다.
    • kwargs : regex 인자에서 추출한 파라미터 외에 추가적인 인자를 파이썬 사전 타입의 키워드 인자로 뷰 함수에 넘겨줄 수 있습니다.
    • name : 각 URL 별로 이름을 붙여줍니다. 여기서 정해준 이름은 템플릿 파일에서 사용되니 기억해 두기 바랍니다.
    • prefix : 뷰 함수에 대한 접두사 문자열입니다. 우리 예제에서는 사용하지 않으니 무시해도 됩니다.

자, 이제 앞에서 코딩한 내용을 살펴보도록 하겠습니다. 각 라인의 의미는 다음과 같습니다.

url(r'^polls/$', views.index, name = 'index'),

만일, 요청의 URL이 /polls/라면 위 라인이 매칭되고, 정규표현식에서 파라미터를 추출하지 않으므로 views.index(request) 처럼 뷰 함수가 호출됩니다. 이 URL 패턴의 이름을 index라고 정했습니다.

url(r'^polls/(?P<question_id>\d+)/$', views.detail, name = 'detail'),

만일, 요청의 URL이 /polls/5/ 라면 위 라인이 매칭되고, 뷰 함수 호출 시 view.detail(request, question_id = '5')처럼 인자가 대입됩니다. 이 URL 패턴의 이름을 detail이라고 정했습니다. 타 라인의 코드의 동작 방식도 이와 같습니다.


url(r'^admin/', include(admin.site.urls)),

만일 요청의 URL이 /admin/이라면 아래 라인이 매칭되고, 장고에서 제공해주는 뷰 함수를 호출합니다. 우리는 아래 라인처럼 include() 함수만으로 Admin 사이트를 그대로 사용할 수 있습니다.


ROOT_URLCONF = 'mysite.urls'

추가적으로, mysite/settings.py 파일에 ROOT_URLCONF 항목이 정의된다는 것을 기억하시기 바랍니다. 장고는 URL 분석 시, 이 항목에 정의된 urls.py 파일을 가장 먼저 분석하시기 바랍니다.




2. URLconf의 코딩 방법

한 가지 더 알아두어야 할 사항은 URLconf를 코딩할 때 앞에서처럼 하나의 urls.py 파일에 작성할 수도 있고, 다음과 같이 mysite/urls.py와 polls/urls.py 2개의 파일에 작성할 수도 있습니다. 


mysite/urls.py 코딩 방법

$ cd ch3/mysite

$ vi urls.py

from django.conf.urls import patterns, url, include

from django.contrib import admin


urlpatterns = patterns('',

url(r'^polls/', include('polls.urls', namespace = "polls")),

url(r'^admin/', include(admin.site.urls)),

)


polls/urls.py 코딩 방법

$ cd ch3/polls

$ vi urls.py

from django.conf.urls import patterns, url

from polls import views


urlpatterns = patterns('', url(r'^polls/$', views.index, name = 'index'), url(r'^polls/(?P<question_id>\d+)/$', views.detail, name = 'detail'), url(r'^polls/(?P<question_id)\d+)/vote/$', views.vote, name = 'vote'), url(r'^polls/(?P<question_id)\d+)/results/$', views.results, name = 'results'), url(r'^admin/', include(admin.site.urls)), - )


그렇다면, 위의 두 가지 방식 중 어떤 방식이 좋을까요?

두 번째 방법을 추천합니다. 즉, URLconf 모듈을 계층적으로 구성하는 것이 변경도 쉬워지고 확장도 용이해지기 때문입니다. 만일 URL의 polls를 vote라고 변경한다고 가정했을 때, 1개의 파일로 URLconf를 코딩한 경우는 모든 패턴마다, 즉 위 예제의 경우 4개의 패턴을 수정해야 하지만, 2개의 파일로 URLconf를 코딩한 경우는 사우이 URLconf에서 1개의 패턴만 수정하면 됩니다. 이것이 재사용을 기본 원칙으로 하는 장고의 장점 중 하나입니다.

그리고 mysite/urls.py 파일의 include() 함수를 정의할 때 사용한 namespace 인자는 URL패턴의 이름이 충돌나는 것을 방지하기 위한 것입니다. 우리 예제에서는 애플리케이션이 polls 하나뿐이지만, 보통의 프로젝트에서는 여러 개의 애플리케이션으로 이뤄지는 경우가 대부분입니다. 예를 들어, polls 애플리케이션의 URL패턴 이르과 blog 애플리케이션 URL 패턴 이름이 detail이 되는 경우가 발생할 수 있습니다. 이 둘을 구별하기 위해 include() 함수의 namespace 인자를 사용합니다.


Problem


Given a string, find out if its characters can be rearranged to form a palindrome.


Example


For inputString = "aabb", the output should be
palindromeRearranging(inputString) = true.

We can rearrange "aabb" to make "abba", which is a palindrome.


Input/Output

  • [input] string inputString

    A string consisting of lowercase English letters.

    Guaranteed constraints:
    1 ≤ inputString.length ≤ 50.

  • [output] boolean

    true if the characters of the inputString can be rearranged to form a palindrome, false otherwise.



Solution

def palindromeRearranging(inputString):

stringCount = [inputString.count(i) % 2 for i in set(inputString)]


return sum(stringCount) <= 1


*stringCount : input된 문자열에서 중복값을 없애고, 해당 문자를 for문으로 반환한 값을 2로 나눈 나머지 값을 리스트로 저장

'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] arrayMaximalAdjacentDifference  (0) 2018.03.02
[Algorithm] areEquallyStrong  (0) 2018.03.02
[Algorithm] arrayChange  (0) 2018.02.26
[Algorithm] areSimilar  (0) 2018.02.26
[Algorithm] addBoarder  (0) 2018.02.26

Solution


You are given an array of integers. On each move you are allowed to increase exactly one of its element by one. Find the minimal number of moves required to obtain a strictly increasing sequence from the input.


Example

For inputArray = [1, 1, 1], the output should be
arrayChange(inputArray) = 3.


Input/Output

  • [input] array.integer inputArray

    Guaranteed constraints:
    3 ≤ inputArray.length ≤ 105,
    -105 ≤ inputArray[i] ≤ 105.

  • [output] integer

    The minimal number of moves needed to obtain a strictly increasing sequence from inputArray.
    It's guaranteed that for the given test cases the answer always fits signed 32-bit integer type.



Solution

def arrayChange(inputArray):

count = 0

for i in range(len(inputArray) - 1):

if inputArray[i+1] <= inputArray[i]:

count += inputArray[i] - inputArray[i+1] + 1

inputArray[i+1] = inputArray[i] + 1


return count


*count : sequence하게 올라가야 하는 횟수를 저장한 변수


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] areEquallyStrong  (0) 2018.03.02
[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] areSimilar  (0) 2018.02.26
[Algorithm] addBoarder  (0) 2018.02.26
[Algorithm] alternatingSums  (0) 2018.02.26

Problem


Two arrays are called similar if one can be obtained from another by swapping at most one pair of elements in one of the arrays.

Given two arrays a and b, check whether they are similar.


Example


  • For a = [1, 2, 3] and b = [1, 2, 3], the output should be
    areSimilar(a, b) = true.

    The arrays are equal, no need to swap any elements.

  • For a = [1, 2, 3] and b = [2, 1, 3], the output should be
    areSimilar(a, b) = true.

    We can obtain b from a by swapping 2 and 1 in b.

  • For a = [1, 2, 2] and b = [2, 1, 1], the output should be
    areSimilar(a, b) = false.

    Any swap of any two elements either in a or in b won't make a and b equal.


Input/Output

  • [input] array.integer a

    Array of integers.

    Guaranteed constraints:
    3 ≤ a.length ≤ 105,
    1 ≤ a[i] ≤ 1000.

  • [input] array.integer b

    Array of integers of the same length as a.

    Guaranteed constraints:
    b.length = a.length,
    1 ≤ b[i] ≤ 1000.

  • [output] boolean

    true if a and b are similar, false otherwise.



Solution

def areSimilar(a, b):

return sorted(a) == sorted(b) and sum([i != j for i,j in zip(a,b)]) <= 2:


'Programming > Algorithm' 카테고리의 다른 글

[Algorithm] palindromeRearranging  (0) 2018.02.26
[Algorithm] arrayChange  (0) 2018.02.26
[Algorithm] addBoarder  (0) 2018.02.26
[Algorithm] alternatingSums  (0) 2018.02.26
[Algorithm] reverseParentheses  (0) 2018.02.20

+ Recent posts