시각화

250730_태블로 기초, 파이썬(pop())

baektree 2025. 7. 30. 20:51

요약/나만의 인사이트

  • while문을 써서 정답을 맞추더라도 인덱스 과정의 문제나 시간지연되면 오답처리 될 수 있다.
  • pop()은 리스트의 맨 마지막 요소를 빼와서 반환하는 함수이다.
  • for _ in range(m)은 0부터 m-1까지 반복하되, 따로 변수는 없는 것을 뜻한다. 따라서 동작을 여러번 수행해야 할 때 쓰인다. 예를 들어 pop()처럼 원본 리스트에서 요소를 반복해서 빼내어야 할 때

새롭게 알게 된 것

  • 태블로 데이터 결합
    • 데이터 원본
      • 로지컬 레이어 - 관계
        • 데이터가 실제로 결합한 것은 아님
        • table A, table B를 관계를 맺게 만들어 뷰에만 보이게 하는 것
      • 피지컬 레이어 - 조인 유니온
        • 실제로 결합하는 형태
    • 로컬의 데이터 데이터 원본1, 데이터 원본2를 결합할 때 ⇒ 블렌딩
      • 데이터 원본을 건드릴 수 없을 때
      • 무조건 left join으로 붙임
      • 다른 데이터 원본 2개를 붙이는 것과 같다.
      • e.g. 목표 매출에 넘었는지, 안남았는지? (원래 테이블 - 매출목표 테이블 혼합)
  • 라이브, 추출
    • 라이브
    • 데이터 원본을 수정하였을 경우 바로 반영이 됨
    • 추출성능이 라이브보다 좋음.
    • 추출 시점에 업데이트 하면 최신화된 데이터를 보여줄 수 있음.
    • 데이터를 사진찍는 것과 같음.
  • 태블로 필터로 사용예를 들어 대시보드에 A와 B시트가 있을 때 A시트에서 서울을 클릭하면 시트 B도 서울에 해당하는 데이터만 보여줄 수 있다. 이는 A시트에서 대시보드의 필터로 사용을 설정하면 가능하다.
  • 대시보드에 있는 하나의 시트에서 선택한 값을 같은 대시보드에 있는 다른 시트들에도 필터로 적용하게 만다는 기닝이다. 인터랙티브 필터 역할이다.

특히 어려웠던 것

  • 파이썬 과일장수 문제
    • 문제
    • 문제풀이
    • #가지고 있는 사과 중에 사과의 최대 점수 k 3
      #한 상자에 들어가는가는 사과의 개수 m 4
      #사과들의 점수 score [~~]
      #2(사과모음 중 최저) * 4(사과 개수) * 1(상자개수) = 이익 
      
      #요구사항
      #과일 장수가 얻을 수 있는 최대 이익? 
      
      #문제 로직생각해보기
      '''
      1 .사과를 m개만큼 뽑아야함
      2. 단 sort()로 내림차순 정렬한다음에 그중 4개를 뽑아서 apple에 담음
      3. apple중에 가장 작은 수를 뽑음 min() 
      4. min() 곱하기 사과 m개 
      5. score 갱신 남아있는 스코어의 len 요소가 m보다 크면 다시 한번 실행 / 즉 while len(score) >= m 일때만 함
      '''
      def solution(k, m, score):
          score.sort(reverse=True) #사과 점수 내림차순으로 정렬
          apple = []
          result = 0
          while len(score) >= m:
            box = score[:m] #사과를 점수가 높은 순부터 4개 뽑기
            result += min(box)*m #4개 뽑은 것 중에 가장 낮은 점수 곱하기 * 사과개수 
            del score[:m] #꺼낸 사과 제거
          return result
      
      solution(4, 3,[4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2])
      
    • 틀린 이유
      • 내가 한 방식 : m개 뽑고, score 리스트에서 제거하고 또 m개 뽑고 하는 방식
      • 즉 while 루프에서 score[:m]하고 del score[:m]하는 방식
      • 겉보기엔 맞아보이지만, 리스트를 직접 수정하면서 루프를 돌리면 인덱스가 꼬일 위험이 있음
      • 또한 파이썬 반복문 중에 리스트를 변경하는 건 비추라고 함
      • 실제로 시간 초과 떄문에 틀렸다고 나옴
    • 정답
      • 리스틀 갱신하지 않고 리스트에 있는 요소를 m간격으로 처리하는 방식이 좋다.
      • 즉 내림차순 저렬된 리스트를 앞에서부터 m개씩 정확히 묶어서, 남는 건 버리기
      • 이러면 인덱스는 유지되니까 안전함
      #요구사항 
      #과일장수가 최대로 얻을 수 있는 이익
      
      #데이터 보기
      #score : 사과의 점수들
      #m : 한 상자에 담기는 사과 개수
      #k : 점수의 최대값(별로 안중요함)
      
      #푸는 방법
      #사과 점수를 내림차순으로 정렬, 가장 높은 점수부터 m개씩 묶어 상자를 만들기
      #각 상자에서 가장 낮은 점수 * m이 상자의 가격
      #남는 사과 버림
      
      def solution(k, m, score):
      		score.sort(reverse=True)
      		result = 0 
      		
      		for i in range(0, len(score) - m + 1, m): 
      			result += min(score[i:i+m]) * m 
      			
      		return result
      
      
    • 특히 여러웠던 구문 해석
      • for i in range(0, len(score) - m + 1, m) ⭐⭐⭐⭐⭐
        • score[i:i+m]이 항상 m개를 포함해야 한다.
        • i + m ≤ len(score) 인 경우에만 유효하다.
        • 따라서 우리가 허용할 수 있는 마지막 i값은 i ≤ len(score) -m인 경우다.
        • 그런데 range()는 끝값을 포함 안하니 1을 더해준다.
        • m개씩 건너뛰면서 인덱스에 접근한다.
    • 다른풀이 - pop() 삭제후 반환하는 함수를 활용한 문제 풀이
    def solution(k, m, score):
    	score.sort() #오름차순 정렬 [1, 2, 3, 4]
    	result = 0
    	
    	while len(score) >= m:
    		box = [score.pop() for _ in range(m)] #pop()은 뒤에서부터 하나씩 꺼냄 box에 하나씩 담음
    		result += min(box) * m
    	
    	return result
    	
    # for _ in range(m) 0부터 m-1까지 m번 반복 그런데 (_)? 변수는 안씀 (단순 반복 횟수 세기용)
    # 따라서 단순히 score.pop()을 몇 번 실행할 건지 카운팅 해주는 것임 
    # 뒤에서부터 제거하니까 결론적으론 box에 내림차순 정렬됨