TIL - 2023.07.24

배엘리·2023년 7월 24일
0

TIL

목록 보기
13/23

📝 오늘 공부한 내용

TabPFN

  • 테이블 형태의 데이터를 분류하는 트랜스포머
  • less than a second로 분류가 가능하고
  • 하이퍼 파라미터 튜닝이 필요 없다

Prior-Data Fitted Network (PFN)

  • PFN은 Bayesian inference를 활용하여 synthetic 데이터셋을 만들어 낸다

그리디 - 프로그래머스 체육복

프로그래머스 > 탐욕법 > 체육복

(왜 이게 탐욕법일까?)

아이디어

  1. 학생 수만큼의 list를 만든다.
    리스트는 전부 1로 초기화 한다.
    1은 체육복이 한 벌 있다는 뜻을 나타낸다.
# 초기 설정을 체육복이 있다 = 1로 설정하자
    cloth = [1 for i in range (n)]
  1. reserve와 lost를 정렬한다.
    여기서 그리디 --> 앞에서부터 하나씩 순서대로 나눠주고 싶다.
	reserve.sort()
    lost.sort()
  1. reserve와 lost사이 공통된 아이들을 빼준다.
# lost와 reserve에 공통된 애들을 빼줘야됨
    common = list(set(reserve).intersection(lost))
    reserve = [item-1 for item in reserve if item not in common]
    lost = [item-1 for item in lost if item not in common]
  1. 여분의 체육복을 가지고 있는 아이들은 +1 해준다.
    여기서 for loop을 돌 수 있게 리스트 맨 끝에 1을 추가해준다. (단순히 범위를 벗어나지 않게 추가하는 것)
for i in range (len(reserve)):
        cloth[reserve[i]] += 1 
    cloth.append(1)
  1. 체육복이 없는 애들을 0으로 지정한다.
  # 체육복이 없는 애들을 0 지정하자
    for i in range (len(lost)):
        cloth[lost[i]] = 0
  1. for loop으로 돌면서
    앞 뒤가 0인 경우 && 현재 내가 여분의 체육복이 있을 경우 0을 +1 해주고 여분의 체육복 -1 해준다.
 for i in range (len(reserve)):
        # 범위에서 뒤가 없다면
        if reserve[i]+1 > n:
            continue
        else:
            # 앞 번호에 있는 애한테 빌려주기
            if cloth[reserve[i]] > 1 and cloth[reserve[i]-1] == 0:
                cloth[reserve[i]-1] = 1
                cloth[reserve[i]] -= 1
                
            # 뒷 번호에 있는 애한테 빌려주기
            if cloth[reserve[i]] > 1 and cloth[reserve[i]+1] == 0:
                cloth[reserve[i]+1] = 1
                cloth[reserve[i]] -= 1
  1. 0의 갯수를 세어 (체육복이 없는 학생) 전체 학생 수에서 빼준다.
    num_true = Counter(cloth)
    # 앞 뒤를 빼준다
    answer = num_true[0]
    
    return n - answer

전체 코드

from collections import Counter

def solution(n, lost, reserve):
    answer = 0
    # 초기 설정을 체육복이 있다 = 1로 설정하자
    cloth = [1 for i in range (n)]
        
    reserve.sort()
    lost.sort()
    
    # lost와 reserve에 공통된 애들을 빼줘야됨
    common = list(set(reserve).intersection(lost))
    reserve = [item-1 for item in reserve if item not in common]
    lost = [item-1 for item in lost if item not in common]
    
    for i in range (len(reserve)):
        cloth[reserve[i]] += 1 
    cloth.append(1)
    
    # 체육복이 없는 애들을 0 지정하자
    for i in range (len(lost)):
        cloth[lost[i]] = 0
    
    for i in range (len(reserve)):
        # 범위에서 뒤가 없다면
        if reserve[i]+1 > n:
            continue
        else:
            # 앞 번호에 있는 애한테 빌려주기
            if cloth[reserve[i]] > 1 and cloth[reserve[i]-1] == 0:
                cloth[reserve[i]-1] = 1
                cloth[reserve[i]] -= 1
                
            # 뒷 번호에 있는 애한테 빌려주기
            if cloth[reserve[i]] > 1 and cloth[reserve[i]+1] == 0:
                cloth[reserve[i]+1] = 1
                cloth[reserve[i]] -= 1
               
    num_true = Counter(cloth)
    # 체육복이 없는 학생 수
    answer = num_true[0]
    
    return n - answer

🌷 느낀점

오늘은 트랙이 나뉘고 첫 날이다! 앞으로도 더 열심히 꾸준히 달려야 하는데 TIL, 기술블로그도 하나하나 차근차근 써보려고 한다. 그동안은 집에 오면 헤롱헤롱이라 집중을 못했는데 이제는 스플에서 다 적고 가야지.

알고리즘은 개인적으로 많이 어려워지는 것 같다. lv1문제라니 솔직히 믿기지는 않지만 그래도 천천히 반례도 많이 생각해보고 예시도 많이 생각해보면서 공부하면 해결되는 것 같다.

앞으로 공부하고 싶은게 많은데 시간 분배를 어떻게 해야할지 고민을 많이 해봐야겠다. 운동도 이제야 조금 꾸준히 나갈 수 있게 된 것 같아서 이 흐름을 잃지 않았으멶 좋겠다. :D

1개의 댓글

comment-user-thumbnail
2023년 7월 24일

좋은 정보 얻어갑니다, 감사합니다.

답글 달기