알고리즘 50

(파이썬) 백준 알고리즘 - 11650번, 11651번 / sort(), lambda 함수

좌표 정렬하기 https://www.acmicpc.net/problem/11650 11650번: 좌표 정렬하기 첫째 줄에 점의 개수 N (1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에는 i번점의 위치 xi와 yi가 주어진다. (-100,000 ≤ xi, yi ≤ 100,000) 좌표는 항상 정수이고, 위치가 같은 두 점은 없다. www.acmicpc.net 좌표를 정렬하는 기준은 1. x좌표 오름차순 2. x좌표가 같을경우 y좌표 오름차순 이다. sort()함수는 사용자가 직접 정렬 기준을 정할 수 있어서 sort()를 사용해 코드를 작성했다. 1 2 3 4 5 6 import sys N = int(input()) coords = [list(map(int, sys.stdin.read..

알고리즘 2021.08.27

(파이썬) 백준 알고리즘 - 1427번

소트인사이드 https://www.acmicpc.net/problem/1427 1427번: 소트인사이드 첫째 줄에 정렬하고자하는 수 N이 주어진다. N은 1,000,000,000보다 작거나 같은 자연수이다. www.acmicpc.net 각 자리수를 내림차순으로 정렬하기 때문에 두자리 이상의 수를 고려할 필요 없이 입력받은 문자 배열을 정렬한 후 출력해주면 된다. 1 2 3 N = list(input()) N.sort(reverse=True) print(''.join(N)) cs 문자열로 입력받아서 각 자리를 따로 list에 넣고, sort()로 정렬해준다. 문자로 정렬해도 아스키코드가 문자'1'은 48, 문자'9'는 57로 어차피 숫자 순서대로 정렬되기 때문에 굳이 숫자로 바꿔줄 필요가 없다. sort의..

알고리즘 2021.08.26

(파이썬) 백준 알고리즘 - 2108번 / Counter

통계학 https://www.acmicpc.net/problem/2108 2108번: 통계학 첫째 줄에 수의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 단, N은 홀수이다. 그 다음 N개의 줄에는 정수들이 주어진다. 입력되는 정수의 절댓값은 4,000을 넘지 않는다. www.acmicpc.net 입력받는 수의 개수(N)가 최대 500,000개까지 가능하므로 빠른 입력을 위해 sys.stdin.readline()을 사용했다. 평균값, 중간값, 범위는 쉽게 구할 수 있었는데 최빈값은 collections 모듈을 사용해서 처리했다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import sys from collections import Counter N = int(in..

알고리즘 2021.08.26

(파이썬) 백준 알고리즘 - 10989번

수 정렬하기 3 https://www.acmicpc.net/problem/10989 10989번: 수 정렬하기 3 첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다. www.acmicpc.net 수 정렬하기 2번과 다르지 않은 문제라고 생각했는데 똑같은 방식으로 코드를 작성하면 '메모리 초과'가 떴다. 다른 방법을 알아보았다. 1 2 3 4 5 6 7 8 9 import sys N = int(sys.stdin.readline()) numbers = [0] * 10001 for _ in range(N): numbers[int(sys.stdin.readline())] += 1 for i in ..

알고리즘 2021.08.25

백준 알고리즘(파이썬) - 2751번

수 정렬하기 2 https://www.acmicpc.net/problem/2751 2751번: 수 정렬하기 2 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. www.acmicpc.net 이전에 풀었던 수 정렬하기 문제와 다를 것이 없다고 생각했다. 그런데 이 문제는 매우 많은 개수(1 ≤ N ≤ 1,000,000)의 데이터를 입력받기 때문에 2초의 제한시간을 초과하지 않는 것이 중요했다. 선택정렬의 경우는 시간복잡도가 O(n²)이고 병합정렬은 시간복잡도가 O(nlogn)이니까 병합정렬로 정렬 방법을 바꿔서 시도해봤다. 병합정렬은 그룹을 작게 나눈 다음 ..

알고리즘 2021.08.25

백준 알고리즘(파이썬) - 2750번 / 선택정렬

수 정렬하기 https://www.acmicpc.net/problem/2750 2750번: 수 정렬하기 첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다. www.acmicpc.net 힌트에 시간 복잡도가 O(n²)인 정렬 알고리즘으로 풀 수 있습니다. 예를 들면 삽입 정렬, 거품 정렬 등이 있습니다. 라고 적혀있어서 내가 알고있는 선택정렬으로 코드를 작성했다. 선택정렬 방법은 아래와 같다. 1 2 3 4 5 6 7 8 9 10 11 12 N = int(input()) numbers = [] for _ in range(N): numbers.append(int(input())..

알고리즘 2021.08.25

백준 알고리즘(파이썬) - 1436번 / in, not in(포함연산자)

영화감독 숌 https://www.acmicpc.net/problem/1436 1436번: 영화감독 숌 666은 종말을 나타내는 숫자라고 한다. 따라서, 많은 블록버스터 영화에서는 666이 들어간 제목을 많이 사용한다. 영화감독 숌은 세상의 종말 이라는 시리즈 영화의 감독이다. 조지 루카스는 스타 www.acmicpc.net 666이 연속으로 들어가는 숫자들을 차례대로 찾아야 한다. 처음에는 666을 고정시켜 놓고 _666, _ _666 과 같이 빈 칸에 수를 배열할까 생각했다. 그런데 이렇게하면 _666_과 같은 경우를 따로 생각해줘야 하기 때문에 모든 수를 순서대로 탐색하는 방법으로 코드를 작성했다. 1 2 3 4 5 6 7 8 9 N = int(input()) num = 666 while True:..

알고리즘 2021.08.24

백준 알고리즘(파이썬) - 1018번

체스판 다시 칠하기 https://www.acmicpc.net/problem/1018 1018번: 체스판 다시 칠하기 첫째 줄에 N과 M이 주어진다. N과 M은 8보다 크거나 같고, 50보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에는 보드의 각 행의 상태가 주어진다. B는 검은색이며, W는 흰색이다. www.acmicpc.net 다시 칠하기 위한 칸 수를 구하는데 쉽게 구하는 방법을 생각해봤지만 결국 모든 경우의 수를 확인하는 쪽으로 코드를 작성했다. 이런식으로 하나하나 옮겨가며 확인해야 한다. 여기에서 배열을 확인하는 시작점을 (a, b)라고 설정하고, 아래의 코드를 작성했다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 N, M = map(int, input()..

알고리즘 2021.08.24

백준 알고리즘(파이썬) - 7568번

덩치 https://www.acmicpc.net/problem/7568 7568번: 덩치 우리는 사람의 덩치를 키와 몸무게, 이 두 개의 값으로 표현하여 그 등수를 매겨보려고 한다. 어떤 사람의 몸무게가 x kg이고 키가 y cm라면 이 사람의 덩치는 (x, y)로 표시된다. 두 사람 A 와 B의 덩 www.acmicpc.net 덩치 등수는 자신보다 더 "큰 덩치"의 사람의 수로 정해진다. 만일 자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다고 정의되어 있다. 그대로 코드를 작성했다. 1 2 3 4 5 6 7 8 9 10 N = int(input()) body = [] for _ in range(N): body.append(list(map(int, input().split(..

알고리즘 2021.08.23

백준 알고리즘(파이썬) - 2231번

분해합 구하기 https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 분해합을 구하는 것은 작성할 수 있겠는데 생성자는 어떻게 해야할지 막막했다. 어떤 범위의 수들을 확인해야할지 감이 오지 않아서 검색을 통해 코드를 작성했다. 1 2 3 4 5 6 7 8 9 10 N = int(input()) result = 0 for i in range(1, N+1): A = list(map(int, str(i))) result = i ..

알고리즘 2021.08.23