1장. 문자열처리

Updated:

모스부호 판독기

이제 막 이등병이 된 E군!

군생활을 시작하자마자 모스부호를 외워야 한다고 하는데…

기억력이 안 좋은 E군은 잔머리를 발동해 외우지 않고 모스부호를 자동으로 한글로 바꿔주는 프로그램을 만들려고 합니다! E군을 도와주세요!!

한글 모스부호표

자음 모스부호 모음 모스부호
* - * * *
* * - * * *
- * * * -
* * * - * * *
- - * -
* - - - *
- - * * * * *
- * - * - *
* - - * - * *
- * - * * * -
- * * - - - * -
- - * * - * - -
- - - * * * * * -
- - - * * * * -

한글 모스부호 표를 참고해서 모스 부호가 입력 되면 어떤 문자열인지 구분해서 출력해주세요!

  • 입력 예시
-*- *** *-** **- **-* -** **-* -**- *- -*** - ***- --*- **-* -*** -**
  • 출력 예시
ㅇ ㅕ ㄱ ㅣ ㄴ ㅡ ㄴ ㅋ ㅗ ㄷ ㅓ ㄹ ㅐ ㄴ ㄷ ㅡ

여기는 코더랜드!!

  • 입력

한글 모스부호표에서 주어진 모스부호들이 공백을 기준으로 주어집니다.

  • 출력

모스부호를 한글로 바꿔서 출력해주세요.

dicts = {'*-**':'ㄱ','**-*':'ㄴ','-***':'ㄷ','***-':'ㄹ','--':'ㅁ','*--':'ㅂ','--*':'ㅅ','-*-':'ㅇ','*--*':'ㅈ','-*-*':'ㅊ','-**-':'ㅋ','--**':'ㅌ','---':'ㅍ','*---':'ㅎ','*':'ㅏ','**':'ㅑ','-':'ㅓ','***':'ㅕ','*-':'ㅗ','-*':'ㅛ','****':'ㅜ','*-*':'ㅠ','-**':'ㅡ','**-':'ㅣ','--*-':'ㅐ','-*--':'ㅔ','*****-':'ㅖ','****-':'ㅒ'}

arr = input().split()

Str = []

for i in arr:
    Str.append(dicts[i])
    
print(' '.join(Str))

두 가지 문자열 비교

코더랜드의 음주 운전 단속 방법은 조금 특이합니다.

음주 운전 단속 로봇들이 도로를 돌아다니며 운전자들에게 두 가지의 문자열 String 1String1과 String 2String2를 보여주며 이 두가지 문자열이 같은 문자열인지 물어봐서 올바른 대답을 하지 못한다면 음주 운전 혹은 졸음 운전을 한다고 판단하고 바로 면허 정지를 시키는 시스템입니다!

운전자들이 정답을 미리 알고 있다면 단속을 정확히 없기 때문에 엘리스가 매일매일 새로운 두가지 문자열을 만들어내야 합니다. 여러분이 엘리스를 도와 생성된 두가지 문자열이 같은지 판단하는 프로그램을 만들어주세요!

다음은 문자열 규칙입니다.

  1. $#$ 은 바로 앞 문자를 지운다는 뜻입니다.
  2. 예를 들어 “elia#ce” 이라는 문자열이 주어지면 이 문자열은 “eliaa##ce”라는 문자열과 동일한 결과를 가집니다.
  • 입력 예시 1
eliia##ce
elia#ce
  • 출력 예시 1
True
  • 입력 예시 2
##a#abb#
a#a#bb
  • 출력 예시 2
False
  • 입력
    • 첫 번째 줄에는 String 1이 두 번째 줄에는 String 2가 주어집니다.
    • 두 문자열은 소문자와 $#$만으로 구성됩니다.
  • 출력
    • 두 문자열이 동일하다면 True, 아니라면 False를 출력합니다.
str1 = input()
str2 = input()

tmp_str1 = ''
tmp_str2 = ''

cnt = 0

for i in range(len(str1)-1,-1,-1):
    if str1[i] == '#':
        cnt += 1
    else:
        if cnt > 0:
            cnt-=1
            continue
        tmp_str1 += str1[i]
        
#print(tmp_str1)

cnt = 0

for i in range(len(str2)-1,-1,-1):
    if str2[i] == '#':
        cnt += 1
    else:
        if cnt > 0:
            cnt-=1
            continue
        tmp_str2 += str2[i]
        
#print(tmp_str2)

if tmp_str1 == tmp_str2:
    print('True')
else:
    print('False')

읽은 책은 제자리에!

코더랜드 도서관에 취직한 엘리스는 요즘 한 가지 고민에 빠져있습니다. 그 고민은 바로 도서관을 이용하는 고객들이 책을 읽은 뒤에 원래 있던 자리가 아닌 아무 곳에나 책을 꽂아 두는 것입니다.

항상 책이 제자리에 있어야 하는 도서관의 특성상 엘리스는 지금 책장에 꽂혀 있는 책들이 제대로 꽂혀있는지 알아보는 프로그램을 만들려고 합니다. 여러분이 엘리스를 도와 프로그램을 완성해주세요.

코더랜드 도서관에서는 책을 분류번호, 제목, 저자로 구분하여 보관합니다. 예를 들어 800 cook chef 라는 책은 800 c*k 라는 책장에 꽂혀있어야할 책입니다.

  • 입력 예시
300
b*a
3
300 brilliant amazing
300 banana code
301 bestkorea patriot
  • 출력 예시
False
True
False
  • 입력
    • 첫 번째 줄에 책의 분류번호(100 이상 900 이하의 자연수)가 주어집니다.
    • 두 번째 줄에 책 제목의 첫 글자와 마지막 글자가 주어집니다.
    • 세 번째 줄에 구분지어야 할 책의 개수(NumNum)가 주어지고 그 다음 줄 부터 책의 정보가 주어집니다.(1 ≤ NumNum ≤ 100)
  • 출력
    • 주어진 책의 정보를 통해 조건에 해당한다면 True, 아니라면 False를 출력하세요.
num = input()
code = input()

start = code[0]
end = code[-1]

N = int(input())

for i in range(N):
    strs = input().split()
    if strs[0] != num:
        print(False)
        continue
    if start != strs[1][0] or end != strs[1][-1]:
        print(False)
        continue
    print(True)

골칫거리 버그

코더랜드의 골칫거리 버그는 오늘도 어떤 장난을 처볼까 고민하던 중이었습니다. 그러던 중 버그의 눈에 코더랜드 시장의 수 많은 간판들이 눈에 띄었습니다.

”좋아. 오늘은 이거다!”

몇 시간 뒤 시장의 간판들은 버그의 낙서로 엉망진창이 되었습니다. 버그는 간판의 문구에 자신이 좋아하는 문자 혹은 문자열을 마구 집어넣었습니다. 그 결과 원래 apple이라고 적혀 있던 간판에는 bg라는 문자를 아무 곳이나 마구 적어 넣어 bgappbgle 가 되었습니다.

시장의 상인들은 이대로는 장사를 시작할 수 없을 것 같아서 낙심하고 있습니다. 여러분이 상인들을 위해 간판을 원대로 돌려주는 프로그램을 완성해주세요!

  • 입력 예시 1
bgappbgle
bg
  • 출력 예시 1
apple
  • 입력 예시 2
es2liss22ce
s2
  • 출력 예시 2
elice
  • 입력
    • 첫 번째 줄에는 낙서 된 간판의 문자열이 주어집니다. 이 문자열의 길이는 1이상 10만 이하입니다.
    • 두 번째 줄에는 버그가 낙서한 문자열이 주어집니다. 이 문자열의 길이는 1 이상 40 이하입니다.
    • 두 문자 모두 알파벳 소문자와 대문자로만 이루어져있습니다.
  • 출력
    • 버그가 낙서하기 전에 원래 모습을 출력해주세요!
def remove_bug(bug_str, bug):
    
    Str = bug_str.replace(bug,'')

    if bug_str == Str:
        return Str
    return remove_bug(Str, bug)
    
bug_str = input()
bug = input()

print(remove_bug(bug_str,bug))     

엘리스와 비밀번호

엘리스 아카데미의 프로그램 개발자로 취직한 엘리스는 회원들의 현재 비밀번호가 새롭게 개편된 보안 정책에 얼마나 위반하는지 알아보는 업무를 할당받았습니다. 엘리스를 도와 아래에 주어진 보안 정책을 따라 몇 번이나 비밀 번호를 수정 해야 하는지 출력하는 프로그램을 만들어 주세요.

보안 정책

비밀 번호는 8자 이상 30자 이하 의 길이를 가져야 한다. 비밀 번호에는 하나 이상의 소문자, 숫자, 특수문자가 포함 되어야 한다. 하나의 문자가 3번 이상 연속 되면 안된다. 예를 들어 aaabb11!는 사용 불가능한 비밀 번호지만 aabab11!는 사용 가능하다.

  • 입력 예시 1
aBcD2fg!
  • 출력 예시 1
0
  • 입력 예시 2
AA
  • 출력 예시 2
6
  • 입력
    • 비밀 번호가 문자열 형태로 제공됩니다. 이 문자열의 길이는 1이상 100이하 입니다.
  • 출력
    • 주어진 비밀 번호가 새로운 보안 정책에 따라 변경되려면 몇 번의 수정이 필요한 지 출력해주세요.
    • 수정에 있어, 한 문자의 삽입, 변경, 삭제는 모두 하나의 수정으로 간주됩니다.
# 8 ~ 30 의 문장에 모든 조건이 만족되는가?
# 3개이상 연속되고 문장에 특수문자가 없다면 3개인것중 하나를 특수문자로
# 6개이상이 연속되는 경우를 생각

def check(Str):

    c_lower = False
    c_number = False
    c_symbol = False
    c_conti = 0
    
    cnt = 0
    tmp = ''
    
    
    for c in Str:
    
        if c != tmp:
            tmp = c
            cnt = 0
        else:
            cnt += 1
            if cnt == 2:
                c_conti +=1
                cnt = -1
                
        if c>='a' and c<='z':
            c_lower = True
        if c>='0' and c<='9':
            c_number = True
        if c in '!@#$%^&*':
            c_symbol = True
    
    must_pl = 0
    need = 0
    
    if len(Str) < 8:
        must_pl = 8 - len(Str)
    if not c_lower:
        need+=1
    if not c_number:
        need+=1
    if not c_symbol:
        need+=1
    
    #print(need, c_conti, must_pl)
    
    
    change = max(need, c_conti+must_pl)
    
    return change
    
# ABABABA
Str = input()

if len(Str) <= 30:
    print(check(Str))
else:
    Min = 987654321
    remove = len(Str) - 30
    for i in range(len(Str)-29):
        Min = min(Min,check(Str[i:i+30]))
    print(remove+Min)

Leave a comment