백준 알고리즘 - 심화 1단계

kimminjunnn·2024년 12월 17일

알고리즘

목록 보기
4/322

25083번: 새싹

예전 고양이 문제가 생각난다.

이스케이프 문자를 무시하고싶으면 print() 안에 r을 집어넣자.
r은 raw 문자라는 뜻

답:

print(r"""         ,r'"7
r`-_   ,'  ,/
 \. ". L_r'
   `~\/
      |
      |""")

2444번: 별 찍기 -7

10분정도 고민해보고 실패.
고민의 흔적

# 1 1
# 2 3 / 121 
# 3 5 / 12321
# 4 7 / 1234321
# 5 9/ 123454321


N = int(input())

for i in range(2*N-1):
    print("*")

N = 5라면

00100
03330
55555
03330
00100

2n-1 일때 풀 센텐스
N = int(input())  # 입력 받기

# 위쪽 삼각형 출력
for i in range(1, N+1):
    print(" " * (N - i) + "*" * (2 * i - 1))

# 아래쪽 삼각형 출력
for i in range(N-1, 0, -1):
    print(" " * (N - i) + "*" * (2 * i - 1))

삼각형을 두개로 나눠서 푸는구나.

공백도 양쪽 생각하지 말고 왼쪽만.

공백은 N-1개
별은 2N-1개.
줄개수는 N개

range 함수를 거꾸로 쓰더라
range(N-1, 0, -1)
N-1 부터 0까지 -1씩하기.

마찬가지로 공백은 N-1개
별은 2N-1개.
줄개수는 N개

다시 이런거 만나면 공백개수 왼쪽만 규칙 파악해보자. 풀 수 있을듯.


1157번: 단어 공부

set() 집합 자료형과 count() 함수와 반복문을 통해서 단어 속 알파벳의 개수를 셀 수 있다.

word = input().upper()  # 입력받은 문자열을 대문자로 변환

word_list = list(set(word)) # 입력 문자열의 중복을 제거하고 리스트로 변환

cnt = []  # 문자별 등장 횟수를 저장할 빈 리스트 초기화
 
for i in word_list:
    count = word.count(i)
    cnt.append(count)


if cnt.count(max(cnt)) >  1:
    print("?")
else:
    print(word_list[cnt.index(max(cnt))])
    

#cnt 중 가장 큰 값의 개수가 1 초과라면, "?" 출력. 언어로 출력하려면 max는 하나여야하기 때문

#리스트.index(값) 은 리스트에서 해당값의 index 값을 출력한다.

어렵네


replace() 함수
replace는 문자열을 변경하는 함수이다. 문자열 안에서 특정 문자를 새로운 문자로 변경하는 기능을 가지고 있다. 사용 방법은 '변수. replace(old, new, [count])' 형식으로 사용한다.

  • old : 현재 문자열에서 변경하고 싶은 문자

  • new: 새로 바꿀 문자

  • count: 변경할 횟수. 횟수는 입력하지 않으면 old의 문자열 전체를 변경한다. 기본값은 전체를 의미하는 count=-1로 지정되어있다.

>>> a = 'hello world'
>>> a.replace('hello','hi')
hi world

1316번: 그룹 단어 체커

그룹단어의 개수를 출력하는 문제.
여기서 정의한 그룹 단어란

  • 각 문자가 연속해서 등장하는 단어.
  • 단어 내에서 한 번 등장한 문자는 반드시 연속적으로 등장해야 함.
  • 한 번 등장한 문자가 다시 나오면, 그 문자는 그룹 단어가 아님.

풀이

N = int(input())
group_word = N

for i in range(N) :
    word = input()
    for j in range(len(word)-1) :
        if word[j] == word[j+1] : #word의 알파벳이 그 다음 알파벳과 동일하다면, continue 
            continue
        elif word[j] in word[j+1:] :
            group_word -= 1
            break # 그렇지 않고 알파벳이 그 이후에 알파벳에서 나온다면, 그룹단어가 아니므로 -1 처리. 
print(group_word)

알아야 할 요소

  • 슬라이싱

  • break , continue 문


25206번: 너의 평점은
문제 확인 : https://www.acmicpc.net/problem/25206
(문제가 길어서 사진 첨부 일부 생략)

요약하자면 이렇게 '과목명, 학점, 등급' input 20개 받아서 각 등급에 맞는 점수를 매핑해서 학점과 곱하고 학점의 총합으로 나누어주면 되는 문제.
단, P인 경우에는 성적 취급 X

답 :

rating = ['A+', 'A0', 'B+', 'B0', 'C+', 'C0', 'D+', 'D0', 'F']
grade = [4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0]

total = 0	# 학점 총합을 담을 변수
result = 0	# (학점 * 과목평점) 총합을 담을 변수
for _ in range(20) :
    s, p, g = input().split()
    p = float(p)
    if g != 'P' :	# 등급이 P인 과목은 계산 안함
        total += p
        result += p * grade[rating.index(g)]

print('%.6f' % (result / total))
  • 등급 -> 학점 치환 방법:
    grade[rating.index(g)] #g는 등급

index() 함수를 사용함.
이것은 리스트.index(요소) 의 인덱스 번호를 반환함.
그러니 rating의 요소를 인덱스를 이용하여 grade 리스트의 요소로 치환한 것.

%.6f 는 소숫점 6자리까지 print 하는 스킬.

풀이보니 생각보다 풀만해 보이는데 왜 이 문제만 보면 막막하니 눈이 감겨왔을까.

잊을때 쯤 다시 풀어보자


profile
Frontend Engineers

0개의 댓글