Computer Science/백준 (Python)

[4단계] 1차원 배열

inee0727 2022. 6. 7. 02:27
10818번. 최소, 최대

 

▼해설보기

더보기
N = int(input())
a = list(map(int,input().split()))
print(min(a), max(a))

 

자료를 리스트 형태로 저장한 후, 최댓값과 최솟값을 도출한다.

 

 

2562번. 최댓값

 

▼해설보기

더보기

1. for문 코드

numbers = []
for _ in range(9):
    i = int(input())
    numbers.append(i)
    
print(max(numbers))
print(numbers.index(max(numbers))+1)

 

2. for문을 list comprehension으로 작성한 코드

numbers = [int(input()) for _ in range(9)]

print(max(numbers))
print(numbers.index(max(numbers)) + 1)

 

 

1. 작성한 코드에 대한 전체적인 내용 정리

이 문제는 9개의 숫자를 입력 받으면 입력받은 수 중 가장 큰 숫자의 값과 순서를 출력하는 문제이다. 
입력받은 숫자로 리스트를 먼저 생성하고 가장 큰 숫자는 max 함수를 사용해서 찾았다. 
또 가장 큰 값이 몇 번째 순서인지는 index 함수를 이용해서 찾았는데 index 함수의 순서는 0번째부터 시작하기 때문에 1을 더해주었다. 숫자를 입력 받는 문장은 한 줄에 하나씩 9번을 입력받기 때문에 for문을 이용하였고 list comprehension 표현식으로 한 줄로 작성해 코드를 짧게 단축해 보기도 하였다. 

2. 코드 두 종류 비교
for문으로 작성 할 때는 변수에 빈 리스트를 먼저 생성하고서 for문의 실행할 문장에서 하나씩 입력받는 숫자를 append 함수로 요소를 추가한다. 이때, for문에서 단순히 print하는 반복문의 경우 index가 의미 없기 때문에 index를 무시하고 _를 사용했다. comprehension 표현식은 [ 실행 문장 for 변수 in iterable 자료형 ] 형태로 작성할 수 있다.
 for문에서 실행할 문장을 가장 앞에 작성하고 뒤에는 for문의 맨 첫째줄에 적는 형태를 그대로 입력하면 된다. 
append 함수를 사용하지 않아도 for문으로 생성되는 값들이 리스트의 요소가 된다.

3. 코드 하단, 리스트에서 가장 큰 수와 순서를 출력
max 함수로 리스트의 가장 큰 수를 찾고 index 함수로 위치를 찾는다. 

이 때, 인덱스는 0부터 시작하니까 1을 더해주어야 한다. 

 

 

2577번. 숫자의 개수

 

▼해설보기

더보기

1. for문으로 숫자를 입력받는 코드

total = 1
for _ in range(3):
    i = int(input())
    total *= i  # 3개의 정수를 곱함
total_str = str(total)  # 숫자를 str타입으로 변환

for num in range(10):  # 0부터 9까지
    num_count = total_str.count(str(num))
    print(num_count)

 

2. 입력받는 세 수를 각각 변수에 지정하는 코드

a = int(input())
b = int(input())
c = int(input())
total_str = str(a*b*c)  # 숫자를 곱해서 str타입으로 변환

for num in range(10):  # 0부터 9까지
    num_count = total_str.count(str(num))
    print(num_count)

1. 코드 작성에 대한 전체적인 풀이
이번 문제는 세 개의 수를 입력받으면 세 수를 곱하고서 이 숫자가 0부터 9까지 각각 몇 번씩 쓰였는지 출력하는 문제이다. 
입력받는 세 수는 for문을 이용해서 곱하고 각 자릿수를 분리하기 위해 문자열로 변환하였다. 
이후에 count 함수로 0부터 9까지 숫자가 쓰인 숫자를 출력하는 코드를 작성해서 문제를 풀었다.

2. 코드 상단, 세 수를 입력받아 곱하고 문자열로 변환한다.
for문을 반복하기 전 total 변수에 1을 선언하였다. 
이후에 세 수를 입력받기 때문에 for문은 3번 반복하고 입력받는 세수를 total 변수에 곱하였다. total *= i 는 total = total*i와 동일한 의미이다. 이후에 total 변수는 str 함수를 이용해서 문자열로 변환하였다. 문자열로 변환한 이유는 숫자 타입은 각 자리의 숫자를 따로 분리할 수 없기 때문이다. 문자열로 변환한 값은 total_str 변수에 저장하였다.

세 수를 for문으로 반복하며 입력 받지 않고 각각의 변수에 지정하는 코드는 아래와 같다. 
a = int(input())
b = int(input())
c = int(input())
total_str = str(a*b*c)  # 숫자를 곱해서 str타입으로 변환

3.코드 하단, count 함수를 이용해서 0부터 9까지 몇 번씩 쓰였는지 찾는다.
for문을 이용해서 0부터 9까지의 숫자 범위를 생성하고 각 숫자가 total_str 문자열 안에서 몇 번 쓰였는지 출력한다. 
이때 몇 번 쓰였는지 알기 위해서 count 함수를 사용하였고 count 함수의 괄호( ) 안에는 찾는 문자열을 입력해야 하기 때문에 str함수를 이용해서 0부터 9까지 숫자를 각각 문자열로 변환하였다. 

 

3052번. 나머지

 

▼해설보기

더보기
nums = set()  # 중복되는 요소를 제거
for _ in range(10):
    i = int(input())
    nums.add(i%42)  # 집합자료형에 원소를 추가할 때 add 함수를 사용

print(len(nums))

1. 코드 풀이의 전체적인 내용 요약
이번 문제는 10개의 수를 입력받으면 각 수를 42로 나누어서 나머지를 구하고 중복되는 값을 제거한 이후 원소가 몇 종류의 숫자가 있는지를 출력하는 문제이다. 나머지는 % 연산자를 사용해서 구하였고 집합 자료형의 속성을 이용해서 중복되지 않는 요소만 남겨두도록 하여 문제를 풀었다. 코드를 상세히 보면 아래와 같다. 

2. 풀이과정
1)입력받는 숫자의 나머지를 구해서 집합에 더한다. 
입력받는 숫자는 10개이기 때문에 for문은 10번을 반복한다. 
입력받는 수를 변수 i에 선언하고서 % 연산자로 42를 나눈 나머지를 구해서 add 함수를 이용해서 집합에 요소를 추가한다. 

처음에 빈 set을 생성할 때는 set( ) 함수를 이용해서 생성해야 한다. 
집합이 출력될 때는 중괄호 { }에 묶인 값이 출력되는데 nums={ } 형태로 표현하면 딕셔너리 자료형으로 선언되기 때문이다.  집합 자료형으로 변환되면 리스트에 있던 중복되는 요소를 제거할 수 있다.
리스트에 요소를 추가할 때는 append 함수를 사용하지만 집합에 추가할 때는 add 함수를 사용한다. 

2) 값을 출력한다.
 마지막에 요소의 개수를 셀 때는 len 함수를 사용할 때 nums 집합의 개수를 세도록 코드를 작성하면 된다.   

 

 

1546번. 평균

 

▼해설보기

더보기

방법 1

n = int(input())  # 과목 수
test_list = list(map(int, input().split()))
max_score = max(test_list)

new_list = []
for score in test_list :
    new_list.append(score/max_score *100)  # 새로운 점수 생성
test_avg = sum(new_list)/n
print(test_avg)

 

방법 2

n=int(input())
a=list(map(int,input().split()))
m=max(a)
sum=0
for i in range(n):
    a[i]=a[i]/m*100
    sum+=a[i]
print(sum/n)

1. 코드 풀이에 대한 전체적인 설명
이번 문제는 과목의 숫자와 점수를 입력받으면 공식에 맞게 점수를 바꾸어 평균을 구하는 문제이다. 
새로운 점수를 구하는 공식은 입력받은 수 중 최고 점수를 분모로 해서 (입력받은 수/최고 점수*100)으로 계산한다.

2. 코드 상단에서 가장 높은 점수를 찾는다.

n = int(input())  # 과목 수
test_list = list(map(int, input().split()))
max_score = max(test_list)

과목수로 입력받는 수는 n에 선언하고 시험 점수는 list 자료형으로 test_list라는 변수에 선언하였다. 
새로운 점수를 구하기 위해서는 입력받은 점수 중 가장 큰 점수를 찾아야 하기 때문에 test_list의 원소중 가장 큰 값을 max 함수로 찾았다. 

3. 코드 하단, 새로운 숫자 리스트를 생성하고 평균을 구한다.

new_list = []
for score in test_list :
    new_list.append(score/max_score *100)  # 새로운 점수 생성
test_avg = sum(new_list)/n

for문을 시작하기 전 빈 리스트를 만든다. 리스트의 변수 이름은 new_list로 생성하였다. 이 빈 리스트에는 새로 계산된 점수를 추가하게 된다. for문을 이용해서 입력받은 시험 점수를 하나씩 꺼내면서 (입력받은 점수/최고 점수*100) 식으로 새로운 점수를 만든다. 이렇게 새로 만든 점수는 append 함수로 리스트에 추가한다.for문이 끝나면 평균을 구한다. 새로 만든 점수로 이루어진 리스트의 요소를 sum함수로 모두 더하고서 과목수로 나누었다. 

 

8958번. OX퀴즈

 

▼해설보기

더보기
n = int(input())

for _ in range(n):
    ox_list = list(input())
    score = 0  
    sum_score = 0  # 새로운 ox리스트를 입력 받으면 점수 합계를 리셋한다.
    for ox in ox_list:
        if ox == 'O':
            score += 1  # 'O'가 연속되면 점수가 1점씩 커진다.
            sum_score += score  # sum_score = sum_score + score
        else:
            score = 0
    print(sum_score)

 

1. 코드 풀이에 대한 전체적인 설명
OX리스트를 입력받으면 O에 부여되는 점수의 합을 구해서 출력하는 문제이다. X는 0점이다.  
O의 점수는 1점부터 시작해서 O가 연달아 나오는 경우 점수가 1점씩 커진다. "OXXOOO"의 점수는 1+0+0+1+2+3 = 7점이 된다.

2. 코드 상단부 - OX리스트를 입력받고 두 개의 변수를 0으로 지정한다.

for _ in range(n):
    ox_list = list(input())
    score = 0  
    sum_score = 0  # 새로운 ox리스트를 입력 받으면 점수 합계를 리셋한다.

처음에 테스트케이스의 숫자를 입력받아 변수 n에 선언하고서 for문을 n번만큼 반복한다. 
이후에 반복문 안에서 o, x로 이루어진 문자열을 입력받으면 리스트로 변환하여 ox_list라는 변수에 저장하였다. 
점수를 더하는데 사용될 score와 sum_score 변수는 0으로 선언하였다. 이 두 개의 변수는 새로운 ox_list를 입력받으면 0으로 리셋된다.

3. 하위 for문을 작성해서 점수를 계산한다. 

    for ox in ox_list:
        if ox == 'O':
            score += 1  # 'O'가 연속되면 점수가 1점씩 커진다.
            sum_score += score  # sum_score = sum_score + score
        else:
            score = 0

for문으로 O나 X 문자를 하나씩 꺼내서 ox라는 변수에 선언하고 if조건식을 이용해서 O가 연달아 나오는 경우 점수가 1씩 증가하도록 하였다.
ox 변수가 O인경우 score 점수 변수에 1을 더하고 이 수를 sum_score 변수에 더한다. 
처음 O가 나오면 score는 1이 되고 O가 연달아 나올 때마다 score는 1, 2, 3,.... 이런 식으로 1씩 증가하게 된다. 
ox변수가 O가 아니면 else구문으로 내려가서 score변수는 다시 0이 된다. 

 

 

4344번. 평균은 넘겠지

 

▼해설보기

더보기
n = int(input())

for _ in range(n):
    nums = list(map(int, input().split()))
    avg = sum(nums[1:])/nums[0]  # 평균을 구함 (nums[0]: 학생수, nums[1:] 점수)
    cnt = 0
    for score in nums[1:]:
        if score > avg:
            cnt += 1  # 평균 이상인 학생 수
    rate = cnt/nums[0] *100
    print(f'{rate:.3f}%')

1. 코드 작성에 대한 전체적인 내용 풀이
학생수와 점수를 입력받을 때는 한 줄에 입력받는데 공백으로 구분되어 있고 첫 번째 수는 학생수, 두 번째부터는 점수를 입력받게 된다. 평균을 넘는 학생의 비율을 출력할 때는 소수점 이하 3자리까지 표기해야 한다. 파이썬에는 평균을 구하는 함수가 없기 때문에 sum함수로 시험 점수의 합을 구하고서 학생수로 나누어서 평균을 구한다. 이후에 for문을 작성하여 if 조건식으로 평균점수보다 큰 수의 숫자를 구하고 학생수와 평균 이상 학생수의 비율을 출력 할 때는 f-string 표기법을 이용해서 소수점 자릿수를 지정한다.

2. for문 상단, 점수의 평균을 구한다.

for _ in range(n):
    nums = list(map(int, input().split()))
    avg = sum(nums[1:])/nums[0]  # 평균을 구함 (nums[0]: 학생수, nums[1:] 점수)

테스트케이스 수로 입력받는 만큼 for문을 반복한다. for문 아래에서 학생수와 점수를 입력받으면 nums라는 변수에 리스트로 저장한다. 리스트의 첫번째 원소는 학생수, 나머지는 점수이기 때문에 인덱스와 범위 연산자를 이용해서 학생수와 점수를 선택했다. 학생수는 nums [0]으로 표기, 점수는 nums [1:]로 표기하고서 평균을 구하기 위해서 sum함수로 점수의 합을 더하고서 학생수로 나누었다.

3. for문 중반부, 평균 이상인 학생 수를 구한다.    

cnt = 0
    for score in nums[1:]:
        if score > avg:
            cnt += 1  # 평균 이상인 학생 수

for문으로 점수 각각을 score 변수에 선언하고 위에서 구한 평균값을 이용해서 평균보다 큰 점수인 경우 cnt 변수에 1씩 더해주었다.

4. 평균보다 높은 점수를 받은 학생 비율을 구하고 출력문을 작성한다.

    rate = cnt/nums[0] *100
    print(f'{rate:.3f}%')

출력문을 작성 할 때는 f-string 표기법으로 작성하였다. ▶f-string 표기법 

 

 

해설 출처 : https://ooyoung.tistory.com/