본문 바로가기

반응형

백준

[백준] 10815번 - 숫자 카드 (파이썬) 1. 문제 2. 코드 num = [0 for _ in range(20000000)] n = int(input()) n_list = list(map(int, input().split())) for i in n_list: num[i+10000000] = 1 m = int(input()) m_list = list(map(int, input().split())) for i in m_list: print(num[i+10000000], end = ' ') 3. 설명 주요 포인트는 -10000000 ~ 10000000까지의 숫자 범위이므로 총 20000000칸의 list를 만들어서 계산한다. 무슨 말인지 모르겠다면 아래의 예시를 보자. 즉 input이 5개 숫자이고, 5, 8, 9, -10, 10이라면 num[100.. 더보기
[백준] 10866번 - 덱 1. 문제 2. 코드 from collections import deque import sys deq = deque() n = int(input()) for i in range(n): s = sys.stdin.readline() #push_front if s[1] == 'u' and s[5] == 'f': s, num = s.split() num = int(num) deq.appendleft(num) #push_back elif s[1] == 'u' and s[5] == 'b': s, num = s.split() num = int(num) deq.append(num) #front elif s[0] == 'f': if len(deq) == 0: print(-1) continue print(deq[0]) #.. 더보기
[백준] 11718번 - 그대로 출력하기 (파이썬) 1. 문제 2. 코드 while True: try: n = input() if n == "": break print(n) except: break 3. 풀이 try, except를 사용하면 eof 가 나올 때 break를 할 수가 있다. 더보기
[백준] 1094번 - 막대기 (파이썬) 1. 문제 2. 코드 l = [1, 2, 4, 8, 16, 32, 64] n = int(input()) cnt = 0 for i in range(len(l)-1, -1, -1): if n >= l[i]: cnt += 1 n -= l[i] print(cnt) 3. 풀이 별 거 없는 문제이다. 64를 반으로 계속 잘랐을 때 나오는 막대의 길이(l 리스트)로 그리디처럼 풀면 된다. 더보기
[백준] 17213번 - 과일 서리 (파이썬) (feat. 중복조합 공식) 1. 문제 2. 코드 n = int(input()) m = int(input()) temp = m - n za = 1 mo = 1 for i in range(1, temp+n): za *= i for i in range(1, temp+1): mo *= i for i in range(1, n): mo *= i print(int(za/mo)) 3. 풀이 중복조합을 이용하는 문제. 중복조합 공식은 아래와 같다. 여기에서 n은 선택지의 개수를, k는 중복을 허용하여 선택할 개수를 의미한다. 예를 들어 3개 중 4개를 중복을 허용하여 뽑는다면 3H4이다. nHk = (k + n-1)! / k!(n-1)! 이다. 3H4 = 6! / 4!2! = 15가 된다. 참조 사이트는 https://kenadams.tistor.. 더보기
[백준] 3273번 - 두 수의 합 (파이썬) 1. 문제 2. 코드 n = int(input()) l = list(map(int, input().split())) x = int(input()) cnt = 0 l.sort() left = 0 right = n-1 while True: if l[left] + l[right] == x: cnt += 1 right -= 1 elif l[left] + l[right] > x: right -= 1 else: left += 1 if left >= right: break print(cnt) 3. 풀이 투포인터(left, right)를 사용하는 문제. 우선 받은 값을 정렬한다. l[left] + l[right]가 원하는 값이면 cnt를 증가시키고, right를 이동한다. 원하는 값보다 적으면 합이 더 커져야 하기 때.. 더보기
[백준] 1476 - 날짜 계산 (파이썬) 1. 문제 2. 코드 e, s, m = map(int, input().split()) cnt = 1 e_t = 1 s_t = 1 m_t = 1 while True: if e_t == e and s_t == s and m_t == m: break if cnt >= 7980: break e_t += 1 s_t += 1 m_t += 1 cnt += 1 if e_t == 16: e_t = 1 if s_t == 29: s_t = 1 if m_t == 20: m_t = 1 print(cnt) 3 .풀이 브루프포스 문제. 년도를 1부터 증가시키면서 값을 찾으면 된다. 더보기
[백준] 9237번 - 이장님 초대 1. 문제 2. 코드 n = int(input()) l = list(map(int, input().split())) l.sort() max_l = 0 for i in range(n): l[i] = l[i] - i if l[i] > max_l: max_l = l[i] print(max_l + n + 1) 3. 풀이 그리디와 정렬을 사용한 문제이다. 자라는 데에 오래 걸리는 나무부터 심었을 때, 모든 나무를 다 심고 나서도 자라는 데에 걸리는 시간을 구한다. l[i] - i l[i] - i 중 가장 큰 값을 찾고, 거기에 n+1을 해준다. 즉, 나무를 심는데에 걸리는 시간(n) + 나무 다 심고도 다 자라는 데까지 걸리는 시간 (l[i] - i) + 1 인 것이다. 더보기

반응형