Computer Science/백준 (Python)

[6단계] 문자열

inee0727 2022. 6. 12. 15:40

 

11654. 아스키 코드

 

▼해설보기

더보기
print(ord(input()))

 

cf) chr( )함수

chr 함수는 ord 함수의 반대 기능을 한다. 
아스키코드에 해당하는 숫자를 입력하면 그에 해당하는 문자열을 출력 한다. 

chr(100)
d

 


 

11720. 숫자의 합

 

▼해설보기

더보기

1. sum 함수를 이용

n = input()

print(sum(map(int,input())))

 

2. for문을 이용

n = input()
nums = input()
total = 0
for i in nums :
    total += int(i)  # total= total+int(i)
print(total)

1. sum함수 이용

처음에 입력받는 숫자의 개수 n은 입력만 받은 후 활용하지 않았다. 
두 번째 입력받는 n개의 숫자가 공백 없는 문자열인 점을 이용하여 map함수로 각 자리의 수를 int 타입으로 변환하였고 이후 sum 함수를 이용해서 모두 합한 값을 출력하였다. 

 

2. for문 이용

맨 처음에 입력받는 숫자의 개수 n은 활용하지 않았다. n개의 숫자를 문자열로 입력받아서 선언해두었던 nums 변수를 하나씩 분리해서 변수 i로 꺼내고서 각 문자열을 int 함수로 변환 후 더하였다.

 


 

10809. 알파벳 찾기

 

 

▼해설보기

더보기
word = input()
alphabet = list(range(97,123))  # 아스키코드 숫자 범위

for x in alphabet :
    print(word.find(chr(x)))

1. 코드에 대한 전체적인 풀이
이번 문제는 입력받은 문자열의 각 알파벳이 문자열 안에서 위치한 순서를 출력하는 문제이다. 
순서를 출력을 할 때는 a~ z 알파벳 순서에 맞춰서 입력받은 문자열에서 해당 알파벳이 없으면 -1을 출력하고 있으면 문자열 안에서 첫 번째 위치한 순서를 숫자로 출력한다. a~z까지의 알파벳은 아스키코드의 숫자 범위로 리스트를 생성했다. 아스키코드에서 a= 97이고 z= 122이다. 97 ~ 122까지의 숫자가 a~z까지의 알파벳에 대응하는 아스키코드이다. 
find 함수는 어떤 찾는 문자가 문자열 안에서 첫 번째에 위치한 순서를 숫자로 출력한다. 만일 찾는 문자가 문자열 안에 없는 경우에는 -1을 출력하는 함수이다. 이 문제에서 요구하는 바를 그대로 출력할 수 있는 함수여서 find 함수를 사용한 코드를 작성했다.

2. 코드 상단, 문자열을 입력받고 알파벳 리스트를 생성한다.

word = input()
alphabet = list(range(97,123))  # 아스키코드 숫자 범위

입려 받은 문자열은 word 변수에 선언하였다. 알파벳 리스트는 아스키코드를 이용해서 생성했다. 
a~z까지는 아스키코드에서 숫자 97~122에 해당하기 때문에 range 함수를 이용해서 97~122까지의 숫자 범위를 생성하고 list 함수를 이용해서 리스트로 변환하였다. 
 
3. 코드 하단에서 find 함수를 사용한다. 

for x in alphabet :
    print(word.find(chr(x)))

alphabet 리스트의 숫자로 이루어진 각각의 원소를 for문을 이용하여 변수 x에 선언하고서 우선 문자열로 변환하기 위해 chr 함수를 사용하였다. chr 함수는 아스키코드에 해당하는 숫자를 문자열로 변환시키는 함수이다. find 함수를 이용해 입력받은 문자열 안에 chr 함수로 변환된 문자가 있는지 찾는다. 만일 문자열이 있으면 찾는 문자가 첫 번째에 위치한 인덱스 숫자를 출력하고 없으면 -1을 출력하게 된다.

4. 아스키코드 변환 함수
위 문제에서 사용한 chr함수와 find 함수에 대해 추가적으로 설명하면, chr( ) 함수는 숫자(아스키코드) → 문자로 변환하는 함수이고 반대로 문자 → 숫자(아스키코드)로 변환할 때는 ord( ) 함수를 사용한다. 

5. find 함수와 index 함수의 비교
find 함수는 문자열에서만 사용 가능한 함수이다. 이와 유사한 기능을 하는 함수로 index 함수가 있다. 
index 함수는 문자열뿐만 아니라 리스트, 튜플과 같은 반복 가능한 iterable 자료형에서도 찾는 문자의 인덱스를 반환하는 함수로 쓰인다.  find 함수와 다른 점은 find 함수는 찾는 문자가 문자열 안에 포함되지 않은 경우 -1을 출력하지만 index함수는 >AttributeError가 발생한다.

 


 

2675. 문자열 반복

 

▼해설보기

더보기
n = int(input())

for _ in range(n):
    cnt, word = input().split()
    for x in word:
        print(x*int(cnt), end='')  # end='' 옆으로 붙임
    print()  # 줄넘김

 

1. 코드 풀이의 전체적인 내용

이번 문제는 숫자와 문자열을 입력받으면 문자열의 각각의 문자를 분리하여 입력받은 숫자만큼 반복해서 출력하는 문제이다. 출력할 때는 공백이나 기호의 구분 없이 문자를 붙여서 출력해야 한다. 출력문은 문자열의 *연산자를 이용하여 입력받는 수만큼 문자열이 반복되도록 하였고 공백 없이 옆으로 정렬될 수 있도록 print함수의 파라미터 end=에 '' 따옴표만 입력해서 공백 없이 출력되도록 하였다. 이렇게 end='' 값을 입력하는 경우 다음 문자열도 줄 넘김이 되지 않기 때문에 입력받은 하나의 문자열이 출력되는 for문이 끝나면 빈 print() 함수로 줄 넘김이 되도록 하였다.

2. 첫 번째 for문 코드에서 입력받는 문자를 변수에 지정한다.

n = int(input())

for _ in range(n):
    cnt, word = input().split()

첫 줄에 테스트 케이스 수를 입력받으면 테스트 케이스 수만큼 for문을 반복한다. 
첫 번째 for문이 반복될 때 숫자와 문자열을 한 줄에 입력받으면 각각 cnt, word라는 변수 이름을 지정하여서 각각의 값으로 선언하였다.

3. 두번째 for문에서 입력받은 문자열을 분리하고 출력문을 작성한다.
   

for x in word:
        print(x*int(cnt), end='')  # end='' 옆으로 붙임
    print()  # 줄넘김

for문 첫 줄의 기본구조는 [ for 변수 in iterable ]이다. 이후 수행할 문장은 한 칸 아래에 들여 쓰기 해서 작성한다. 
이때 반복 가능한 iterable 자료형은 문자열도 포함이 된다. 문자열을 iterable 자리에 입력하면 문자열의 각 문자를 분리해서 변수에 선언한다.

이후 한칸 들여쓰기한 실행 문장에서 * 연산자를 이용하여 x변수를 입력받은 숫자 cnt 만큼 반복하도록 하였다. 
출력 형태는 문자열을 옆으로 붙이면서 출력해야 하기 때문에 end 파라미터의 값에 빈 문자열인 따옴표''만 입력해서 문자열이 옆으로 붙어서 출력되도록 했다. 두 번째 for문이 모두 끝난 이후에는 빈 print 함수를 출력하였다.print 함수에서 end 파라미터를 이용하지 않을 때는 줄 넘김 기능이 기본값이고 print 함수 안에서 출력할 값이 여러 개인 경우 공백으로 출력 값이 구분된다. 

 

 


 

1157. 단어 공부

 

▼해설보기

더보기
word = input().upper()
word_list = list(set(word))

cnt = []
for i in word_list:
  count = word.count
  cnt.append(count(i))

if cnt.count(max(cnt)) > 1:  # count 숫자 최대값이 중복되면
  print("?")

else: # count 숫자 최대값 인덱스(위치)
  print(word_list[(cnt.index(max(cnt)))])

 

1. 코드 풀이 전체적인 내용

이번 문제는 문자열을 입력받으면 문자열 중에서 가장 많이 사용된 알파벳을 출력하는 문제이다. 가장 많이 사용된 알파벳의 개수가 1개가 아닌 경우에는 물음표를 출력해야 한다. 문제를 풀 때 입력받은 문자 중 중복되는 값을 제거한 리스트를 변수에 저장하고서 입력받은 문자열의 알파벳 개수를 세는데 이용했다. 빈 리스트를 생성하고서 개수를 센 수를 리스트에 추가하였고 최종적으로 수로 이루어진 리스트에서 가장 큰 값을 출력하였다. 이때, if-else 조건식을 이용해서 가장 큰 값의 개수가 여러 개인 경우 물음표를 출력하도록 했다. 

2. 코드 상단에서 문자열을 입력받고 중복 요소를 제거한 변수를 생성한다.

word = input().upper()
word_list = list(set(word))

입력 값을 받아서 대문자로 변환한다. 예) zZa >> ZZA

word의 중복값을 없앤 후 리스트를 만들어라. 예) word_list = [A,Z]

3. 코드 중반부, 알파벳이 사용된 횟수를 리스트로 저장한다.

cnt = []
for i in word_list:
  count = word.count
  cnt.append(count(i)) # count 숫자를 리스트에 append


word를 count해서 count 변수에 저장한다.

word의 i 갯수를 cnt에 추가한다. cnt = [2,1]

4. 코드 하단부에서 if조건식을 이용해서 출력문을 작성한다.

if cnt.count(max(cnt)) > 1:  # count 숫자 최대값이 중복되면
  print("?")

else: # count 숫자 최대값 인덱스(위치)
  print(word_list[(cnt.index(max(cnt)))])

cnt 최대값의 갯수과 1 초과시, ?를 출력한다.

아니면 1)cnt 최대값의 2)cnt에서 몇번째 위치했는지 확인 후(0번째) 3)word_list에서 추출해라. 0번째 값인 A 출력해라

 


 

1152. 단어의 개수

 

▼해설보기

 

더보기
#첫번째 풀이
word = input().split() 
print(len(word))

#두번째 풀이
print(len(input().split()))

 

2908. 상수

 

 

▼해설보기

더보기

1. if - else 코드

num1, num2 = input().split()
num1 = int(num1[::-1])  # [::-1] : 역순
num2 = int(num2[::-1])

if num1 > num2:
    print(num1)
else :
    print(num2)

 

2. 삼항 연산자 표현식 코드

num1, num2 = input().split()
num1 = int(num1[::-1])  # [::-1] : 역순
num2 = int(num2[::-1])

print(num1) if num1 > num2 else print(num2)

 

1. 전체적으로 문제를 푼 방법 요약
이번 문제는 입력받는 두 개의 숫자를 역순으로 바꾸어서 바뀐 숫자 중 큰 숫자를 출력하는 문제이다. 
문자를 역순으로 재배치하는 방법은 여러 가지가 있는데 이번 문제는 문자가 두 개밖에 없어서 문자 두 개를 각각 인덱스의 범위 연산자를 이용해서 바꾸었다. [::-1] 연산자를 이용하면 문자를 역순으로 재배치할 수 있다.

2. 코드 상단에서 두 수를 역순으로 재배치한다.

num1, num2 = input().split()
num1 = int(num1[::-1])  # [::-1] : 역순
num2 = int(num2[::-1])

파이썬은 input()으로 입력받는 모든 것을 문자열로 취급한다.

input으로 숫자를 문자열로 입력받으면 공백을 기준으로 두 개의 문자로 나누어서 각각을 변수에 선언한다. 
변수에 저장한 문자는 바로 숫자로 변환하지 않고 역순으로 재배치해야 하기 때문에 역순으로 재배치 후 숫자로 변환하였다. 역순으로 변환할 때는 범위 선택 연산자를 [::-1]로 지정해서 문자 배열을 뒤집어서 반환되도록 했다. 숫자 타입은 문자열처럼 분리해서 사용할 수 없어서 먼저 변환을 하고서 숫자로 변환했다. 숫자를 [::-1] 연산자로 지정할 때에는 TypeError가 발생한다. 'int' object is not subscriptable 사유로 int 타입은 사용 할 수 없다고 한다. 

3. 변환한 숫자의 크기를 비교한다.

if num1 > num2:
    print(num1)
else :
    print(num2)

if - else 조건식을 이용해서 두 수 중 큰 숫자를 출력하는 코드를 작성하였다.

4. if- else 조건식은 한줄로 표현 가능한 삼항 연산자 표현식으로도 작성하면 아래와 같다.

print(num1) if num1 > num2 else print(num2)

삼항 연산자를 사용할 때는 [ 참일 때 값 if 조건식 else 거짓일 때 값 ] 형태로 사용한다. if 조건식이 길어진다면 한 줄로 작성할 때 가독성을 해쳐서 사용하지 않지만 조건식이 간단한 경우는 한 줄로 표현하면 코드가 간단해져서 사용하기에 편리하다. 

 


 

5622. 다이얼

 

▼해설보기

더보기
alpabet_list = ['ABC','DEF','GHI','JKL','MNO','PQRS','TUV','WXYZ']
word = input()

time = 0
for unit in alpabet_list :  
    for i in unit:  # alpabet 리스트에서 각 요소를 꺼내서 한글자씩 분리
        for x in word :  # 입력받은 문자를 하나씩 분리
            if i == x :  # 두 알파벳이 같으면
                time += alpabet_list.index(unit) +3  # time = time + index +3
print(time)

 


 

2941. 크로아티아 알파벳

 

▼해설보기

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

for i in croatia :
    word = word.replace(i, '*')  # input 변수와 동일한 이름의 변수
print(len(word))

 


 

1316. 그룹 단어 체커

 

 

▼해설보기

더보기
n = int(input())

group_word = 0
for _ in range(n):
    word = input()
    error = 0
    for index in range(len(word)-1):  # 인덱스 범위 생성 : 0부터 단어개수 -1까지 
        if word[index] != word[index+1]:  # 연달은 두 문자가 다른 때,
            new_word = word[index+1:]  # 현재글자 이후 문자열을 새로운 단어로 생성
            if new_word.count(word[index]) > 0:  # 남은 문자열에서 현재글자가 있있다면
                error += 1  # error에 1씩 증가.
    if error == 0:  
        group_word += 1  # error가 0이면 그룹단어
print(group_word)

출처 : https://ooyoung.tistory.com/