백준 35

[Python/파이썬] 백준 알고리즘 11651번 - 좌표 정렬하기 2

N = int(input()) coordinates = [] for _ in range(N): coordinates.append(list(map(int, input().split()))) # key=lambda를 이용해서 정렬할 기준을 x[1] 그리고 x[0]으로 잡음 coordinates.sort(key=lambda x: (x[1], x[0])) for co in coordinates: print(co[0], co[1]) sort함수의 key인자를 이용해 lambda로 정렬할 기준을 잡는 방법이다. N = int(input()) coordinates = [] for _ in range(N): a, b = map(int, input().split()) coordinates.append([b, a]) co..

[Python/파이썬] 정렬 알고리즘 정리 1 (삽입 정렬, 선택 정렬, 거품 정렬 / Insertion sort, Selection sort, Bubble sort) (백준 알고리즘 2750번 - 수 정렬하기)

Insertion sort, Selection sort, Bubble sort은 모두 시간 복잡도가 O(n^2)으로 한 family의 알고리즘이라고 한다. 이들을 가지고 '백준 알고리즘 2750번 - 수 정렬하기' 문제를 풀어보겠다. 물론 파이썬의 내장함수를 쓸 수도 있다. 하지만 문제의 의도가 그것이 아니기 때문에 정렬 알고리즘들을 가지고 풀어보겠다. Insertion Sort 알고리즘은 위와 같은 개념으로 정렬되는 알고리즘이다. ### N = int(input()) result = [] for _ in range(N): result.append(int(input())) for i in range(1, N): cursor = result[i] j = i while j ..

[Python/파이썬] 백준 알고리즘 7568번 - 덩치

브루트 포스 유형 문제이다. N = int(input()) sizeList = [] for _ in range(N): x, y = map(int, input().split()) sizeList.append((x, y)) for size in sizeList: rank = 1 for compare_size in sizeList: if size[0] < compare_size[0] and size[1] < compare_size[1]: rank += 1 print(rank, end=' ') 처음엔 너무 어렵게 접근했다. 사실은 문제에 답이 있었다. 바로 "N명의 집단에서 각 사람의 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다." 라는 문장에 답이 있었다. 그냥 간단하게 자기보다 몸무게와 키가..

[Python/파이썬] 백준 알고리즘 1929번 - 소수 구하기

M, N = map(int, input().split()) for i in range(M, N+1): primeNum = True if i == 1: primeNum = False else: for j in range(2, i): if i % j == 0: primeNum = False break if primeNum: print(i) 처음엔 위와 같이 풀었었다. 숫자 i 하나에 대해 2부터 i-1까지 나눠보면서 0으로 나누어 떨어지면 소수가 아니므로 이를 제외하는 방식으로 코드를 짰었다. 그러나 1929 문제에서 이 방식은 시간초과가 떴다. 그래서 구글링을 해보니 '에라토스테네스의 체'를 이용해 시간을 단축해야한다고 한다. 에라토스테네스의 체는 가장 대표적인 소수 판별 알고리즘이다. 에라토스테네스의 체..

[Python/파이썬] 백준 알고리즘 2869번 - 달팽이는 올라가고 싶다

개인적으로 풀면서 재밌었다. 그래서 포스팅하려고 한다. A, B, V = map(int, input().split()) pre_move = (V-A) // (A-B) remainder = (V-A) % (A-B) if remainder > 0: print(pre_move + 2) else: print(pre_move + 1) V길이의 막대의 정상에 도달하는 시점은 분명 낮일 것이다. 근데 여기서 중요시 생각해야 될 것은 막대의 정상에 도달하는 시점은 달팽이가 낮에 움직일 수 있는 최대의 거리만큼을 이동함과 동시에 도달하는 것이 아닐 수 있다는 것이다. 다시 말해서, 정상에 도달하고도 달팽이는 더 움직일 수 있지만 정상에 도달했기 때문에 멈추는 경우가 있을 수 있다는 것이다. 때문에 우선 나는 막대의 길이..

[Python/파이썬] 백준 알고리즘 1316번 - 그룹 단어 체커

N = int(input()) # 카운트를 처음부터 전체 단어의 개수인 N으로 두어 # 그룹 단어가 아닐 경우 하나씩 빼는 방식으로 접근할 것이다. cnt = N for _ in range(N): word = input() for idx in range(len(word)-1): # idx를 기준으로 앞뒤 단어가 다를 경우 if word[idx] != word[idx+1]: # idx 뒤쪽 인덱스의 문자열에서 word[idx+1] 문자가 포함되어 있는 지 확인 if word[idx+1] in word[:idx]: # 포함되어 있다면 연속해서 알파벳이 나타난게 아니므로 cnt를 하나 감소 (그룹 단어가 아니다) cnt -= 1 # 그리고 break로 for문 탈출(다음 단어로 넘어감) break print(..

[Python/파이썬] 백준 알고리즘 2908번 - 상수

주어진 세자리 수인 두 수를 비교해 더 큰 쪽을 출력하라는 문제이다. A, B = map(lambda num: num[::-1], input().split()) print(A) if A > B else print(B) input().split() 하면 주어진 두 세자리 수가 문자열 element이 된 리스트가 반환된다. map함수를 이용해 이 리스트(iterator)의 element들을 lambda num: num[::-1]라는 함수에 넣고 A와 B라는 변수에 각각 집어넣는다. lambda는 이름이 없는 함수로 함수를 한줄로 간단하게 표현할 수 있게 해준다. lambda (인자) : (표현식) B else print(B) 은 A>B인 경우 print(A)를 하고 반대의 경우 print(B)를 한다는 의미..

[Python/파이썬] 백준 알고리즘 1152번 - 단어의 개수

문제 자체는 굉장히 간단하다. 근데 다른 문제들의 평균 정답 비율이 40~60퍼인것에 비해 이 문제의 정답 비율은 29%라 다뤄봐야겠다고 생각해서 포스팅한다. print(len(input().split())) 한줄이다. 다른 분들의 코드를 보니 굉장히 복잡하게 푼 코드들도 많았다. 한 번 복잡하게 생각하면 복잡하게 접근하게 되는 문제인 것 같다..(그 때문에 정답 비율이 낮은 것 같다) 필자도 문제를 풀다가 딥하게 빠져 복잡하게 해결하고 나서 다른 분들의 풀이를 보고 허탈함을 느낄 때가 많았는데 알고리즘은 복잡하게 느껴질 수록 단순하게 생각하려는 연습이 필요한 것 같다. 1. 코드가 너무 복잡해진다 느끼면 단순하게 접근해보려고 노력하자 2. input().split()을 하면 리스트로 반환된다.

[Python/파이썬] 백준 알고리즘 1065번 - 한수

N = int(input()) if N < 100: # 1~99는 다 한수 print(N) else: cnt = 0 for i in range(100, N + 1): i = list(map(int, str(i))) if i[0] - i[1] == i[1] - i[2]: cnt += 1 print(99 + cnt) 입력값 N이 100보다 작다면 1~99는 다 한수이므로 그대로 출력한다. 만약 100보다 크다면 100부터 N까지 for문을 돌며 각 자리수가 등차수열을 이루는 지 확인하고 등차수열을 이룬다면(한수라면) cnt를 하나 증가시킨다. 그리고 그 cnt에 1~99를 포함하는 99를 더해 출력한다. 1. 정수 n의 각 자리수를 쪼개 리스트로 만들고 싶다면 list( map(int, str(n)) )하면..

[Python/파이썬] 백준 알고리즘 4673번 - 셀프 넘버

생성자가 없는 숫자가 '셀프 넘버' 이고 이 셀프 넘버들을 쭉 나열하는 프로그램을 짜보라는 문제이다. # 함수 d(n) def d(n): # 생성자 n을 이용해 d(n)을 만드는 수식 n = n + sum( map(int, str(n)) ) return n # 셀프 넘버가 아닌 수들(생성자가 있는 수들)이 들어갈 집합 nonSelfNum = set() # nonSelfNum 집합에 들어갈 수들을 찾아 넣기 for i in range(1, 10001): nonSelfNum.add( d(i) ) # 셀프 넘버들을 출력하기 for j in range(1, 10001): if j not in nonSelfNum: print(j) 먼저 프로그램의 구조는 다음과 같다. 1. 셀프 넘버가 아닌 수들(생성자가 있는 수..

반응형