TIL. for와 Range. 알고하면 꿀잼.

오늘은 알고리즘 문제풀이를 하는건데, 크게 2가지를 정리해보려합니다.
1. 문제풀이보다는 for 문을 이용해야하는 상황.(len은 언제쓰고 리스트는 언제쓰고.. 딕셔너리 셋은?
2. 각각 출력되어 나오는 값들은 어떻게 볼 수 있을까?

  • 들어가며 : 알고리즘 문제풀이를 하는데 있어서 가장 중요한 것은 물론 로직이지만, 그 로직을 구현하려면 각각 자료구조를 활용하고, 메소드 들을 활용하는 일 또한 그만큼 중요하다는 것을 느끼는 요즘입니다. 오늘부터 파운데이션 과정이 끝났지만 제가 부족했던 개념들인 for문을 도는 각각 자료구조들의 특성과 결과 값에 대하여 다시한번 정리해보는 시간을 가지려합니다.
  1. for 문을 도는데 있어서, 가장 중요한 점 중 하나는 왜 나는 for문을 선택했고, range를 어떻게 줄 것이냐. 일 것입니다. 저는 여기서 무작위로 뽑는지, 아니면 모든 것을 검사하고 싶은지. 일때 for문을 돈다고 생각합니다. 예를들어, 아래의 문제에서 가장 큰 값을 찾는다고 할때 모든 변수를 뽑아 비교해야하기때문에, 저는 for문을 돌릴겁니다.

  2. 그럼 for문을 돌릴때 두번째 주의해야할점은 range를 선택하는 겁니다. for문은 기본적으로 범위를 주어야 루프를 도는데, 이때 내가 부여한 범위에따라 결과값이 달라집니다. 예를들어 그냥 기본리스트를 범위로 주면, 리스트안의 요소가 하나하나 루프를 돌아 하나씩 뽑히는 루프를 돌 것이고,

    리스트의 길이를 주면, for i in range(len(list))의 형태가 될 것이고, 리스트의 인덱스하나가 뽑힐 것입니다. 왜냐하면 len(list)는 말그대로 list의 길이 그자체 (int이기 때문이죠).

  3. 그럼 다른 자료구조들은 어떨까요? 여러가지가 있겠지만 저는 set, dictionary를 한번 돌려보겠습니다.
    set은 무작위 호출을 하고 싶을때 사용합니다.

dictionary는 순서대로 key값을 받아오고 싶을 때 레인지로 주면,(3.7부터 딕셔너리는 순서가 생겼다고 합니당)

또는 키콰 벨류를 동시에 호출하고 싶을때는, items라는 메소드를 쓰면 됩니당.

이렇게 성격들을 보고 코드를 뜯어보면 재밌겠죠? 한번 뜯어보시죵

문제

인자인 height는 숫자로 이루어진 배열입니다.그래프로 생각한다면 y축의 값이고,
높이 값을 갖고 있습니다.

아래의 그래프라면 height 배열은 [1, 8, 6, 2, 5, 4, 8, 3, 7] 입니다.

저 그래프에 물을 담는다고 생각하고, 물을 담을 수 있는 가장 넓은 면적의 값을 반환해주세요.

가정

배열의 길이는 2이상입니다.


저의 접근은 이렇습니다.

첫번째. 리스트 안의 2개의요소를 for문을 돌려 2개를 뽑는다.(2개의 요소를 뽑으려면, 이중 for문을 돌려야한다.

두번째. 뽑은 2개의 요소들의 인덱스 차이가 큰값과 각각의 요소중 작은 값을 곱해 리턴을 할 건데, 이때 인덱스를 호출하고 싶으니 len(height) 으로 range를 설정해줍니다. 두번째 호출할 인덱슨느 i뒤부터 보고싶으니, i번째 +1부터 끝까지로 레인지를 설정해줍니다. range(i+1, len(height)).

세번째. 그 값중 최댓값을 리턴하고 싶으니, max_value라는 변수에 값이 나올때마다 비교하여 max_value보다 값이 크면 그 값을 max_value에 할당해준다.(max_value보다 작으면 넣을 필요가 없다.)

def get_max_area(height):

  max_value = 0
  for i in range(len(height)-1):
    for j in range(i+1, len(height)):
      
      if height[i] < height[j]:
        value = height[i] * (j-i)
 	  
      else:
        value = height[j] * (j-i)
      
      if max_value < value:
        max_value = value
  
  return max_value

좋은 웹페이지 즐겨찾기