백준 알고리즘 6단계 (문자열)

김형준·2022년 4월 9일
0
  • 새로 배운 내용

1) 11654번 아스키코드

  • ord(): 입력된 문자열을 아스키코드 값으로 변환하는 함수
  • chr(): 입력된 아스키코드 값에 해당하는 문자열로 변환하는 함수
  • 위 두 함수는 서로 반대되는 기능을 수행
X = str(input())
print(ord(X))

2) 11720번 숫자의합

N = int(input())
X = str(input())
X_list = list(X)
sum = 0

for i in range(N):
    sum += int(X_list[i])

print(sum)

3) 10809번 알파벳찾기

# 입력 받은 문자열
S = str(input())
# 리스트에 담아주기 (인덱스 찾기 위함)
S_list = list(S)
# 정답 출력값
ans = ''

#아스키 코드값을 이용하여 알파벳 소문자 a부터 z까지 반복
for i in range(97, 123):
    alphabet = chr(i)
    # 문자열에 포함된 알파벳은 인덱스 찾아서 넣어주기
    if alphabet in S:
        ans += str(S_list.index(alphabet)) + ' '
    else:
        ans += '-1 '

#마지막으로 들어간 공백은 제거하여 출력하기
print(ans[:-1])

4) 2675번 문자열 반복

import sys

N = int(input())

for i in range(N):
    R, S = map(str, sys.stdin.readline().split())
    S_list = list(S)
    ans = ''

    for i in S_list:
        ans += i * int(R)
    print(ans)

5) 1157번 단어공부

S = str(input())

SL = list(S)
CheckList = list()
ans = ''

#CheckList에 대문자로 변환된 아스키 코드값을 저장한다.
for i in SL:
    i = ord(i)
    #소문자의 경우 32를 빼줌으로써 대문자로 변환하여 저장
    if int(i) >= 97:
        CheckList.append(int(i) - 32)
    else:
        CheckList.append(i)

#set으로 변환하여 중복되는 값을 지워준다.
CheckSet = set(CheckList)
#최대 중복된 수
maxCnt = -1
#최대 중복된 값
maxEle = 0
for x in CheckSet:
    if CheckList.count(x) > maxCnt:
        maxCnt = CheckList.count(x)
        maxEle = x
        ans = chr(maxEle)
    #만약 최대 중복된 수 가 같다면 제출 문자열을 ?로 바꿔준다.(후에 최대 중복된 수 가 갱신될 때 바뀐다.
    elif CheckList.count(x) == maxCnt:
        ans = '?'
print(ans)

6) 1152번 단어의 개수

# split()은 공백을 기준으로 구분함
strList = list(map(str, input().split()))

print(len(strList))

7) 2908번 상수

strList = list(map(str, input().split()))

A = list()
B = list()

for i in range(3):
    A.append(strList[0][2 - i])
    B.append(strList[1][2 - i])

a = A[0] + A[1] + A[2]
b = B[0] + B[1] + B[2]

if int(a) > int(b):
    print((a))
else:
    print(int(b))

+) 문자열, 리스트, 튜플 등을 역순으로 출력하는 [:: -1]

strList = list(map(str, input().split()))

# 입력된 각 문자열 거꾸로 저장하기
A = strList[0][::-1]
B = strList[1][::-1]

if int(A) > int(B):
    print(int(A))
else:
    print(int(B))

8) 5622번 다이얼

이중 반복문 사용하기

dial = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
S = str(input())
ans = 0

for j in range(len(S)):
    for i in dial:
        if S[j] in i:
            ans += dial.index(i) + 3

+) 아스키코드로 분류하기

S = str(input())
SL = list(S)
AL = list()
ans = 0

for s in SL:
    if 65 <= ord(s) < 68:
        AL.append(2)
    if 68 <= ord(s) < 71:
        AL.append(3)
    if 71 <= ord(s) < 74:
        AL.append(4)
    if 74 <= ord(s) < 77:
        AL.append(5)
    if 77 <= ord(s) < 80:
        AL.append(6)
    if 80 <= ord(s) < 84:
        AL.append(7)
    if 84 <= ord(s) < 87:
        AL.append(8)
    if 87 <= ord(s) < 91:
        AL.append(9)

for a in AL:
    ans += int(a) + 1

print(ans)

9) 2941번 크로아티아 알파벳

croatia = ['c=', 'c-', 'dz=', 'd-', 'lj', 'nj', 's=', 'z=']
s = input()

for i in croatia :
	# croatia 리스트의 element에 해당하는 문자열을 공백으로 바꿔줌
    s = s.replace(i, ' ')
print(len(s))

10) 1316번 그룹 단어 체커
처음에 너무 복잡하게 생각하다가 누군가 정리해둔 필수 체크 조건만을 넣어서 완성했다. 그 두가지 조건은 <현재 문자가 이미 나온적 있고>, <바로 이전문자 인가> 이다. 처음 작성한 코드는 현재 게시판에서 열심히 반례를 찾아봤으나 아직 못찾았다. 코드가 길어지면 그에 따른 예외를 더욱 많이 막아야하기에 간단하게 로직을 정리하는 연습을 해야겠다.
참조: https://www.acmicpc.net/board/view/26273

N = int(input())
cnt = 0
for i in range(N):
    s = input()
    # 입력된 문자열을 한글자 씩 담아줄 리스트
    check = list()
    # 먼저 카운트를 +=1 해주고 체커에서 -=1 해주기
    cnt += 1
    for i in s:
        check.append(i)
        # 현재 문자열이 들어가기 전 리스트에 현재 문자열이 있는지
        if i in check[:-1]:
        	# 리스트에 element가 2개 이상인지 (아닐 시 인덱스 에러)
            if len(check) >= 2:
            	# 이미 현재 문자열이 있는데, 이전 문자와 다르다면 이는 그룹단어가 아니다. 따라서 -=1
                if check[-2] != check[-1]:
                    cnt -= 1
                    break
print(cnt)
#아직 반례를 못찾은 첫번 째 제출 답안 (오답)
#입력 받은 문자열을 돌며 해당 문자열의 모든 인덱스 추출하여 리스트에 담고 
#이 리스트를 돌며 바로 옆의 ele의 차이가 1이 아닐경우 cnt-=1해주는 로직이었다. 
N = int(input())
cnt = 0
for i in range(N):
    cnt += 1
    s = input()
    sset = set(s)
    indexList = list()
    ill = list()
    for j in sset:
        index = 0
        while index > -1:
            index = s.find(j, index)
            if index > -1:
                indexList.append(index)
                index += len(j)
        ill.append(indexList)
        indexList = list()
    #print(ill)
    for k in ill:
        if len(k) >= 2:
            for t in range(1, len(k)):
                if k[len(k)-t] - k[len(k)-t-1] == 1:
                    continue
                else:
                    cnt -= 1
                    break
            if cnt == 0:
                break
print(cnt)
profile
BackEnd Developer

0개의 댓글