트리 이론을 공부한 후 가장 처음으로 건드려보려고 한 문제가 바로 이 문제다.

preorder (root --> left --> right) traversal의 순서는 알았지만, 

정확히 이것을 리스트로 받고 처리를 하는 것인지에 대해서 고민이 많았다.

 

그리고 현재 계속 "재귀"에 대한 이해를 제대로 잡고 가기 위해서 이번에는 재귀를 제대로 잡자는 생각으로 재귀로 코드를 짜 보고자 하였다.

 

우선 과거에 자료구조를 공부할 때, C언어로 잠깐했었는데, 언뜻 기억났던 코드가 바로 다음과 같은 코드였다.

void traversal(node){
    if ( node){
        visit(node); preorder
        traversal(node -> left);
        #visit(node); inorder
        traversal(node -> right);   
        #visit(node); postorder
    }  
}

 

그럼 위의 코드를 이제 리트코드에 준 문제에 맞게 만들어야 했는데,

정말로 고민을 많이 했다.

 

어디서 어떻게 코드가 들어가야 하고,

재귀는 정확히 어떻게 이루어지는지가 고민이었다.

 

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
        visited = []
        if root is not None:
            visited.append(root.val)
            # print(root.val, "afterAppend", visited)
            visited.extend(self.preorderTraversal(root.left))
            # print(root.val, "afterLeft", visited)
            visited.extend(self.preorderTraversal(root.right))
            # print(root.val, "afterRight", visited)
        return visited

 

여기서 visited.extend도 핵심이다.

 

처음에 나는 그냥 self.preorderTraversal(root.left)라고 했었다.

그런데 이렇게 하다보니, visited를 return 했을 때, 제대로 이 값들을 추가를 시켜주지 못했다.

그러다 보니 답이 [1]에서 멈춰있었다. 

 

그래서 제대로 어떻게 코드가 처리되고 있는지를 알기 위해서 위에 주석 처리된 print문들을 찍게 되었고,

이를 직어보니 [1] [2] [3]과 같이 재귀를 돌 때 제대로 숫자는 리턴 하지만,

최종적으로 값들을 하나의 리스트에 저장하지 못했다는 점이 있었다.

 

따라서, 이를 해결하기 위해서, 재귀를 해서 리턴하는 값을 리스트에 넣는 코드로 수정이 필요했고,

이를 위해. extend()를 사용하게 되었다.

 


아직도 해당 코드를 보아도 제대로 이해를 했다고 보기는 어려운 것 같다.

다른 사람에게 설명하라고 하면 내가 제대로 설명을 하고 있는가에 대해서 스스로 의문을 가지고, 

설명하는 도중에도 왠지 막힐 것 같다는 생각이 든다.

 

따라서, 해당 문제는 계속 더 공부가 필요하다고 느낀다.

 

 

 

최근에 트리 이론과 재귀를 제대로 이해하고 이제 직접 코딩으로 구현을 해보는 연습을 하고 있는 중이다.

그 중에 내가 풀어놓고 답인지 아닌지 햇갈렸던 문제 중 하나가 위의 문제였다.

일단 답은 다음과 같이 간단하게(?) 구현이 가능하다.

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: Optional[TreeNode]) -> int:
        if not root:
            return 0
        else:
            return max(self.maxDepth(root.left), self.maxDepth(root.right)) + 1

 

일단 if not root 부분은 base 코드, 즉 재귀를 끝내기 위한 코드인 것은 금방 추론이 가능하다.

문제는 return 부분이다.

 

최대한 쉽게 말로 풀이를 해보자면 이렇게 된다.

  1. 우선 3으로 root가 시작된다
  2. 3의 root.left는 9가 된다.
  3. self.maxDepth(root.left)에는 9가 들어가는 것이므로, maxDepth(self, 9)가 된다.
  4. 9가 들어오면 일단 다시 else문으로 가게 된다.
  5. 9일 때, self.maxDepth(root.left)와 self.maxDepth(root.right)는 둘 다 null이므로, return max(0, 0)+1이 되므로 return 1이 된다.
  6. 따라서 이제 9일 때 1이 나오기 때문에 재귀한 것을 타고 올라가면, 맨 처음 root가 3이었을 때, max(1, self.maxDepth(root.right))+1인 것을 알 수 있다.
  7. 이제 self.maxDepth(root.right)도 똑같이 해주면 (이 경우에는 20이 들어가고, 들어간 후 각각 15, 7이 나올 것이다)), 결국 root가 3이었을 때, return self.maxDepth(1,2)+1이 된다.
  8. 따라서, 결론적으로는 return 2+1 즉, return 3이 나온다.

재귀는 계속 풀어봐야하는 것을 느낀다.

과거에 여러 번 코딩테스트 시도를 실패했던 첫 번째 관문 중 하나가 나에게는 항상 재귀였다 (이를 활용한 트리도...).

계속 여러 문제를 이번에는 끈덕지게 풀어보고자 한다.

이 문제도 시간이 많이 걸렸다.

최근에 느낀 것이지만 문제를 풀 때 이상하게 append와 pop을 많이 사용하는 경향이 있었는데,

왜 그런가 고민해보니 C언어스럽게 나도 모르게 파이썬 코드를 짜고 있었다는 것을 알게 되었다.

스트링이나 숫자들을 모두 리스트에 넣고, 리스트의 인덱스를 사용해서 만드는 방법이 대표적으로 C언어스럽다는 것이다.

이 문제도 결국 그렇게 풀고,

문제 푼 코드의 지저분함을 느끼고 계속 쳐다본 결과 그렇게 된 것 같다.

 

그리고 코드를 볼 때 참고해야할 사항이 몇 가지 있는데...

1. 조건인 constraint를 제대로 읽지 않았다. 알고보니 testcase의 입력값들이 모두 양수로 되어있다는 것이었다. 음수값의 경우도 모두 처리해야하는 줄 알고 if elif else문을 사용했다.

 

2. contraint를 알고 원래 만들었던 코드를 그대로 사용해보았더니 그래도 지저분했다.

 

3. 그래서 파이써닉한 코드를 한 번 만들어보고 "remove()" 함수를 알게 되어 "pop"대신 사용할 수 있게 되었다.

-그동안 pop()을 계속 사용한 이유는 remove()를 제대로 몰랐기 때문.

-pop()은 index값을 넣어야 하고, remove()는 지우고자 하는 숫자/문자를 넣으면 된다.

 

4. 마지막의 코드는 sort()를 사용한 것인데, 가장 간단하고 직관적인 코드이다. 다만, 효율성을 배제하고 생각해야 한다. 시간적인 면에서는 가장 느리다는 특징이 있다.

#constraint 제대로 확인 안하고 음수까지 모두 처리 (77ms)
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        nums_abs = [abs(ele) for ele in nums] # 절대값으로 바꾼다. O(n)
				nums_abs is ...
				list of abs(ele) for each ele in nums
				dictionary of ...

        top_maxIndex = nums_abs.index(max(nums_abs))
        top_positive_max = nums_abs.pop(top_maxIndex)
        next_maxIndex = nums_abs.index(max(nums_abs))
        next_positive_max = nums_abs.pop(next_maxIndex)


        if nums[top_maxIndex] > 0 and nums[next_maxIndex] > 0:
            return ((top_positive_max-1) * (next_positive_max-1))
        elif nums[top_maxIndex]<0 and nums[next_maxIndex]<0:
            return ((top_positive_max-1) * (next_positive_max-1))
        else:
            if nums[top_maxIndex] < 0:
                nums.pop(next_maxIndex)
                # print("if", nums[top_maxIndex])
                return ((max(nums)-1) * (next_positive_max-1))
            else:
                nums.pop(top_maxIndex)
                # print("else", nums[next_maxIndex])
                # print((max(nums)))
                return ((max(nums)-1) * (top_positive_max-1))



# constraint 제대로 보고 처리하면 다음과 같은 코드 가능(66ms)
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        top_maxIndex = nums.index(max(nums))
        top_positive_max = nums.pop(top_maxIndex)
        next_maxIndex = nums.index(max(nums))
        next_positive_max = nums.pop(next_maxIndex)
        return ((top_positive_max-1) * (next_positive_max-1))

class Solution:
    def maxProduct(self, nums: List[int]) -> int:
		mx = max(nums)
		nums.remove(mx)

		next_mx = max(nums)
		# nums.remove(next_mx)

		return (mx-1)*(next_mx-1)


# 더 짧고 빠르게 sort()를 활용하여 하면 다음과 같은 코드
# 그런데 sort() 함수가 속도가 많이 느린 것인지 속도 자체는 위의 2개의 코드 중 제일 느리게 나온다 (101ms)
# 효율성을 떠나 가장 파이썬스러운 코드
class Solution:
    def maxProduct(self, nums: List[int]) -> int:
        nums.sort()
        return (nums[-1]-1) * (nums[-2]-1)

 

 

출처: https://leetcode.com/problems/maximum-product-of-two-elements-in-an-array/

 

Maximum Product of Two Elements in an Array - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

 

해당 문제를 굉장히 헤맸다.

# time limit exceeded 3번
# wrong answer 4번
# runtime error 1번 - leetcode는 print 대신 return사용해야되는데 print 사용함

총 8번을 틀렸는데...

 

wrong answer는 총 3가지의 경우 때문에 나왔다.

(1) len(nums) <= k에서 =를 실수로 넣지 않아서

(2) update_max/k 를 update_max만 리턴해서

(3) 음수를 염두해야하는데 특정 변수의 초기값을 0으로 해놓고 코드에서 제대로 업데이트를 시켜주지 않아서

 

time limit exceeded 3번이 정말로 힘들었다.

계속 여러 번 시도해본 결과 문제는 아마도 sums를 계속 k개의 숫자만큼 계산을 n.length-(k-1)만큼 반복하게 해서 그런듯 하다.

오류의 코드는 다음과 같다.

#Time Limit Exceeded
nums_four_list = []
total = []
if len(nums) == k:
    print(sum(nums)/k)
for i in range(len(nums)-(k-1)):
    nums_four_list = nums[i:i+k]
    total.append(sum(nums_four_list))

print(max(total)/k)
#Time Limit Exceeded
initial_max_total = sum(nums[0:k])
new_max = 0
update_max = 0
if len(nums) < k:
    print(sum(nums)/k)
for i in range(len(nums)-(k-1)):
    # print(update_max)
    new_max = sum(nums[i:i+k])
    if i == 0:
        if new_max >= initial_max_total:
            update_max = new_max
            newmax = 0
    else:
        if new_max > update_max:
            update_max = new_max
            newmax = 0

print(update_max/k)
#Time Limit Exceeded
update_max = sum(nums[0:k])
new_max = -9999999
update_max = -9999999
if len(nums) <= k:
    print(sum(nums)/k)
    
for i in range(len(nums)-(k-1)):
    new_max = sum(nums[i:i+k])
    if new_max > update_max:
        update_max = new_max
    # print(update_max)

# print(update_max/k)
print(update_max/k)

 


 

계속 틀리다가 결국 solution을 보게 되었다.

solution에서 주는 하나의 풀이는 sums의 계산을 단 1번만 초기에 하고,

반복적으로 {

현재값과 다음 index의 값을 더한 후, 이전에 구했던 index들 중 가장 초기값을 빼는 것 ----- (a)

그리고 이렇게 구한 이전의 max값과 (a)의 결과를 max를 통해 구한 후,

이를 best값으로 정한다.

}

© https://leetcode.com/problems/maximum-average-subarray-i/solution/
## solution
best = 0
now = sum(nums[0:k])
best = now
for i in range(k,len(nums)):
    now += nums[i] - nums[i-k]
    best = max(best,now)
print(best/k)

 

확실히 solution을 보니 time limit exceeded가 나온 나의 코드보다 훨씬 계산이 줄어들었다는 것을 깨달았다.

이런 형태를 아마 "sliding window"라고 하는 듯하다.

이런 문제해결 방법은 아예 생각을 하지 못했으니 후회는 없지만,

확실히 아쉽다는 생각이 든다.

 

 

출처: https://leetcode.com/problems/maximum-average-subarray-i/

 

Maximum Average Subarray I - LeetCode

Level up your coding skills and quickly land a job. This is the best place to expand your knowledge and get prepared for your next interview.

leetcode.com

결론부터 말하자면 폴더명이나 파일명에 "괄호"를 삭제하는 것이다!!!!!


파이썬 공부를 다시 시작하려고 하는데 맥북 프로로 처음 시작하게 되어 다시 모든 개발환경을 다시 설치하게 되었다.

그러면서 그동안 프로그래밍을 공부하면서 단 한 번도 접하지 못한 이놈의 오류 때문에 2~3일 동안 헤맸던 것 같다...

 

zsh: no matches found: 

 

VSCode를 사용해서 파이썬을 run / build시키려고 할 때 발생했던 문제이다.

 

오류가 정확히 뜨는 형태는 다음과 같다.

/usr/local/bin/python3  ../usr/~~~/Desktop/특정폴더명/특정파일명.py
zsh: no matches found:

 

나 같은 경우, f5로 디버깅 하려고 할 때와 extension을 통해 설치한 run code 버튼을 누를 때마다 발생하는 문제였다.

그러면서 또 명령창에

python3 특정파일명.py

로 하면 프로그램이 잘 돌아간다...

 


해당 문제를 해결하는 방법은 너무도 간단하다.

 

위의 오류 코드에 보이는 "특정폴더명"과 "특정파일명"에 괄호가 들어가지 않도록 하는 것이다.

내가 사용했던 폴더명은 "tutoring(code)"였는데,

이를 "tutoring_code"로 바꾸니 아주 잘 실행되기 시작했다... 허허

 

아마 "특정파일명.py"에 괄호가 있었다면,

python3 특정파일명.py

위의 명령어도 제대로 실행되지 않았을 것이라고 추측된다. 

제대로 실행된 화면 예시

Data Structure

Lists

: 아무 타입이나 넣기 가능 + 길이가 정해져 있지 않음

  • List indexing: seq[index] 형태로 요소 하나 접근
  • List slicing: seq[start: end: step] 형태로 List 자르기 (end포함X)

 

Reserved Words VS Built-in functions VS Methods

  • 문법적 요소, 괄호X, 재정의 불가능  del, if-else, assert
  • 기본 정의된 함수, 별개 함수 사용, 재정의 가능, 편의성 향상 --> len(), range(), sum()
  • 객체 내 정의된 함수, .methods()로 접근, 해당 객체를 다룸 --> .append(), .insert(), .extend()

 

 

Tuple

  • Immutable list(불변 타입 리스트)
  • ( ) 를 사용
  • 함수에서 2개 이상 요소를 반환할 때 사용
  • Tuple안의 요소는 가변 타입일 수도 있음
  • String 타입일 때 일종의 문자 tuple로 생각 가능

 

Packing and Unpacking

  • Unpacking: * (Asterisk)로 남는 요소를 리스트로 남기기 가능


Dictionary

  • 매핑을 위한 데이터 구조 (key , value)
  • Key: 불변 타입만! + 중복이 불가능
  • Set: Dictionary의 Key만 집합처럼 모여 있는 형태 


Conditional Statements

  • if-elif-else
  • 삼항 연산자: [Value1] if [Condition] else [Value2]

 

Loop

  • While Statement: 조건을 만족하는 동안 출력
  • For Statement: 주어진 객체를 순환 (for [Element] in [Iterable])
  • break: 가장 바깥쪽의 반복문 나가기
  • continue: 가장 바깥의 반복문의 처음으로 되돌아가기 

 

Scope

  • Global scope: 최상위에 선언 == 다른 파일에서도 접근 가능
  • Local scope: 함수 안에 선언 == 상위함수에서 접근 불가 


Variable Capture

  • 상위 값이 바뀌면 하위 값이 바뀜
  • 파라미터가 없는데도 불구하고 함수내에서 바뀌어버림 --> 따라서, 파라미터를 써줘야 버그가 발생이 없어진다.
  • Closure = Factory형식
  • 파이썬에서 함수 = 일반 객체
  • 변수로 할당 가능

Decorator

  • 함수 하나를 인자로 받아  같은 형태의 함수를 반환하는 함수
  • @을 사용
  • Class를 사용할 시 Decorator에 인자 추가가 가능

Parameters

  • Function Parameters
  • Variable Length Parameter
  • Keyword Variable Length Parameter 

 



Pythonic Programming

Comprehension

  • result = [i * 2 for i in range(10)] // append
  • result = {str(i): i for i in range(10)} // key:value
  • result = {str(i) for i in range(10)} // add()
  • evens = [i for i in range(100) if i % 2 == 0] // 원하는 요소만 추가
  • result = [(i, j) for i in range(5) for j in range(i)] // 이중 for문
  • eye = [[int(i == j) for j in range(5)] for i in range(5)] // 다차원 배열 만들기

 

Generator

  • 요소를 하나씩 생성해서 반환하는 객체
  • Function에 yield를 사용하면 Generator가 된다
  • 괄호로 generator comprehension 형태로 선언 가능
  • even_generator = (i * 2 for i in range(100))

 

Lambda Function

  • 함수 이름 없이 빠르게 만들어 쓸 수 있는 함수  --> add = lambda a, b : a+b
  • seq = [6, -2, 8, 4, -5]    list(map(lambda x: x * 2, seq))  -->  [12, -4, 16, 8, -10]
  • seq = [6, -2, 8, 4, -5]    list(filter(lambda x: x > 0, seq))  -->  [6, 8, 4]

온라인으로 코딩하는 방법으로는 2가지를 소개하고자 한다.

전에 어플 편에서 ipad로 잘 사용하고 있었다고 했지만, 별도의 다운로드 필요 없이 온라인으로도 가능하다.

 

1. 구글 Colab

https://colab.research.google.com/notebooks/intro.ipynb

 

Google Colaboratory

 

colab.research.google.com

구글에서 제공하는 온라인 팡썬 환경으로, jupyter notebook으로 코딩할 수 있도록 지원을 한다.

또한, github과 google drive로 바로 연동이 되기 때문에 백업이 효율적인 프로그램이기도 하다.

추가적으로, TensorFlow도 사용할 수 있기 때문에 머신러닝/딥러닝에 있어서 많이 사용할 수 있는 개발환경으로 볼 수 있겠다.

 


 

2. repl.it

https://replit.com/

 

The collaborative browser based IDE

Replit is a simple yet powerful online IDE, Editor, Compiler, Interpreter, and REPL. Code, compile, run, and host in 50+ programming languages.

replit.com

repl.it 또한 파이썬을 사용할 수 있는 온라인 개발 환경이다.

대신, repl.it에서는 파이썬만 사용하는 것이 아닌 그 이외의 프로그래밍언어들을 모두 사용할 수 있는 환경을 제공한다.

 

온라인 개발 환경인만큼 당연히 ipad에서 뿐만 아니라 컴퓨터/노트북에서도 사용을 할 수 있다는 장점이 존재한다.

 

최근에 아이패드(ipad pro 5세대 12.9형)를 활용할 일이 많아지면서, 코딩도 아이패드로 하고 싶다는 생각이 들었다.

전에 네이버 부스트코스에서 사용할 수 있는 어플을 추천받았던 것은 가장 대표적인 파이썬 프로그래밍이 가능한 어플인 Pythonista 3이다.

https://apps.apple.com/kr/app/pythonista-3/id1085978097

 

‎Pythonista 3

‎Pythonista is a complete scripting environment for Python, running directly on your iPad or iPhone. It includes support for both Python 3.6 and 2.7, so you can use all the language improvements in Python 3, while still having 2.7 available for backwards

apps.apple.com

다만 아쉽게도(?) 유료라는 점이 존재한다. (무려 12000원이라는 가격)

Pythonista 3

물론, 유료인만큼 다양한 기능들이 탑재되어있는 것 같긴 한다.

 


 

 

그런데 많은 사람들이 그렇듯, 무료로 사용할 수 있으면서 야무지게 사용이 가능한 어플들도 존재한다.

그중에서 가장 먼저 추천하고, 최근에 컴퓨터 비전을 공부하면서 numpy를 사용하고 있는데, 잘 활용하고 있는 어플인 Carnets - Jupyter 라는 어플이다.

https://apps.apple.com/kr/app/carnets-jupyter/id1450994949

 

‎Carnets - Jupyter

‎Jupyter notebooks are a powerful tool used in education and research. You can write small snippets of Python code and observe the result on screen, combine with paragraphs of text, using Markdown. Carnets provides a complete, stand-alone, implementation

apps.apple.com

 

Carnets - Jupyter

놀랍게도 jupyter notebook을 사용할 수 있는 어플이다.

별도의 로그인도 필요가 없다.

또한, .ipynb 확장자명으로 파일이 저장까지 되기 때문에 매우 좋은 어플이고 강력 추천하는 어플이다.

(무엇보다 무료다!)

 


 

추가로 하나 추천하고 싶은 어플은 Sololearn이라는 어플이다.

https://www.sololearn.com/home

 

Sololearn: Learn to Code

Join Now to learn the basics or advance your existing skills

www.sololearn.com

Sololearn

이 어플은 단순히 파이썬을 위한 어플이 아니다.

C언어에서부터, HTML, CSS, C++, Java, Javascript, python 등 매우 다양한 언어들을 다 사용할 수 있으며, 

프로그래밍용이라기보다는 프로그래밍 공부용이다.

커뮤니티도 나름 커서 사용자 간에 원하는 프로그래밍 언어로 퀴즈 대결도 가능한 기능이 있다.

물론, 코딩을 간단하게나마 해서 바로 출력 결과도 확인할 수 있는 기능도 있다.

간단히 생각하면 Stackoverflow의 미니버전이랄까?

아무튼 언어의 기초를 배우고자 하는 분들께서는 이 어플을 사용해도 충분히 괜찮을 것이라고 생각된다.


코드가 조금 길고 조잡하긴 하지만....

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import sys
exist = []
cnt = 0
for i in range(8):
    exist.append(sys.stdin.readline())
    if i % 2 == 0:
        j = 0
        for j in range(8):
            if j % 2 == 0:
                if exist[i][j] == 'F':
                    cnt += 1
                    j += 1
    else:
        j = 0
        for j in range(8):
            if j % 2 == 1:
                if exist[i][j] == 'F':
                    cnt += 1
                    j += 1
print(cnt)
 
cs

이런 식으로 나는 일단 첫 번째 try에서 문제를 해결했다.

다만, 시간이 84ms로 조금은 느린 시간대를 가졌다.

당연히, 그럴 수밖에 없는 것은, 이중 for문에 의해서 반복이 여러 번 돌아야 하고, if문도 여러 개 있어서 각각에 대한 조건을 찾는 데 있어서 시간이 걸리기 때문이다.


이를 조금 해결할 수 있는 부분은 다음의 코드처럼 range()의 값에 조건을 주면 된다.

1
2
3
4
5
6
7
8
9
10
11
12
count = 0
for i in range(1,9):
    n = input()
    if i % 2 == 1
        for k in range(0,7,2):
            if n[k] == 'F':
                count += 1
    else:
        for k in range(1,8,2):
            if n[k] == 'F':
                count += 1
print(count)
cs

이렇게 range()에 건너뛰기의 조건을 주게 되면, 별도로 j라는 변수를 만들지 않아도 되며, if 조건문도 줄일 수 있게 된다.

실행시간 또한 68ms 정도로 확 줄어드는 것을 볼 수 있게 된다.

 

 

 

문제 출처: https://www.acmicpc.net/problem/1100

 

1100번: 하얀 칸

체스판은 8*8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램

www.acmicpc.net

파이썬 공부를 하면서 백준도 동시에 조금씩 건드리게 되는데, 이때 실행시간에 대해서도 고려를 해야 하는 순간이 온다.

또한, 단순히 문제를 푸는 것에 그치지 않고, 더 효율적인 코드를 위해서 시간을 고려하게 되면 실행시간에 관심을 더 가지게 된다.

 

파이썬의 경우, 다양한 방법으로 실행시간을 확인하고 실행창에서 나타나게 할 수 있다.

 

1. 다양한 IDE는 각각의 유용한 plugin들을 가진다. atom의 경우, hydrogen이나 script, 혹은 atom-python-run 패키지들이 있다. 이 중에 atom-python-run이 실행시간을 나타내 준다.

그리고 pycharm의 professional을 사용할 경우 다음 사진과 같은 부분이 초록색으로 띄면서 실행시간도 같이 보여준다고 한다 (직접 해보지는 못했지만 그러하고 한다...).

아무튼, 다양한 plugin들 중에서 실행시간이 나오는 것을 고르면 된다.

 


 

2. Unix로 된 시스템 혹은 Window에서 git bash로 실행할 경우:  time python ./your_script.py 

사실 이 부분을 추천한다.

real time, use time, sys time이 모두 깔끔하게 표시가 된다.

그리고 백준에서 가끔 시간 초과가 나는 경우, input()을 import sys를 통해 sys.stdin.readline()으로 바꿔서 제출하는 경우가 있는데, 이때 sys time을 보면 된다.

(코드 출처: https://stackoverflow.com/questions/65276859/how-to-add-execution-time-in-atom-terminal)

 

how to add execution time in atom terminal

script output panel doesn't take input from user so I have to use the platformio terminal plugin in atom but it doesn't show the program finished time or execution time, I know, there are some pack...

stackoverflow.com

time python ./your_script.py 

 

 


 

3. 직접 코드에 시간 차이를 계산하도록 하는 코드를 넣어주면 된다.

1
2
3
4
import time
start_time = time.time()
main()
print("--- %s seconds ---" % (time.time() - start_time))
cs

 

(코드 출처: https://stackoverflow.com/questions/1557571/how-do-i-get-time-of-a-python-programs-execution)

 

How do I get time of a Python program's execution?

I have a command line program in Python that takes a while to finish. I want to know the exact time it takes to finish running. I've looked at the timeit module, but it seems it's only for small

stackoverflow.com

+ Recent posts