728x90
반응형

저번에 푼 적이 있는 문제인데 그때도 해답을 봤는데 이번에도 풀지 못해서 해답을 봤다. 이해를 완전히 못했나 보다.

이분 탐색 문제인데 count 함수가 핵심 부분이다. 나는 저 생각을 못해서 못 풀었다. 내일 다시 풀어봐야겠다. 

def count(li, m):
    cnt = 1
    t = li[0]
    for i in range(1, len(li)):
        if t + m <= li[i]:
            t = li[i]
            cnt += 1
    return cnt
          
          
def binarySearch(li, C):
    s, e = 1, max(li)
    while s <= e:
        m = (s + e) // 2
        if count(li, m) >= C:
            ans = m
            s = m + 1
        else:
            e = m - 1
    return ans
    
    
N, C = map(int, input().split())
li = sorted([int(input()) for _ in range(N)])

print(binarySearch(li, C))
728x90
반응형
728x90
반응형

집합을 사용한 방식

합집합을 사용하면 쉽게 풀 수 있다.

a, b = map(int, input().split())
s1, s2 = set(), set()
for _ in range(a):
    s1.add(input())
for _ in range(b):
    s2.add(input())
li = sorted(s1 & s2)

print(len(li))
for s in li:
    print(s)

 

이분 탐색을 사용한 방식

1) 집합을 사용한 방식과 속도가 비슷하다. input함수를 사용해서 입력을 읽는 게 시간이 오래 걸리는 것 같다.

def binarySearch(li, n):
    s, e = 0, len(li)-1
    while s <= e:
        m = (s + e) // 2 
        if li[m] == n:
            return 1
        if n > li[m]:
            s = m + 1
        else:
            e = m - 1
    return 0
    
    
a, b = map(int, input().split())
result = []
li1 = sorted([input() for _ in range(a)])
li2 = sorted([input() for _ in range(b)])
for s in li2:
    if binarySearch(li1, s):
        result.append(s)

print(len(result))
for c in sorted(result):
    print(c)

2) stdin.readline을 사용해서 해결했다. 이 방법이 훨씬 빠르다.

readline() 뒤에 rstrip을 사용하지 않으면 출력 형식이 잘못되었습니다 라는 결과가 나온다.

뒤의 공백이 출력되면 안 되는 것 같다.

from sys import stdin

a, b = map(int, input().split())
result = []
li1 = sorted([stdin.readline().rstrip() for _ in range(a)])
li2 = sorted([stdin.readline().rstrip() for _ in range(b)])
for s in li2:
    if binarySearch(li1, s):
        result.append(s)

print(len(result))
for c in sorted(result):
    print(c)

input -> 3784s, stdin.readline -> 280ms

 

728x90
반응형
728x90
반응형

10815번 숫자 카드 문제랑 비슷한데. 개수를 새야 한다는 점만 다르다.

이 문제는 이분 탐색 또는 딕셔너리를 사용해서 풀 수 있는데, 딕셔너리를 사용해서 푸는 게 효율적인 것 같다.

 

이분 탐색 풀이

1) 처음에 아래와 같이 풀어서 제출했었는데 시간 초과가 나왔었다.

많은 양의 값들을 리스트에 append 해서 시간이 오래 걸린 것 같다

def binarySearch(li, n):
    s, e = 0, len(li)-1
    while s <= e:
        m = (s + e) // 2 
        if li[m] == n:
            return li[s:e+1].count(n)
        if n > li[m]:
            s = m + 1
        else:
            e = m - 1
    return 0
    

N = int(input())
li1 = sorted(map(int, input().split()))
M = int(input())
li2 = list(map(int, input().split()))
result = []

for n in li2:
    result.append(binarySearch(li1, n))
print(*result)

2) 딕셔너리에 결괏값들을 저장했더니 해결되었다!

binarySearch 함수는 동일하다

N = int(input())
li1 = sorted(map(int, input().split()))
M = int(input())
li2 = list(map(int, input().split()))

d = {}
for n in li1:
    if n not in d:
        d[n] = binarySearch(li1, n)
        
print(' '.join(str(d[m]) if m in d else '0' for m in li2))

 

딕셔너리 풀이

압도적 성능을 자랑한다. 이분 탐색 풀이는 3000ms나 걸렸는데, 딕셔너리 풀이는 800ms 밖에 시간이 걸리지 않는다.

N = int(input())
li1 = list(map(int, input().split()))
M = int(input())
li2 = list(map(int, input().split()))
d = {}

for n in li1:
    d[n] = d.get(n, 0) + 1
print(' '.join(str(d[m]) if m in d else '0' for m in li2))

 

딕셔너리를 사용한게 압도적으로 빠름

728x90
반응형
728x90
반응형

이분 탐색은 정렬된 리스트에서 특정한 값의 위치를 찾아내는 알고리즘이다. 

리스트에서 어떤 특정 값(X)을 찾을 때, 리스트의 가운데 값(M)을 기준으로 비교하면서 탐색하는 방식인데

X가 M보다 크다면 리스트의 오른쪽 부분, X가 M보다 작다면 리스트의 왼쪽 부분을 사용 

-> 다시 가운데 값을 정의 -> 앞의 두 과정을 X == M일 때까지 반복하는 식이다.

def binarySearch(li, n):
    # s: 맨 앞 인덱스, e: 맨 뒤 인덱스
    s, e = 0, len(li)-1
    while s <= e:
        # m:가운데 인덱스
        m = (s + e) // 2 
        if li[m] == n: 
            return 1
        if n > li[m]:
            s = m + 1
        else:
            e = m - 1
    return 0

위 코드는 리스트(li)에 특정 값(n)이 있는지를 확인하는 이분 탐색 함수인데, 아래와 같은 방식으로 돌아간다.

예시

[1,2,3,4,5,6] 리스트에서 5를 찾는 상황인데 

첫 번째 중앙값보다 n이 더 크므로 리스트의 오른쪽 부분을 사용해서 다시 비교한다.

두 번째 중앙값은 5와 같으므로 반복문이 끝이 나는 식이다.

 

아래는 위의 이미지 같은 이분 탐색 과정을 출력해주는 코드이다.

def binarySearch(li, n):
    s, e = 0, len(li)-1
    i = 1
    while s <= e:
        m = (s + e) // 2 
        print("%d번째 반복" % (i))
        print("s: %d e: %d m: %d" % (s, e, m))
        print("n: %d li[m]: %d\n" % (n, li[m]))
        i += 1
        
        if li[m] == n:
            print("목표 찾음!")
            return 1
        if n > li[m]:
            s = m + 1
        else:
            e = m - 1
    print("목표 못찾음!")
    return 0


binarySearch([1, 2, 3, 4, 5, 6], 5)

 

참고로 python에는 bisect라는 이분 탐색 라이브러리가 존재해서 아래와 같은 방식으로 쉽게 사용할 수 있다!

import bisect
mylist = [1, 2, 3, 7, 9, 11, 33]
print(bisect.bisect(mylist, 3))

 

아래는 내가 풀었던 백준 알고리즘에 있는 이분 탐색 관련 문제들이다.

문제를 풀면서 직접 적용해보는 게 나는 이해가 훨씬 빨리 됐던 것 같다. 꼭 문제를 풀어보도록 하자!

 

백준 알고리즘 문제 풀이)

jinho-study.tistory.com/307

 

백준 알고리즘 1920번 수 찾기(python)

아주 기본적인 이분 탐색 문제이다! def binarySearch(li, n): s, e = 0, len(li)-1 while s <= e: m = (s + e) // 2 if li[m] == n: return 1 elif li[m] <= n: s = m + 1 else: e = m - 1 return 0 _ = int(inpu..

jinho-study.tistory.com

jinho-study.tistory.com/293

 

백준 알고리즘 10815번 숫자 카드(python)

간단한 이분 탐색 문제다 def binarySearch(li, n): s, e = 0, len(li)-1 while s <= e: m = (s + e) // 2 if li[m] == n: return 1 if n > li[m]: s = m + 1 else: e = m - 1 return 0 N = int(input()) li1 = so..

jinho-study.tistory.com

jinho-study.tistory.com/295

 

백준 알고리즘 10816번 숫자 카드 2(python)

10815번 숫자 카드 문제랑 비슷한데. 개수를 새야 한다는 점만 다르다. 이 문제는 이분 탐색 또는 딕셔너리를 사용해서 풀 수 있는데, 딕셔너리를 사용해서 푸는 게 효율적인 것 같다. 이분 탐색

jinho-study.tistory.com

jinho-study.tistory.com/296

 

백준 알고리즘 1764번 듣보잡(python)

집합을 사용한 방식 합집합을 사용하면 쉽게 풀 수 있다. a, b = map(int, input().split()) s1, s2 = set(), set() for _ in range(a): s1.add(input()) for _ in range(b): s2.add(input()) li = sorted(s1 & s2..

jinho-study.tistory.com

jinho-study.tistory.com/46

 

백준 알고리즘 1789번 수들의 합(python)

단순한 방식 입력보다 커지기 전까지 1, 2, 3, 4, 5... 를 계속 더하다가 마지막으로 더해진 값을 출력해주면 된다. 1부터 n까지 수의 합 = n * (n+1) // 2 n = int(input()) i = 1 while i * (i+1) // 2 <= n: i..

jinho-study.tistory.com

jinho-study.tistory.com/297

 

백준 알고리즘 2110번 공유기 설치(python)

저번에 푼 적이 있는 문제인데 그때도 해답을 봤는데 이번에도 풀지 못해서 해답을 봤다. 이해를 완전히 못했나 보다. 이분 탐색 문제인데 count 함수가 핵심 부분이다. 나는 저 생각을 못해서 못

jinho-study.tistory.com

jinho-study.tistory.com/298?category=911939

 

백준 알고리즘 1654번 랜선 자르기(python)

이분 탐색 문제이다. 2110번 공유기 설치와 비슷한 문제다. def count(li, m): cnt = 0 for n in li: cnt += (n // m) return cnt def binarySearch(li, K): s, e = 1, max(li) while s <= e: m = (s + e) // 2 if..

jinho-study.tistory.com

jinho-study.tistory.com/308

 

백준 알고리즘 2805번 나무 자르기(python)

이분 탐색을 활용해서 풀어야 되는 문제이다. 절단기의 높이가 m일 때 가져갈 수 있는 나무의 길이가 M 이상이면 절단기의 높이를 올려도 되므로 s = m + 1 작다면 높이를 내려야 하므로 e = m - 1을

jinho-study.tistory.com

jinho-study.tistory.com/309

 

백준 알고리즘 2512번 예산(python)

2805번 나무 자르기와 거의 똑같은 문제이다. 이제 이런 종류의 이분 탐색 문제는 익숙해진 건지 3분 만에 풀었다! def binarySearch(li, M): s, e = 1, max(li) ans = 0 while s <= e: m = (s + e) // 2 t = 0 fo..

jinho-study.tistory.com

jinho-study.tistory.com/311

 

백준 알고리즘 7795번 먹을 것인가 먹힐 것인가(python)

단순하게 A랑 B를 비교하면서 개수를 새면 시간 초과가 나와서 이분 탐색을 사용했다. 이분 탐색을 사용해 B에서 A의 한 요소(a) 보다 작은 수들 중에 제일 큰 수의 위치(인덱스)를 찾는 것이 핵심

jinho-study.tistory.com

jinho-study.tistory.com/338

 

백준 알고리즘 15641번 SUPER SUPER BINARY SEARCH DELUXE 2.5: THE LEGEND OF THE GOLDEN MAZASSUMNIDA, EPISODE 2: THE MAZWAET

1부터 100 사이의 숫자를 찍어서 맞춰야 되는 이상한 구데기 문제이다. 이분 탐색을 코드로 구현하는 게 아니라 직접 하게 만든다ㅋㅋㅋ 내 정답은 19였다.

jinho-study.tistory.com

jinho-study.tistory.com/494

 

백준 알고리즘 4623번 Copier Reduction(python)

단순 사칙연산 문제이다. 처음엔 아래 코드같이 풀었는데 통과가 안됐다. 뭐가 틀린 건지 아직 모르겠다. while 1: A, B, C, D = map(int, input().split()) if A == B == C == D == 0: break s1 = max(A, B)/max(..

jinho-study.tistory.com

jinho-study.tistory.com/685

 

백준 알고리즘 1072번 게임(python)

이분 탐색 문제이다. 100을 나중에 곱해주면 오차가 생겨서 틀린다. 먼저 곱해주고 //을 써서 나누도록 하자 x, y = map(int, input().split()) p = y*100//x s, e = 0, 1000000000 res = 0 while s <= e: m = (s+..

jinho-study.tistory.com

jinho-study.tistory.com/686

 

백준 알고리즘 1590번 캠프가는 영식(python)

이분 탐색 & 브루트포스 알고리즘 문제이다. 이분 탐색을 통해 각 버스별로 기다려야 되는 시간을 구하고, 버스를 탈 수 있는 경우가 없다면(res == []) -1을 출력 버스를 탈 수 있는 경우가 있다면

jinho-study.tistory.com

jinho-study.tistory.com/687

 

백준 알고리즘 2022번 사다리(python)

수학 & 이분 탐색 문제이다. 위 그림에서 w1 : c = w : h2, w2 : c = w : h1라는 점을 통해 w1 = c*w / h2, w2 = c*w / h1 w = w1 + w2 = c*w / h2 + c*w / h1 = c*w*(h1+h2) / (h1*h2) -> 1 = c*(h1+h2) /..

jinho-study.tistory.com

jinho-study.tistory.com/688

 

백준 알고리즘 2343번 기타 레슨(python)

이분 탐색 문제이다. 처음에 s를 1로 했다가 계속 틀렸다. 제일 긴 음악의 길이로 시작하는 게 맞다 -> s = max(li) def count(li, m): t = cnt = 0 for n in li: if t+n > m: cnt += 1 t = n else: t += n return..

jinho-study.tistory.com

jinho-study.tistory.com/689

 

백준 알고리즘 2417번 정수 제곱근(python)

이분 탐색 문제이다. 이분 탐색 안쓰고 그냥 반복문 돌려서 풀면 시간 초과가 나온다. n = int(input()) s, e = 0, int((2**63)**0.5)+1 res = 0 while s <= e: m = (s+e)//2 if m**2 >= n: res = m e = m-1 else:..

jinho-study.tistory.com

jinho-study.tistory.com/690

 

백준 알고리즘 2428번 표절(python)

이분 탐색 문제이다. 이제 이분 탐색에 조금 익숙해진 것 같다! N = int(input()) li = sorted(map(int, input().split())) res = 0 for i in range(N-1): s, e = i+1, N-1 t = -1 while s <= e: m = (s+e)//2 if..

jinho-study.tistory.com

jinho-study.tistory.com/691

 

백준 알고리즘 2776번 암기왕(python)

이분 탐색 문제이다. def bs(li, n): s, e = 0, len(li)-1 while s <= e: m = (s+e)//2 if li[m] == n: return 1 elif li[m] < n: s = m+1 else: e = m-1 return 0 for _ in range(int(input())): N = int(input()..

jinho-study.tistory.com

jinho-study.tistory.com/692

 

백준 알고리즘 3079번 입국심사(python)

이분 탐색 문제이다. N, M = map(int, input().split()) li = [int(input()) for _ in range(N)] s, e = 0, max(li)*M res = 0 while s <= e: m = (s+e)//2 t = sum([m//n for n in li]) if t >= M: res = m e = m..

jinho-study.tistory.com

jinho-study.tistory.com/693

 

백준 알고리즘 6236번 용돈 관리(python)

이분 탐색 문제이다. def count(li, m): t = cnt = 0 for n in li: if t+n > m: t = n cnt += 1 else: t += n return cnt+1 N, M = map(int, input().split()) li = [int(input()) for _ in range(N)] s, e = max(..

jinho-study.tistory.com

jinho-study.tistory.com/694

 

백준 알고리즘 13702번 이상한 술집(python)

이분 탐색 문제이다. N, K = map(int, input().split()) li = [int(input()) for _ in range(N)] s, e = 1, max(li) res = 0 while s <= e: m = (s+e)//2 t = sum(n//m for n in li) if t >= K: res = m s = m+1 e..

jinho-study.tistory.com

jinho-study.tistory.com/717

 

백준 알고리즘 1166번 선물(python)

이분 탐색 문제이다. N, L, W, H = map(int, input().split()) s, e = 0, max(L, W, H) for _ in range(10000): m = (s+e)/2 if (L//m)*(W//m)*(H//m) >= N: s = m else: e = m print("%.10f" %(e)) 처음에 아래같..

jinho-study.tistory.com

jinho-study.tistory.com/718

 

백준 알고리즘 19637번 IF문 좀 대신 써줘(python)

이분 탐색 문제이다. sys.stdin.readline 함수를 사용해서 입력을 받지 않으면 이분 탐색 알고리즘을 사용해도 시간초과가 나온다. import sys def bs(li, n): s, e = 0, len(li)-1 res = 0 while s <= e: m = (s+..

jinho-study.tistory.com

jinho-study.tistory.com/719

 

백준 알고리즘 16401번 과자 나눠주기(python)

이분 탐색 문제이다. M, N = map(int, input().split()) li = list(map(int, input().split())) s, e = 1, max(li) res = 0 while s <= e: m = (s+e)//2 if sum([n//m for n in li]) >= M: res = m s = m+1 else:..

jinho-study.tistory.com

jinho-study.tistory.com/720

 

백준 알고리즘 16564번 히오스 프로게이머(python)

이분 탐색 문제이다. def count(li, m): t = 0 for n in li: if n >= m: break t += m-n return t N, K = map(int, input().split()) li = sorted([int(input()) for _ in range(N)]) s, e = min(li), max(li)+K r..

jinho-study.tistory.com

jinho-study.tistory.com/721

 

백준 알고리즘 17245번 서버실(python)

이분 탐색 문제이다. 2차원 리스트의 총합과 최댓값을 알아야 문제를 풀 수 있어서 코드가 좀 길어진 것 같다. def count(li, m, N): t = 0 for i in range(N): for j in range(N): t += (m if m <= li[i][j] else..

jinho-study.tistory.com

jinho-study.tistory.com/822

 

백준 알고리즘 1300번 K번째 수(python)

의외로 이분 탐색으로 풀 수 있는 문제이다. 내일 다시 한 번 풀어봐야겠다. N, K = int(input()), int(input()) s, e = 1, K ans = 0 while s <= e: m = (s+e)//2 t = 0 for i in range(1, N+1): t += min(N, m//..

jinho-study.tistory.com

jinho-study.tistory.com/850

 

백준 알고리즘 18113번 그르다 김가놈(python)

이분 탐색 문제이다. 처음에 e를 max(li)-2*K로 설정하는 허튼짓을 하는 바람에 엄청나게 많이 틀렸다. s가 0이면 0으로 나눌 경우가 생길 수 있기 때문에 1로 시작해야 된다. PyPy3로 제출해야 통과된

jinho-study.tistory.com

jinho-study.tistory.com/961

 

백준 알고리즘 13777번 Hunt The Rabbit(python)

기본적인 이분 탐색 문제이다. while 1: n = int(input()) if n == 0: break s, e = 1, 50 while s <= e: m = (s+e)//2 print(m, end=' ') if m == n: break elif m < n: s = m+1 else: e = m-1 print()

jinho-study.tistory.com

jinho-study.tistory.com/956

 

백준 알고리즘 17266번 어두운 굴다리(python)

기본적인 이분 탐색 문제이다. def bs(li, m): if li[1]-li[0] > m: return 0 if li[-1]-li[-2] > m: return 0 for i in range(1, len(li)-2): if (li[i+1]-li[i])/2 > m: return 0 return 1 N, M = int(input()),..

jinho-study.tistory.com

jinho-study.tistory.com/1028

 

백준 알고리즘 15810번 풍선 공장(python)

이분 탐색 Or 우선순위 큐 문제라는데, 이분 탐색이 훨씬 효율적일 것 같아서 그냥 이분 탐색으로 풀었다. N, M = map(int, input().split()) li = list(map(int, input().split())) s, e = 0, max(li)*M res = 0..

jinho-study.tistory.com

 

728x90
반응형
728x90
반응형

간단한 이분 탐색 문제다

def binarySearch(li, n):
    s, e = 0, len(li)-1
    while s <= e:
        m = (s + e) // 2 
        if li[m] == n:
            return 1
        if n > li[m]:
            s = m + 1
        else:
            e = m - 1
    return 0
    
    
N = int(input())
li1 = sorted(map(int, input().split()))
M = int(input())
li2 = list(map(int, input().split()))
result = []

for n in li2:
    result.append(binarySearch(li1, n))
print(*result)
728x90
반응형
728x90
반응형

여름방학 때 학교에서 상금 같은 것이 들어왔길래 뭔가 했었는데 알고 보니 상을 받은 것이었다.

 만든 작품은 블로그에도 올라와있는 얼굴 인식 모자이크 프로그램이다.

처음에는 조금 삽질을 했었는데 좋은 경험이었던 것 같다.

현재는 사회복무요원을 하고 있다. 2022년 8월 31일... 소집 해제할 때에는 쓸만한 예비 개발자가 돼있으면 좋겠다.

우수상

728x90
반응형
728x90
반응형

같이 스터디하시는 분의 코드를 참고했다. 클래스를 사용해서 풀 생각은 하지 못했는데 코드를 보자마자 감명받았다.

_ = map(int, input().split())
g1 = [{'group': 1, 'name': ant} for ant in input()][::-1]
g2 = [{'group': 2, 'name': ant} for ant in input()]
ants = g1 + g2
T = int(input())

for _ in range(T):
    i = 0
    while i < len(ants) - 1:
        if ants[i]['group'] < ants[i + 1]['group']:
            ants[i], ants[i + 1] = ants[i + 1], ants[i]
            i += 1
        i += 1
        
print("".join([ant['name'] for ant in ants]))
728x90
반응형
728x90
반응형

각 행과 열마다 X가 안 들어있는 행, 열의 개수를 구하고 그중 큰 값을 출력해주면 된다.

EX) 입력이 ["XXX.", "X...", "....", "...."] 식이라고 하면

X가 안 들어있는 행의 개수: 2

X가 안 들어있는 열의 개수: 1 

-> max(2, 1) = 2 -> 2 출력 

n, m = map(int,input().split())
board = []

for _ in range(n):
    board.append(input())

a, b = 0, 0

for i in range(n):
    if "X" not in board[i]:
        a += 1

for j in range(m):
    if "X" not in [board[i][j] for i in range(n)]:
        b += 1

print(max(a ,b))
728x90
반응형
728x90
반응형

간단한 노가다 문제이다. 각 거리마다 리스트를 생성하고 리스트에 중복되는 요소가 있는지 확인. 없다면 놀라운 문자열이고 있다면 놀라운 문자열이 아니다. 

EX) 입력: AABB

1) 거리 0

li = ["AA", "AB", "BB"] -> 중복된 것이 없으므로 통과

2) 거리 1

li = ["AB", "AB"] -> 중복된 것이 있으므로 놀라운 문자열 아님

while 42:
    s = input()
    if s == '*':
        break
        
    state = 1
    for i in range(1, len(s)):
        li = []
        for j in range(len(s)-i):
            li.append(s[j] + s[j+i])
        for k in range(len(li)-1):
            if li[k] in li[k+1:]:
                state = 0
    if state:
        print("{0} is surprising.".format(s))
    else:
        print("{0} is NOT surprising.".format(s))
728x90
반응형
728x90
반응형

처음에 첫 번째 반복문에서 s1, s2 순서를 반대로 해서 틀렸었다. 

아무리 봐도 맞는 것 같았는데 틀려서 짜증 났는데 순서를 바꾸니 바로 해결됐다. 

s1, s2 = map(str, input().split())

for i in range(len(s1)):
    if s1[i] in s2:
        col = i
        row = s2.index(s1[i])
        break
    
for i in range(len(s2)):
    if i == row:
        print(s1)
    else:
        print('.'*col + s2[i] + '.'*(len(s1)-col-1))
728x90
반응형
728x90
반응형

입력으로 알파벳 하나와 문장이 들어오는데, 문장 안에 주어진 알파벳(소문자, 대문자)이 총 몇 개 들어있는지 구하면 되는 문제다.

lower, upper, count 메서드를 사용해서 쉽게 풀었다.  

while 42:
    t = input()
    if t == '#':
        break
    li = t.split()
    alpha_upper = li[0].upper()
    alpha_lower = li[0].lower()
    s = " ".join(li[1:])
    cnt = s.count(alpha_upper) + s.count(alpha_lower)
    print("{0} {1}".format(alpha_lower, cnt))
728x90
반응형
728x90
반응형

수학, 국어 숙제를 다 풀기 위한 최대 일수를 방학 총 일수에서 빼주면 된다.

L = int(input())
A = int(input())
B = int(input())
C = int(input())
D = int(input())

cnt = 0
while (A > 0 or B > 0):
    cnt += 1
    A -= C
    B -= D
    
ans = L - cnt
print(ans)
728x90
반응형
728x90
반응형

이런 DP 비슷한 문제들은 아직 어색해서 푸는데 오래 걸렸다.

변을 공유하는 현재 스티커를 고른다면 위 혹은 밑, 양옆의 스티커는 포기해야 하는데,

이전 대각선과 전전 대각선의 값을 현재 값과 각각 더해 비교하여 큰 값을 취하는 방식으로 문제를 풀었다.

for _ in range(int(input())):
    n = int(input())
    
    li = []
    for _ in range(2):
        li.append(list(map(int, input().split())))
    
    li[0][1] += li[1][0]
    li[1][1] += li[0][0]
    
    for j in range(2, n):
        li[0][j] += max(li[1][j - 1], li[1][j - 2])
        li[1][j] += max(li[0][j - 1], li[0][j - 2])
    
    ans = max(li[0][n - 1], li[1][n - 1])
    print(ans)
728x90
반응형
728x90
반응형

그 유명한 에라토스테네스의 체 문제이다. 

에라토스네테스의 체를 사용해 소수 리스트를 만들 때 K(입력) 번째 지우는 수를 구해야 하는 문제이다. 

소수 리스트를 생성하는 과정에서 변수(cnt) 하나만 추가해주면 된다.

N, K = map(int, input().split())  
cnt = 0  
nums = [True] * (N+1)  
for i in range(2, N+2):  
    for j in range(i, N+1, i):  
        if nums[j] == True:  
            nums[j] = False  
            cnt = cnt + 1  
            if cnt == K:  
                print(j)  
                break
728x90
반응형
728x90
반응형

수열이 등차인지 등비인지는 맨 처음 3개의 숫자들만 보면 알 수 있다. 

두 번째 숫자 - 첫 번째 숫자 = 세 번째 숫자 - 두 번째 숫자 -> 등차수열 

두 번째 숫자 / 첫 번째 숫자 = 세 번째 숫자 / 두 번째 숫자 -> 등비수열

이 점을 이용해서 등차라면 마지막 숫자에 li[1]-li[0] 만큼 더하고,

등비수열이라면 마지막 숫자에 li[1]//li[0] 만큼 곱해주면 된다.  

li = []
for _ in range(int(input())):
    li.append(int(input()))
    
ans = li[-1]
if li[2]-li[1] == li[1]-li[0]:
    ans += (li[1]-li[0])
elif li[2]//li[1] == li[1]//li[0]:
    ans *= (li[1]//li[0])

print(ans)
728x90
반응형

+ Recent posts