728x90

백준 단계별로 풀어보기 - 문자열 문제 5개 python으로 풀기


1152 - 단어의 개수

영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

s_list = []
for S in map(str, input().split()):
  s_list.append(S)
print(len(s_list))

풀이 : 입력받은 문자열을 공백을 기준으로 분리하여 모두 list에 담는다. 그 후에 리스트의 길이를 출력하여준다.


2908 - 상수

※ 상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다. 상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다. 두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

a, b = map(str, input().split())
R_a = int(a[::-1]); R_b = int(b[::-1])
print(max(R_a, R_b))

풀이 : 우선 해당 문제를 풀기 위해서 입력된 문자의 순서를 뒤집는 과정이 필요한데 이 때 문자열 슬라이싱을 사용하기로 했다. 우선 입력 받는 값을 string형태로 저장하여 준다. 그 후에 문자열 슬라이싱을 이용하여 문자열을 뒤집어준다. 이 때 대괄호 내의 의미는 [start : stop : step]을 의미한다. 즉, [::-1]은 처음부터 끝까지 오른쪽끝부터 슬라이싱한다는 의미이다. 그 후에 변환된 두 수 중에 큰 수를 출력하여준다.


5622 - 다이얼

상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다.

전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다.

숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다. 상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다. 할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

dial = ['', '','ABC','DEF','GHI','JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
num = []
for s in str(input()):
  for i in dial:
    if s in i:
      num.append(dial.index(i))
print(sum(num) + len(num))

풀이 : 다이얼 리스트에 맨 앞 두 공백은 그림속 알파벳과 숫자를 맞추려고 넣은 것 이다. for 문에서는 입력된 문자열을 맨 앞부터 살펴보며 해당 문자가 다이얼 몇번에 있는지를 찾고 num리스트에 해당 숫자를 추가하여준다. 그 후에 걸리는 시간을 계산해야하는데, 1을 걸려면 2초가 걸리고 2를 걸려면 3초가 걸린다. 즉 원하는 숫자를 누를 때 원하는 숫자 + 1초가 소비된다. 결과적으로 누르려는 숫자들의 합 + 숫자들의 길이 를 출력해주면 된다.


2941 - 크로아티아 알파벳

예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다.

예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.

changed = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
count = 0
s = str(input())

for c in changed:
  if c in s:
    count += s.count(c)
    s = s.replace(c, " ")

print(count + len(s.replace(" ", "")))

풀이 : 입력된 문자열 내에 변환된 문자가 있다면 개수를 세어준 뒤 문자열에서 삭제시켜준다. 정확히 말하면 해당 문자를 띄어쓰기로 변환하여준다. 그 이유는 마지막에 설명할 것이다. 'dz=' 가 'z=' 보다 먼저 검사되기 때문에 해당 두 문자로 인해 문제가 생길일은 없다. 마지막에는 크로아티아 문자의 개수 + 남은 문자열의 개수를 출력하여준다.

 

위 표와 같은 이유로 공백대신 띄어쓰기로 대체하는 방법을 사용하였다.


1316 - 그룹 단어 체커

※ 그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다. 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.

n = int(input())
count = 0
for _ in range(n):
    s_list = []
    group_word = True
    for s in str(input()):
        if s not in s_list:
            s_list.append(s)
        else:
            if s_list[-1] != s:
                group_word = False
                break
    if group_word: count += 1
print(count)

풀이 : 문자열을 입력받기전 s_list라는 빈 리스트를 정의해준다. 해당 리스트는 문자열을 입력받을 때마다 초기화 된다. 문자열을 입력 받고 나서 맨 왼쪽 첫 글자부터 살펴본다. 해당 단어가 s_list에 없을 경우 추가하여준다. 만약에 단어가 s_list 내에 있다면 가장 마지막으로 저장된 단어와 비교하여 일치하는지 판단한다. 일치한다면 연속된 단어가 계속 쓰였다는 것을 의미한다. 만약 단어가 리스트 내에 있지만 맨 마지막에 저장된 단어와 다르다고 하면 불연속하게 쓰인 것이므로 그룹 단어가 아니다라는 결과를 반환하여준다. 위 과정을 n회 반복하여 최종적으로 입력된 단어 중 그룹 단어의 개수를 출력하여준다.

'코딩 공부 > 파이썬' 카테고리의 다른 글

백준 기본수학 1 풀이 - 2  (0) 2022.02.03
백준 기본수학 1 풀이 - 1  (0) 2022.01.27
백준 문자열 문제풀이 - 1  (0) 2022.01.20
백준 함수 문제풀이  (0) 2022.01.18
백준 1차원 배열 문제풀이  (0) 2022.01.17

+ Recent posts