목차
최소, 최대 (#10818)
- Hint
리스트를 이용하여 문제를 해결 시에 리스트에 입력되어지는 인자의 형식에 주의하기 리스트 끼리의 비교가 될수도 있고 정수 인자가 아닌 str 타입끼리의 비교가 될 가능성도 있다.
max 함수의 원리
lst = [123,141,24,12,31,2,3,14]
max_num = -1 (리스트의 값에 비해 너무 크지만 않으면 된다)
for num in lst:
if num > max_num:
max_num = num
input()
a = []
a.append(int(input().split()))
print(f'{min(*a)} {max(*a)}')
정수형 선언을 하지 않으면 어떨까?
input()
a = []
for i in input().split():
a.append(i)
print(min(a),max(a))
- Solution
리스트를 이용한 풀이
input()
a = []
for i in input().split():
a.append(int(i))
print(min(a),max(a))
첫 정수의 개수값은 상관이 없으므로 인자배정을 하지 않고 for 문의 반복 조건에 split()되어 나오는 인자를 받게 한다.
리스트에 추가 할 때마다 int 정수형 선언을 해주었다.
input()
a = list(map(int,input().split()))
print(min(a),max(a))
더 간단하게 써보자면 map 함수로 int 형으로 변환 후에 리스트를 만드는 방법도 있다.
숏코딩
print(min(s:=[*map(int,[*open(0)][1].split())]),max(s))
역시 open을 사용하여 N 값을 무시하게 하고 출력을 시켰다.
최댓값 (#2562)
- Hint
입력이 줄바꿈이 되면서 입력되고 있다. 오히려 좋아
서로다른 정수 조건이 최대값의 위치를 찾는데 도움을 줄 수있다.
a.index(n) : a 리스트에서 n 값의 위치를 알려주는 함수
- Solution
리스트 이용한 풀이
a=[]
for i in range(9):
a.append(int(input()))
m=max(a)
print(m)
print(a.index(m)+1)
인덱스함수를 통해 얻어진 위치는 첫번째 항이 0 이라는 사실을 알아야한다.
숏코딩
print(*max((int(input()),i+1)for i in range(9)))
입력값의 최대값과 최대일때의 반복 횟수 i 를 리스트로 만들어서 바로 출력 해냈다.
숫자의 개수 (#2577)
- Hint
숫자를 더하기 위해서는 int 형식을
각 자리수를 구분하기위해서는 str 형식을 이용해야됨을 알아야한다.
- Solution
리스트를 이용한 풀이
from math import prod
a = list(str(prod((int(input())for i in range(3)))))
for n in range(10):
print(a.count(str(n)))
세 수의 곱은 int 형으로 진행하고 이를 다시 리스트에 각 자리수별로 따로 삽입하기 위해 list 함수는 str 형식만 지원하기 때문에 str로 변환후 list 함수로 a에 저장하였다. 이후에 str로 삽입된 리스트 인자와의 비교를 위해 반복문의 변수 n을 str 형식으로 변환하여 count함수를 통하여 개수를 셈한 후에 프린트 해주었다.
print(*map(str(prod(int(input())for i in range(3))).count,'0123456789'))
위의 식을 나름 숏코딩 해보았다. 하지만 open을 이용한 방식보다는 길었다.
나머지 (#3052)
- Problem
두 자연수 A와 B가 있을 때, A%B는 A를 B로 나눈 나머지 이다. 예를 들어, 7, 14, 27, 38을 3으로 나눈 나머지는 1, 2, 0, 2이다.
수 10개를 입력받은 뒤, 이를 42로 나눈 나머지를 구한다. 그 다음 서로 다른 값이 몇 개 있는지 출력하는 프로그램을 작성하시오.
- Hint
1. 리스트 형식으로 저장하여 하나하나 비교후에 count 변수를 증감시켜 중복 개수를 얻어 계산하는 방법
2. 수학적으로 생각하여 count 변수를 한번만 사용하는 방법
3. 자료형을 이용하는 방법
- Solution
리스트를 이용한 풀이
a=[]
cnt = 0
for i in range(10):
a.append(int(input())%42)
for n in a:
cnt += 1/(a.count(n))
print(round(cnt))
서로 다른 자연수의 개수를 알아 볼때 랜덤하게 배치되어있는 자연수의 배열로 먼저 만든후 count 함수를 이용하여 각 자리수의 자연수가 리스트내에 총 몇개가 있는지를 표현하는 리스트로 변환하였을때 a라는 자연수가 리스트내에 총 n 개가 있다고 가정하면 변환된 리스트에 저장되어 있는 n 이라는 숫자가 리스트내에 n개 있을 것이고 이 중복 세트를 1로 인식하게 만들려면 n 을 나눠야한다.
정수 n이 n개가 있을때 반복되는 n 항 들에게 1/n 을 할당하여 주면 리스트의 총 합을 구할때는 1/n 값이 n개가 존재함으로 n 하나당 가중값을 고려한 값은 1이 되므로 개수를 카운트 할수 있다.
그 뒤에는 round 를 사용했는데 이는 부동소수점에 관련된 이슈로 인해서 1/10 을 10번 곱한 값을 1이 아닌 0.9999999 로 인식하여 출력하기 때문에 이처럼 표현하였다.
python 부동소수점(포스팅 예정) https://docs.python.org/ko/3/tutorial/floatingpoint.html
집합 자료형을 이용한 풀이
a=[]
for i in range(10):
a.append(int(input())%42)
print(len(set(a)))
set 자료형은 집합 자료형으로 중복되는 인자를 알아서 소거하여주는 역할을 한다. 따라서 나머지를 저장한 리스트의 인자 개수 len() 만 취해주면 끝이난다.
평균 (#1546)
- Problem
세준이는 기말고사를 망쳤다. 세준이는 점수를 조작해서 집에 가져가기로 했다. 일단 세준이는 자기 점수 중에 최댓값을 골랐다. 이 값을 M이라고 한다. 그리고 나서 모든 점수를 점수/M*100으로 고쳤다.
예를 들어, 세준이의 최고점이 70이고, 수학점수가 50이었으면 수학점수는 50/70*100이 되어 71.43점이 된다.
세준이의 성적을 위의 방법대로 새로 계산했을 때, 새로운 평균을 구하는 프로그램을 작성하시오.
- Hint
미리 어떤 결과가 나올지 예상하고 식을 간단하게 만들고 풀면 많은 과정을 거치지 않아도 된다.
- Solution
리스트를 이용한 풀이
input()
a=[]
for i in input().split():
a.append(int(i))
print(sum(a)/max(a)*100/len(a))
이번에도 리스트에 모든 점수값을 대입한 후에 점수의 변환을 각각 해주어도 되지만 먼저 기존을 점수를 더하고 변환을 하여도 문제가 없기 때문에 바로 print 함수 내에 넣어서 간단하게 해결하였다.
open을 통해 더 간단히 해결 가능
OX 퀴즈 (#8958)
- Problem
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수는 3이 된다.
"OOXXOXXOOO"의 점수는 1+2+0+0+1+0+0+1+2+3 = 10점이다.
OX퀴즈의 결과가 주어졌을 때, 점수를 구하는 프로그램을 작성하시오.
- Hint
반복문이 2번 쓰여야 문제를 풀수 있다.
- Solution
반복문과 리스트를 이용한 풀이
n = int(input())
a=[]
b=[]
count=0
result=0
for i in r:
a=list(input())
result = 0
count = 0
for data in a:
if data=="O":
count += 1
result += count
else:
count = 0
b.append(result)
print(*b, sep='\n')
이해를 돕기위해서 길게 쓴 반복문 O가 반복되면 초기화되지 않은 count 변수가 하나씩 늘어나게 되고 이를 계속 result 에 더하면서 점수를 구하는 방식이다. 식의 간소화를 위해서라면 연속된 자연수의 합 표현법과 input 문자열을 split('X') 을 이용하여 반복된 O 의 개수 len() 을 구한 뒤에 연속된 자연수의 합을 구하게 하면 된다.
open() 과 *-~ 이용한 풀이
for q in[*open(0)][1:]:
print(sum(len(o)*-~len(o)//2 for o in q[:-1].split("X")))
open으로 행 개수를 받아오는 인자를 무시하고 X로 split을 하여 나온 O 으로만 이루어진 배열의 O 개수를
len(o)*-~len(o)//2 하여 표현하는 것을 볼 수 있는데 이는
len(o)*(len(o)+1)/2
와 같은 의미를 가지게 된다. 그 이유는 ~len(o)를 통하여 (NOT) 보수를 취해줘서 len(o)+1 의 음수가 된 값에 다시 - 음수를 취해주어 len(o)+1 가 나오게 되는 알고리즘을 위한 식이다.
평균은 넘겠지 (#4344)
- Problem
첫째 줄에는 테스트 케이스의 개수 C가 주어진다.
둘째 줄부터 각 테스트 케이스마다 학생의 수 N(1 ≤ N ≤ 1000, N은 정수)이 첫 수로 주어지고, 이어서 N명의 점수가 주어진다. 점수는 0보다 크거나 같고, 100보다 작거나 같은 정수이다.
각 케이스마다 한 줄씩 평균을 넘는 학생들의 비율을 반올림하여 소수점 셋째 자리까지 출력한다.
- Hint
반복문과 조건문의 이용 위치를 잘 따져보자
소숫점 자리의 표현은 "{:.nf}".format() 의 형태로 나타낼수 있다.
- Solution
반복문과 조건문 이용한 풀이
n = int(input())
b=[]
for i in range(int(n)):
a = list(map(int,input().split()))[1:]
count=0
for score in a:
if sum(a)/len(a)<score:
count+=1
b.append("{:.3f}%".format(round(count/len(a)*100,3)))
print(*b, sep='\n')
a 의 첫 조건은 len(a)를 이용하여 쓰면 a[1] 을 정수형태로 바꾸고 사용하는것 보다 편리하기 때문에 리스트 저장시에 제외하였다. 이전 문제와 비슷하게 조건문 내에 count 함수를 넣어 상태 변화를 저장하도록 하였다.
숏코딩
for i in[*open(0)][1:]:a,*b=map(int,i.split());print(f'{sum(a*j>sum(b)for j in b) /a:.3%}')
점수가 애초에 100점이 기본단위여서 따로 백분율곱을 하지 않았다, 소수점 표현의 새로운 방법, 정직한 평균 계산보다 리스트의 합과 점수와 인자개수의 곱끼리의 비교를 하여 바로 곱해서 넣었다, 역시나 open 으로 코드 길이를 줄였다.
'Baekjoon > Stepbystep' 카테고리의 다른 글
[백준/python] 문자열 전체 풀이(6단계) (0) | 2022.07.31 |
---|---|
[백준/python] 함수 전체 풀이(5단계) (0) | 2022.07.29 |
[백준/python] 반복문 전체 풀이(3단계) (0) | 2022.07.29 |
[백준/python] 조건문 전체 풀이(2단계) (0) | 2022.07.29 |
[백준/python] 입출력과 사칙연산 전체 풀이(1단계) (2) | 2022.07.29 |