본문 바로가기

programming/algorithm

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

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

 

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

 

오늘은 백준 단계별 문제 중 문자열을 다루는 문제들을 살펴보려합니다.

 

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

 

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

 

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


차근차근 풀어봅시다.

 

algorithm
알고리즘


백준 BAEKJOON 2675

 

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

 

 

2675번: 문자열 반복

문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다

www.acmicpc.net

 

문제 해석

 

각 줄마다 반복 횟수, 공백, 문자열 이 주어지면 문자열의 각 글자마다 반복 횟수만큼 출력하는 문제

 

풀이

 

import sys

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

for _ in range(n):
    a, b = map(str, sys.stdin.readline().rstrip().split())
    for i in b:
        print(i*int(a),end='')
    print()

 

풀이 해석 및 팁

 

map() 함수를 이용해 공백을 기준으로 a와 b에 문자열 형태로 입력값을 나눠서 대입합니다.

for 문을 이용해 b 문자열에 접근하면서 각 글자마다 a번씩 곱해서 출력합니다.

print() 함수안에 end=''를 넣어주면 출력물 끝에 개행문자가 아닌 ''(아무것도 안쓰여져있음)가 붙게 됩니다.

백준 BAEKJOON 1157

 

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

 

 

1157번: 단어 공부

알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.

www.acmicpc.net

 

문제 해석

 

알파벳 대소문자로 이루어진 문자열에서 가장 많이 사용된 알파벳을 출력하는 문제

 

풀이

 

import sys

s = sys.stdin.readline().rstrip().upper()
a = list(set(s))
b = []
for i in a:
    b.append(s.count(i))

if b.count(max(b)) > 1:
    print('?')
else:
    print(a[b.index(max(b))])

 

풀이 해석 및 팁

 

문자열을 입력받을 때 upper() 함수를 사용해 모두 대문자로 대입받습니다.

그리고 set() 함수를 사용해 중복값을 제거합니다.

count() 함수를 통해 본 문자열에서 각 알파벳이 몇개씩 존재하는지를 체크하기위해 b 리스트에 추가해줍니다.

b 리스트에서 최댓값을 찾고 최댓값인 요소의 개수가 1개 이상이라면 ?를 출력하고

아니라면 해당 알파벳을 출력해줍니다.

백준 BAEKJOON 1152

 

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

 

 

1152번: 단어의 개수

첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열

www.acmicpc.net

 

문제 해석

 

단순하게 문자열이 몇개의 단어로 이루어져있는가(공백+1)를 출력하는 문제 

 

풀이

 

import sys
s = sys.stdin.readline().rstrip().split()
print(len(s))

 

풀이 해석 및 팁

 

입력받은 문자열에 split() 함수를 붙여서 공백을 기준으로 각 단어를 리스트로 변환해 대입합니다.

그리고 리스트의 길이를 출력하면 문제 해결

## split() 함수의 내용#################

(method) def split(
    sep: str | None = None,
    maxsplit: SupportsIndex = -1
) -> list[str]

##################################

백준 BAEKJOON 2908

 

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

 

 

2908번: 상수

상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두

www.acmicpc.net

 

문제 해석

 

공백을 기준으로 3자리수를 두개 입력받은 뒤 순서를 뒤집었을 때 더 큰수를 출력하는 문제

 

풀이

 

import sys

a, b = map(int, ("".join(reversed(sys.stdin.readline().rstrip()))).split())

print(a if a > b else b)

 

풀이 해석 및 팁

 

a, b = map(int, ("".join(reversed(sys.stdin.readline().rstrip()))).split())
위 코드를 하나 하나 살펴보겠습니다.

입력값으로 123 456 이 들어온다고 가정했을 때

str = sys.stdin.readline().rstrip() # str에는 123 456 로 대입됨 (문자열)
str2 = reversed(str) #  str2에 654 321 로 저장되어있음 (reversed 객체임)
str3 = "".join(str2) # str3에 654 321 로 대입됨 (문자열)
a, b = map(int, str3.split()) # 공백을 기준으로 a와 b에 정수형으로 대입됨

현재 a에는 654 b에는 321이 대입된 상황입니다.

print(a if a > b else b)

위 코드는 다음과 같이 동작합니다.

a>b의 결과가 참이면 a를 출력 거짓이면 b 출력

백준 BAEKJOON 5622

 

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

 

 

5622번: 다이얼

첫째 줄에 알파벳 대문자로 이루어진 단어가 주어진다. 단어의 길이는 2보다 크거나 같고, 15보다 작거나 같다.

www.acmicpc.net

 

문제 해석

 

다이얼 전화기로 원하는 번호에 전화를 걸 때 걸리는 시간을 출력하는 문제

각 번호에는 알파벳의 범위가 지정되어있고 문제에서 알파벳이 주어지면 해당되는 숫자를 찾아서

다이얼로 입력할 때 총 얼마나 시간이 걸리는지를 계산해야합니다.

숫자 1을 입력할 때 2초가 걸리고 숫자가 하나 커질 때 마다 1초가 더 걸립니다.

 

풀이

 

import sys

s = sys.stdin.readline().rstrip()

# 각 알파벳이 속한 숫자를 딕셔너리로 정의
dic = {'A':2, 'B':2, 'C':2, 'D':3, 'E':3, 'F':3, 'G':4, 'H':4, 'I':4,
       'J':5, 'K':5, 'L':5, 'M':6, 'N':6, 'O':6, 'P':7, 'Q':7, 'R':7,
       'S':7, 'T':8, 'U':8, 'V':8, 'W':9, 'X':9, 'Y':9, 'Z':9}

total = 0

# 입력값으로 들어온 문자열에 차례대로 접근해서 걸리는 시간의 총합을 구함
for i in s:
    total += dic.get(i)+1
print(total)

 

풀이 해석 및 팁

 

딕셔너리 dic에 각 알파벳을 키로 설정하고 속하는 숫자를 값으로 설정합니다.

딕셔너리에 get(key) 를 사용해 값을 받아서 사용하는것을로 문제를 해결했습니다. 

백준 BAEKJOON 11718

 

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

 

 

11718번: 그대로 출력하기

입력이 주어진다. 입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 또, 각 줄은 공백으로 시

www.acmicpc.net

 

문제 해석

 

문제의 제목 그대로 읽어온 입력값을 그대로 출력하는 문제입니다.

 

풀이

 

while True:
    try:
        print(input())
    except:
        break

 

풀이 해석 및 팁

 

입력값이 얼마나 주어지는지 알 수 없기에 반복문을 무한루프로 돌리면서 try except 문을 사용해

입력값이 존재하지않을 때 반복문을 멈추는 방법으로 문제를 해결합니다.


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

 

문제를 풀면서 문자열을 다양하게 다루어보았습니다.

 

본인에게 맞는 방법을 찾으셨으면 스타일을 잘 만들어가시면 좋을 것 같습니다.

 

못 찾으셨다면 자신이 다루기 편한 방법이 생길 때 까지 여러 방법을 시도해보시길 바랍니다.

 

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

 

감사합니다.

반응형