백준 알고리즘 4단계 (1차원배열)

김형준·2022년 4월 7일
0
  • 새로 배운 내용

1) 10818번 - 리스트 내 최소, 최댓값 리턴하는 min(), max() 함수

import sys

a = list(map(int, sys.stdin.readline().split()))

num_list = list(map(int, sys.stdin.readline().split()))

print(min(num_list), max(num_list))

#아래 코드는 min, max 함수 사용하지 않고 반복문으로 구한 것

num_list = list(map(int, sys.stdin.readline().split()))
max = num_list[0]
min = num_list[0]

for i in num_list:
    if i > max:
        max = i
    elif i < min:
        min = i

print(min,max)

2) 2562번 인덱싱

import sys

a = list()

for i in range(9):
    b = list(map(int, sys.stdin.readline().split()))
    a.append(b[0])

max = max(a)
print(max)
print(a.index(max) + 1)

3) 2577번 숫자의 개수

import sys

a = list(map(int, sys.stdin.readline().split()))
b = list(map(int, sys.stdin.readline().split()))
c = list(map(int, sys.stdin.readline().split()))

a = int(a[0])
b = int(b[0])
c = int(c[0])

abc = a * b * c

# count()는 해당 element가 몇 개 있는지 갯수를 리턴해줌
for i in range(0, 10):
    cnt = str(abc).count(str(i))
    print(cnt)

4) 3052번 나머지 - set 집합 사용하여 중복된 원소 삭제하기

import sys

a = list()
for i in range(0, 10):
    b = list(map(int, sys.stdin.readline().split()))
    b = b[0]
    a.append(b)

c = list()
for i in range(0, 10):
    d = a[i]%42
    c.append(d)

set_c = set(c)
print(len(set_c))

5) 1546번 - 평균 조작하기

import sys

N = int(input())
scores = list(map(int, sys.stdin.readline().split()))

max = max(scores)

for i in range(N):
    scores[i] = scores[i]/max * 100

print(sum(scores)/N)

6) 8958번 (★★★) OX 퀴즈 연속하는 O찾아서 점수 매기기

import sys
# 반복 입력할 케이스 갯수와 케이스 입력하여 리스트에 저장하기
N = int(input())
case_list = list()
for i in range(N):
    case = sys.stdin.readline().split()
    case = case[0]
    case_list.append(case)


for i in range(N):
	#케이스 리스트에 담긴 element 하나씩 판별하기
    iterator = case_list[i]
    count = 0
    #하나의 element 길이 만큼 반복하며 점수 매기기
    for n in range(len(iterator)):
    	# X면 continue
        if iterator[n] == 'X':
            continue
        # O면 카운트 +=1
        elif iterator[n] == 'O':
            count += 1
            # 앞에 있는 element들 판별하여 count += 1
            for d in range(0, n):
                if iterator[n - d - 1] == 'O':
                    count += 1
                #만약 X를 만나면 break
                elif iterator[n - d - 1] == 'X':
                    break
    print(count)
    # count 출력 후 0으로 초기화 필수!
    count = 0
#완전 간결한 식 비교 (출처:https://pacific-ocean.tistory.com/75)
    a = int(input())
for i in range(a):
    b = input()
    s = list(b)
    sum = 0
    c = 1
    for i in s:
        if i == 'O':
            sum += c
            c += 1
        else:
            c = 1
    print(sum)

*코멘트
for문을 돌릴 때, in range가 아니라 in list로 돌릴 수 있다는 점을 간과하고 있었다. 그동안 반복이 몇 번 되느냐에만 초점을 두다 보니 range에 들어갈 숫자만 신경쓰고 있었던 것 같다. 하지만 위와 같이 list안을 iterate하면 훨씬 간결하고, 깔끔하게 코드를 작성할 수 있다.
추가적으로 위의 간결한 코드를 통해 입력받은 값(string)을 list로 형변환 해주면 ['입', '력', '한', '값']과 같이 한글자씩 list에 담기는것 도 알게 되었다!
알고있던 지식만을 활용하여 정답을 출력하기 까지 꽤 오랫동안 고민했던 시간이 허무하게 느껴졌지만, 정답을 출력한 후에 다른 사람이 작성한 더 좋은 코드를 보며 배우는 것도 와닿는 것도 많은 것 같다. ㅎㅇㅌ

7) 4344번 소수점 자리수 표현하기 ( f- string 사용)

  • 실패 원인 : range[0]은 점수가 아닌 갯수였는데 이를 사용 // 출력 형식이 잘못되었습니다.
  • print(f'{ [변수이름]: .[소수점자리수]f }')
  • 뒤의 f 는 float를 의미함
import sys

C = int(input())
score_list = list()
for i in range(C):
    score = list(map(int, sys.stdin.readline().split()))
    score_list.append(score)

for n in range(len(score_list)):
    count = 0
    average = (sum(score_list[n]) - score_list[n][0]) / score_list[n][0]
    ratio = 0
    for d in range(1, score_list[n][0] + 1):
        if score_list[n][d] > average:
            count += 1
        else:
            continue
    ratio = count / score_list[n][0] * 100
    print(f'{ratio:.3f}%')
    
# 참조 https://ooyoung.tistory.com/62
# 현재 불필요하게 리스트에 담아주는 코드를 작성하여 반복문을 두번 사용함
# 아래와 같이 간결한 방식 공부!
import sys

C = int(input())

for i in range(C):
    scores = list(map(int, sys.stdin.readline().split()))
    average = sum(scores[1:])/scores[0]
    cnt = 0
    for score in scores[1:]:
        if score > average:
            cnt += 1
    rate = cnt/scores[0] * 100
    print(f'{rate:.3f}%')

*코멘트
이 문제 또한 배열, 리스트 안을 반복하여 도는 iterator를 활용한다면 위와같이 엄청 간결해진다!!

profile
BackEnd Developer

0개의 댓글