알고리즘 공부/BOJ백준 풀이
[백준 1065번-파이썬/Python] 한수
http://acmicpc.net/problem/1065 {코드} n = int(input()) if n < 100: print(n) else: cnt = 99 for i in range(100, n+1): d = tuple(map(int, str(i))) if d[0]-d[1] == d[1]-d[2]: cnt += 1 print(cnt) {설명} 이 문제는 등차수열인지 아닌지를 판별하는 문제입니다. 이때 몇 가지 방법을 통해 코드를 줄일 수 있는데 만약 N이 100보다 작다면 무조건 등차수열이므로 바로 N을 출력하면 됩니다. 또한 1000은 등차 수열이 될 수 없습니다. 그러면 결국 N보다 같거나 작은 세 자리 숫자들만 등차수열의 여부를 판별하면 됩니다. 판별 방법은 (백의 자릿수)-(십의 자릿수) =..
[백준 4673번-파이썬/Python] 셀프 넘버
http://acmicpc.net/problem/4673 {코드} numbers = {i for i in range(1, 10001)} generated = set() for i in range(1, 10001): i += sum(map(int, str(i))) if i > 10000: continue generated.add(i) [print(i) for i in sorted(list(numbers-generated))] {설명} 이 문제는 집합을 이용해서 풀 수 있습니다. 먼저 1부터 10000까지 반복하며 각 숫자의 d(n)들로 이루어진 집합을 만들면 해당 집합에는 셀프 넘버가 없습니다. 그러므로 1부터 10000까지의 수를 가진 집합에서 위의 집합을 빼면 셀프 넘버들로만 이루어진 집합이 만들어집니..
[백준 15596번-파이썬/Python] 정수 N개의 합
http://acmicpc.net/problem/15596 {코드} def solution(a): return sum(a) {설명} 이 문제는 함수를 배웠다면 굉장히 쉽게 풀 수 있는 문제로 a라는 리스트를 입력받으면 그 합을 반환하면 된다. *람다(lambda) 함수를 사용한 풀이를 여러 번 변형하며 제출해봤지만 런타임 에러가 뜨는 것을 보아 인식하지 못하는 듯하다.
[백준 4344번-파이썬/Python] 평균은 넘겠지
http://acmicpc.net/problem/4344 {코드} for _ in range(int(input())): n, *data = list(map(int, input().split())) avg = sum(data)/n cnt = 0 for score in data: if score > avg: cnt += 1 print('%.3f%%' %(cnt/n*100)) {설명} 첫 번째 줄을 제외한 각 줄에서 평균을 구한 다음 평균보다 점수가 높은 사람의 수를 구하는 문제이다. *퍼센트(%)를 출력하려면 %%를 사용해야 하며 "%.Nf"를 통해 N번째자리까지 출력할 수 있으며 자동으로 반올림한다.
[백준 8958번-파이썬/Python] OX 퀴즈
http://acmicpc.net/problem/8958 {코드} for _ in range(int(input())): quiz_answer = input() answer = 0 increment = 1 for ox in quiz_answer: if ox == 'X': increment = 1 else: answer += increment increment += 1 print(answer) {설명} 이 문제는 O가 연속될 수록 점수 증가폭이 1씩 증가하고 X가 등장하면 점수 증가폭이 1로 리셋되는 것을 파악하면 풀 수 있다. 입력받은 문자열(퀴즈의 답들)을 반복문에 넣어 만약 해당 문자(답)이 X면 증가폭을 1로 바꾸고 아니라면 점수에 증가폭을 더하고 증가폭에 1을 더한다.
[백준 1546번-파이썬/Python] 평균
http://acmicpc.net/problem/1546 {코드} input() data = list(map(int, input().split())) M = max(data) data = list(map(lambda d: d / M * 100, data)) print(sum(data)/len(data)) {설명} 이 문제는 간단한 사칙연산 문제로 4번째 줄의 람다 함수를 통해 퍼센트를 구하고 그 평균을 출력합니다.
[백준 3052번-파이썬/Python] 나머지
http://acmicpc.net/problem/3052 {코드} data = [int(input())%42 for _ in range(10)] diff = set(data) print(len(diff)) {설명} 이 문제는 집합(Set)을 통해 쉽게 풀 수 있습니다. 집합은 중복된 원소들을 한 개만 남기고 없애기 때문에 이런 문제에 사용하기 적합합니다. 각 입력을 42로 나눈 것을 저장하고 집합으로 만들어준 다음 해당 집합의 원소의 개수를 출력하면 됩니다.
[백준 2577번-파이썬/Python] 숫자의 개수
http://acmicpc.net/problem/2577 {코드} data = input()+input()+input() count = [0]*10 for i in data: count[int(i)] += 1 [print(i) for i in count] {설명} 이 문제는 입력된 세 숫자들에 0~9까지의 숫자가 각각 몇개씩 있는지 찾아내는 문제로 모든 입력을 문자열 한개로 받고 그 문자열을 반복하며 각 숫자의 개수를 리스트에 저장하며 풀 수 있다. {코드} from collections import Counter data = input()+input()+input() count = Counter(data) for i in range(10): print(0 if str(i) not in count els..
[백준 2562번-파이썬/Python] 최댓값
http://acmicpc.net/problem/2562 {코드} m, i = 0, 0 for j in range(9): n = int(input()) if n > m: m, i = n, j+1 print(m) print(i) {설명} 사실 이 문제는 배열에 저장하지 않아도 풀 수 있는 문제로 9번 반복문을 돌리며 가장 큰 값과 몇 번째 반복인지(해당 배열의 인덱스)를 저장해가며 반복이 끝나면 마지막으로 저장된 인덱스를 출력하면 됩니다. {코드} data = [int(input()) for _ in range(9)] print(max(data)) print(data.index(max(data))+1) {설명} 또다른 방법은 파이썬의 리스트 메서드를 사용하는 방법입니다. 리스트에는 index라는 메소드가 ..
[백준 10818번-파이썬/Python] 최소, 최대
http://acmicpc.net/problem/10818 {코드} input() data = list(map(int, input().split())) print(min(data), max(data)) {설명} 이 문제는 n개 만큼의 수를 입력받아 배열에 저장해 이 배열의 최솟값괴 최댓값을 출력하는 문제입니다. 파이썬에는 기본적으로 내장되어있는 min, max 함수가 있는데 이를 통해 굉장히 쉽게 문제를 풀 수 있습니다. 참고로 입력 첫줄의 n은 파이썬의 input은 줄단위로 입력받기 때문에 이번 문제에는 아무 쓰임이 없어 따로 저장하지 않습니다.