본문 바로가기

programming/algorithm

[algorithm] 백준 단계별 문제 풀이 (심화 2탄)

[algorithm] 백준 단계별 문제 풀이 (심화 2탄)

 

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

 

오늘은 여태까지 풀어오면서 익힌 스킬들을 동원해야 하는 심화 문제들을 살펴보려 합니다.

 

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

 

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

 

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


차근차근 풀어봅시다.

 

algorithm
알고리즘


백준 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}%")

 

풀이 해석 및 팁

 

각 줄에서 점수 목록이 나오기 전에 점수의 개수가 주어지기 때문에 합계를 구할 때 슬라이싱을 사용해

첫 번째로 읽어 들인 값을 제외하고 합계를 구합니다.

소수점 셋째 자리까지 출력해야하므로 .3f 를 사용합니다.

백준 BAEKJOON 2941

 

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

 

 

2941번: 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z=

www.acmicpc.net

 

문제 해석

 

입력값으로 들어오는 크로아티아 알파벳의 개수를 구하는 문제로

문제에 나와있는 특정 문자열을 1개의 알파벳으로 취급해야 합니다.

 

풀이

 

import sys
s = sys.stdin.readline().rstrip()
l = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
for a in l:
    s = s.replace(a,'1')
print(len(s))

 

풀이 해석 및 팁

 

1개의 문자로 취급해야 할 문자열을 리스트에 담아두고 입력값으로 들어온 문자열에

replace() 함수를 활용해 문자'1'로 치환한 뒤 문자열의 길이를 출력해 문제 해결

백준 BAEKJOON 1316

 

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

 

 

1316번: 그룹 단어 체커

그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때

www.acmicpc.net

 

문제 해석

 

주어지는 문자열에 처음 나오는 알파벳은 모두 연속되어 있는가를 확인하는 문제

만약 앞에서 나왔던 문자가 뒤에서 다시 나타나면 이 단어는 그룹 단어가 아닌 것으로 간주

 

풀이

 

import sys
n = int(sys.stdin.readline().rstrip())
total = 0
for i in range(n):
    s = sys.stdin.readline().rstrip()
    tmp = ''
    cnt = 0
    tmp_list = []
    for j in range(len(s)):
        if tmp != s[j]:
            tmp = s[j]
            cnt += 1
            tmp_list.append(tmp)
    if cnt == len(set(tmp_list)):
        total += 1
print(total)

 

풀이 해석 및 팁

 

문자열을 한 글자씩 검사하면서 연속되던 문자가 아닐 때 cnt를 1씩 올려주고 tmp_list에 추가합니다.

한 문자열의 검사가 모두 끝났을 때 cnt의 값과 tmp_list를 집합으로 변환해서 중복을 없앤 후

요소의 개수를 비교해 보았을 때 서로 같으면 앞에서 나왔던 문자가 뒤에서 다시 나온 적이 없는 문자열이므로

그룹 단어가 맞게 되며 total의 개수를 1 올려줍니다.

최종적으로 total을 출력하면 문제 해결

백준 BAEKJOON 25206

 

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

 

 

25206번: 너의 평점은

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치

www.acmicpc.net

 

문제 해석

 

문제에서 주어지는 대학교 성적 목록에서 학점과 평점을 구분해 과목평점을 출력하는 문제

 

풀이

 

grade = {'A+' : 4.5, 'A0' : 4.0, 'B+' : 3.5, 'B0' : 3.0, 'C+' : 2.5, 'C0' : 2.0, 'D+' : 1.5, 'D0' : 1.0, 'F' : 0.0}

total_b = 0
total = 0
for _ in range(20) :
    a, b, c = input().split()
    b = float(b)
    if c != 'P' :
        total_b += b
        total += b * grade[c]
print('%.6f' % (total / total_b))

 

풀이 해석 및 팁

 

딕셔너리를 사용해 과목평점의 정보를 저장해 둡니다.

그리고 성적 목록을 읽어 들여 과목명, 학점, 평점 순으로 구분합니다.

이때 평점이 P 인 경우는 계산에서 제외합니다.

P가 아니라면 학점의 총합을 계산하면서 학점 x 평점의 합계를 계산합니다.

최종적으로는 앞에서 구한 두 개의 총합을 이용해 전공평점을 소수점 6자리까지 출력해 주면 해결

여기까지 백준 단계별 문제 심화 2탄의 풀이였습니다.

 

하나하나 문제를 풀어나가는 과정에서 재미를 느끼신다면 알고리즘 문제 풀이에 딥하게

 

빠져드실 준비가 되신 것으로 보입니다. 우리 다 같이 열심히 해봅시다.

 

궁금하신 점이나 도움이 필요한 부분이 있다면 댓글로 남겨주시기 바랍니다.

 

감사합니다.

반응형