본문 바로가기

BOJ/Python

(192)
[BOJ/백준] 2303 - 숫자 게임 (Python) 문제문제링크N명에게 각각 다섯 장의 카드가 주어졌을 때, 세 장의 카드를 골라 합을 구한 후 일의 자리 수가 가장 큰 사람을 찾어러. 가장 큰 수를 갖는 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람을 출력하라. 풀이combinations()를 사용해 5장의 카드 중 3개를 선택하는 모든 조합을 구한다.그 세 수의 합을 10으로 나눈 나머지를 리스트에 저장해 그 중 max값을 return하는 함수를 작성했다. 가장 큰 수를 갖는 사람이 두 명 이상일 경우에는 번호가 가장 큰 사람을 선택하므로일의 자리수가 크거나 같을 때 승자와 승자의 일의 자리수를 갱신한다. 코드from itertools import combinationsdef subset(list): cand=[] for subset in c..
[BOJ/백준] 2057 - 팩토리얼 분해 (Python) 문제문제링크 음 아닌 정수 N이 주어졌을 때, 이 수를 서로 다른 정수 M(M ≥ 1)개의 팩토리얼의 합으로 나타낼 수 있는가 풀이factorial 함수를 통해 n보다 작은 수들을 리스트로 저장한다.subset 함수로 N을 팩토리얼의 합으로 나타낼 수 있는지 여부를 확인한다.길이 s를 1에서부터 len(list) (전체)까지 설정하고 combinations()로 리스트의 길이 s짜리 부분집합을 생성한다.부분집합의 합이 target, 즉 n과 같으면 YES를 출력하고, 모든 과정이 끝나도 return되지 않았으면 NO를 출력한다. 코드n=int(input())def factorial(n): f=[] for i in range(n+1): num=1 for j in range(1,i+1): ..
[BOJ/백준] 1418 - K-세준수 (Python) 문제문제링크어떤 자연수의 소인수중 최댓값이 K보다 크지 않을때 그 수를 K-세준수라고 부른다.N보다 작거나 같은 자연수 중에 K-세준수가 총 몇 개인가. 풀이에라토스테네스의 체를 사용해서 풀었다. 2부터 시작해 배수들을 지우면 남은 수는 모두 소수가 된다.어떤 소수 i가 j를 나눌 수 있으면 j의 소인수는 i이다.저장용 배열 primes에서 중첩 for문을 사용해 해당 index의 최대소인수가 저장된다.아래 코드를 보면 여러개의 소인수가 존재할 경우 가장 큰 소인수가 배열에 저장되는 것을 알 수 있다. 1일 경우는 따로 처리해야 하므로, 1이고 K가 1보다 같거나 클 경우 cnt를 증가시킨다.저장용 배열을 확인하면서 K보다 작거나 같은 경우에만 cnt를 증가시킨다. 코드N=int(input())K=int..
[BOJ/백준] 1251 - 단어 나누기 (Python) 문제문제링크단어를 세 개로 나눠 각각을 뒤집어 다시 합친다.이렇게 만들 수 있는 단어 중 사전순으로 가장 앞서는 단어를 출력하라. 풀이각 파트는 길이가 1 이상인 단어이므로, 중첩 for문을 사용하여 slicing한다.이를 인덱스를 활용해 뒤집어 합친 후 리스트에 추가한다.문자열로 이루어진 리스트를 정렬할 때 사전순으로 정렬되므로 맨 앞의 요소를 출력하면 된다. 코드s=input()length=len(s)words=[]for i in range(1, length-1): for j in range(i+1, length): A, B, C = s[:i], s[i:j], s[j:] new_word = A[::-1]+B[::-1]+C[::-1] words.append(new_word)words...
[BOJ/백준] 1065 - 한수 (Python) 문제문제링크어떤 양의 정수 X의 각 자리수가 등차수열을 이루면, 그 수는 한수이다.N보다 작거나 같은 한수의 개수를 구하라. 풀이수가 한자리이거나 두자리일 경우는 모두 각 자리가 등차수열을 이룬다.세자리수일 경우 각 자리는 수를 100으로 나눈 몫, 10으로 나눈 몫을 10으로 나눈 나머지, 10으로 나눈 나머지이다.등차 수열(a+c=2*b)일 경우에만 count를 증가시킨다.입력이 1000까지이므로 네자리수를 고려하지 않고 1000은 따로 처리를 해주는데, 1000은 등차수열이 아니므로 넘어간다. 코드N = int(input())count = 0for i in range(1, N + 1): if i
[BOJ/백준] 4673 - 셀프 넘버 (Python) 문제문제링크 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수이다.n을 d(n)의 생성자라고 할 때 생성자가 없는 숫자는 셀프 넘버라고 한다.10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하라. 풀이브루트포스 알고리즘으로 해결했다.각 자리 수의 합은 수를 str로 변환한 뒤 list로 만들어 자리수를 나누고 이를 각각 int형으로 다시 변환해 sum했다.이 수를 기존 수 i와 합해 생성자 리스트에 저장한다.이때 생성자 리스트에 없는 i만이 셀프 넘버이다. 코드n=[]for i in range(1, 10001): n.append(i+sum(list(map(int, list(str(i)))))) if i not in n: print(i)
[BOJ/백준] 4949 - 균형잡힌 세상 (Python) 문제문제링크문자열이 균형을 이루는 조건모든 "("는 ")"와만 짝을 이룬다.모든 "["는 "]"와만 짝을 이룬다.모든 오른쪽 괄호들은 자신과 짝을 이룰 수 있는 왼쪽 괄호가 존재한다.모든 괄호들의 짝은 1:1 매칭만 가능하다. 짝을 이루는 두 괄호가 있을 때, 그 사이에 있는 문자열도 균형이 잡혀야 한다.입력의 종료조건 "."이 입력되기 전까지의 문자열들의 괄호 균형이 잘 맞춰져 있는지 판단하라. 풀이위 균형 조건에 따라 괄호 균형 유무를 확인하는 함수를 작성했다.balance를 'yes'로 기본 설정한다. 각 문자열에서의 문자가 "(" 또는 "["이면 스택에 저장한다.문자가 오른쪽 괄호일 때, 스택이 비어있지 않고 마지막 원소가 이 문자의 짝일 때 그 마지막 원소를 스택에서 빼낸다.이때 스택에 원소가 ..
[BOJ/백준] 7568 - 덩치 (Python) 문제문제링크A의 몸무게가 B보다 무겁고 키가 B보다 크면 A는 B보다 덩치가 크다고 할 수 있다.자신보다 더 큰 덩치의 사람이 k명이라면 그 사람의 덩치 등수는 k+1이 된다.N명으로 이루어진 집단에서 각각의 덩치 등수를 출력하라. 풀이각 사람의 몸무게와 키를 tuple 형태로 입력받는다.중첩 for문을 사용하고 각 사람의 기본 rank는 1로 설정한다.만약 N명의 인원 중 현재 사람보다 덩치가 크면(몸무게와 키 모두 크면) rank는 증가한다. 코드N=int(input())xy=[tuple(map(int, input().split()))for _ in range(N)]for i in xy: rank=1 for j in xy: if i==j: continue elif i[0]