본문 바로가기

programming/algorithm

[ algorithm ] 백준 단계별 문제 풀이 (1차원 배열 2탄)

[ algorithm ] 백준 단계별 문제 풀이 (1차원 배열 2탄)

 

안녕하세요. 심심한 코딩쟁이입니다.

 

오늘은 저번시간에 이어 1차원 배열에 관련된 문제들의 풀이를 살펴보려 합니다.

 

파이썬3 를 사용해 문제 풀이를 진행하겠습니다.

 

문제마다 링크를 걸어두었으니 문제를 살펴보시고 문제를 푼 다음에 저와

 

풀이를 비교해 보시는 걸 추천드립니다.


차근차근 풀어봅시다.

 

algorithm
알고리즘


백준 BAEKJOON 5597

 

https://www.acmicpc.net/problem/5597

 

 

5597번: 과제 안 내신 분..?

X대학 M교수님은 프로그래밍 수업을 맡고 있다. 교실엔 학생이 30명이 있는데, 학생 명부엔 각 학생별로 1번부터 30번까지 출석번호가 붙어 있다. 교수님이 내준 특별과제를 28명이 제출했는데,

www.acmicpc.net

 

문제 해석

 

1번부터 30번까지의 번호를 가진 학생들 중 과제 제출을 하지 않은 학생의 번호를 구하는 문제

 

풀이

 

import sys

l = [0]*30

while True:
    try:
        a = int(sys.stdin.readline())
        l[a-1] = 1
    except:
        break

for i in range(len(l)):
    if l[i] == 0:
        print(i+1)

 

풀이 해석 및 팁

 

모든 학생들이 과제 제출을 안했다는 상태를 '0' 30개가 포함된 리스트로 표현합니다.
과제 제출한 학생의 번호를 읽어들이면서 리스트에서 학생의 번호와 매치되는 인덱스에 접근해 값을 1로 변경
while 문이 끝나고 아직 값이 0인 인덱스의 번호를 출력하면 문제 해결

백준 BAEKJOON 3052

 

https://www.acmicpc.net/problem/3052

 

 

3052번: 나머지

각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.

www.acmicpc.net

 

문제 해석

 

10개의 숫자를 받아 42로 나눴을 때 나오는 나머지를 구하고 중복된 숫자가 제거된 나머지의 개수를 출력하는 문제

 

풀이

 

import sys

l = []

while True:
    try:
        l.append(int(sys.stdin.readline()) % 42)
    except:
        break
s = set(l)
print(len(s))

 

풀이 해석 및 팁

 

10개의 숫자를 읽어들이면서 42로 나눴을 때의 나머지를 리스트에 추가합니다.
while 문이 종료되면 리스트를 집합으로 변환시켜 중복된 숫자를 제거하고 집합에 len()함수를 사용해 갯수 출력

백준 BAEKJOON 1546

 

https://www.acmicpc.net/problem/1546

 

 

1546번: 평균

첫째 줄에 시험 본 과목의 개수 N이 주어진다. 이 값은 1000보다 작거나 같다. 둘째 줄에 세준이의 현재 성적이 주어진다. 이 값은 100보다 작거나 같은 음이 아닌 정수이고, 적어도 하나의 값은 0보

www.acmicpc.net

 

문제 해석

 

시험 성적을 100점 만점이 아니고 받은 점수 중 최대점을 만점으로 볼 때 성적의 평균값을 구하는 문제

 

풀이 

 

import sys

n = int(sys.stdin.readline())
total = 0
score_list = list(map(int, sys.stdin.readline().rstrip().split()))

for i in score_list:
    total += i

print((total/n)/max(score_list)*100)

 

풀이 해석 및 팁

 

100점이 만점일 때의 평균값을 구하고 그 값을 성적 중 최대값으로 나누고 백분율을 구하면 새로운 평균이 된다.

백준 BAEKJOON 8958

 

https://www.acmicpc.net/problem/8958

 

 

8958번: OX퀴즈

"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수

www.acmicpc.net

 

문제 해석

 

연속으로 정답을 맞추면 적립되는 점수가 1점씩 높아지는 방식으로 들어온 입력값에 대한 점수를 출력하는 문제

 

풀이

 

import sys

n = int(sys.stdin.readline())
total = 0
score = 0
for i in range(n):
    str = sys.stdin.readline().rstrip()
    for j in range(len(str)):
        if str[j] == 'X':
            score = 0
        else:
            score += 1
            total += score
    print(total)
    total = 0
    score = 0

 

풀이 해석 및 팁

 

처음에 입력값으로 들어오는 테스트 케이스의 갯수만큼 for 문을 반복시킵니다.
O와X의 연속으로 이루어진 문자열을 입력받고 문자열의 길이만큼 for 문을 반복시켜서 문자열의 앞에서부터 
차례대로 접근해 정답일 경우 점수에 1을 더하고 그 점수를 총점에 더합니다.
오답일 경우에는 점수의 값을 0으로 변경합니다.
두 번째 for 문이 끝나면 총점을 출력하고 점수와 총점을 다시 0으로 초기화합니다.
첫 번째 for 문의 반복이 끝나면 문제가 원하는 출력값이 출력되어 있습니다.

백준 BAEKJOON 4344

 

https://www.acmicpc.net/problem/4344

 

 

4344번: 평균은 넘겠지

대학생 새내기들의 90%는 자신이 반에서 평균은 넘는다고 생각한다. 당신은 그들에게 슬픈 진실을 알려줘야 한다.

www.acmicpc.net

 

문제 해석

 

평균을 넘기는 학생의 비율을 출력해주는 문제

 

풀이 

 

import sys

n = int(sys.stdin.readline())

total = 0
mean = 0

for _ in range(n):
    score_list = list(map(int, sys.stdin.readline().rstrip().split()))
    total = sum(score_list[1:])
    mean = total / score_list[0]
    count = 0
    for x in score_list[1:]:
        if x > mean:
            count += 1
    print(f"{(count/score_list[0]*100):.3f}%")

 

풀이 해석 및 팁

 

for 문에서 score_list에 대입된 리스트의 첫 번째 값은 점수의 갯수이므로 총합을 구할 때는 슬라이싱을 이용해
제외시켜줍니다. 그 뒤에 평균을 구할 때 분모의 값으로 활용합니다.
평균이 구해지면 평균보다 큰 점수의 갯수를 파악하고 그 비율을 출력합니다.
문자열 포맷팅(f-string)을 사용하고 소숫점 셋째 자리까지 출력하기위해 :.3f 를 적어줍니다.

여기까지 백준 단계별 문제 1차원 배열에 대한 문제 풀이 2탄이었습니다.

 

반복문과 리스트 그리고 집합을 이용해 풀이한 문제들이 대부분이었습니다.

 

풀이에서 사용한 다양한 방법들이 이해가 잘 되지않는다면 아래 글들을 참고해 공부해보시길 바랍니다.

 

[ python 친해지기 #9 ] 파이썬 제어문 (while 반복문)

 

[ python 친해지기 #10 ] 파이썬 제어문 (for 반복문)

 

[ python 친해지기 #4 ] 파이썬 자료형 2탄 (리스트)

 

[ python 친해지기 #7 ] 파이썬 자료형 5탄 (집합, 불)

 

다음시간에 만나요. 감사합니다.

반응형