본문 바로가기
백준 (코테)

5. [5단계] 제목: 문자열

by 코린이의 세계 2024. 8. 13.
1단계.
단어 S와 정수 i가 주어졌을 때, S의 i번째 글자를 출력하는 프로그램을 작성하시오.

답: s = input()
i = int(input())
print(s[i-1])

따로 인 풋을 정하지 않으면 그냥 문자로 입력이 된다. 그리고 파이썬은 "놀랍게도" 문자열을 배열로 접근할 수 있다. (배열 인덱스)


2단계.
알파벳으로만 이루어진 단어를 입력받아, 그 길이를 출력하는 프로그램을 작성하시오.

답: print(len(input()))

len 함수는 길이를 출력하는 함수이다.


3단계.
문자열을 입력으로 주면 문자열의 첫 글자와 마지막 글자를 출력하는 프로그램을 작성하시오.

입력의 첫 줄에는 테스트 케이스의 개수 T(1 ≤ T ≤ 10)가 주어진다.

답: x = int(input())

for i in range(x):
    a = str(input())
    print(a[0]+a[-1])

먼저 x로 개수를 기입받고, x만큼 반복문을 돌린다. a 변수에 문자열을 받아주고, 처음 글자 인덱스 (0) 그리고 마지막 글자 인덱스 (-1)로 프린트해준다. (인덱스 마지막은 -1로 정의가 가능하다.)


4단계.
알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.

답: a = input()
 
print (ord(a))

파이썬의 강점이 보이는 코드다. ord 함수는 입력 값을 아스키 코드값으로 바꿔준다.


5단계.
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.

첫째 줄에 숫자의 개수 N (1 ≤ N ≤ 100)이 주어진다. 둘째 줄에 숫자 N개가 공백 없이 주어진다.

답: num = input()
numbers = list(map(int,input()))

print(sum(numbers))

개수 N을 입력받는다. 이후 numbers라는 리스트에 입력 값을 저장한다. 공백이 없으니 split를 쓸 필요도 없다. 이후 numbers의 전체 합을 프린트 해준다. (num은 쓰지도 않는다... 꼼수)


6단계.
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.

각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치,... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다.
만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출력한다. 단어의 첫 번째 글자는 0번째 위치이고, 두 번째 글자는 1번째 위치이다.

답: S = input()
Alphabet ='abcdefghijklmnopqrstuvwxyz'

for i in Alphabet:
    if i in S:
        print(S.index(i), end= ' ')
    else:
        print( -1, end =' ')

그냥 알파벳 (a부터 z까지)를 하나 정의해 둔다. 이러면 되게 쉽게 풀린다. 단어 s를 입력받아준다. 이후 "알파벳" 전체 크기만큼 반복문이 돌아가는데, 이때 s가 있으면 s의 인덱스를 출력, 공백도 출력해 준다. 그게 아니라면 -1을 출력한다.

find 함수를 이용해서 풀 수 있긴 하지만, 나에겐 이게 더 직관적이었다.


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

QR Code "alphanumeric" 문자는 
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./:
이다.

답: a = int(input())
for i in range(a):
  b, c = input().split()
  for i in range(len(c)):
    print(int(b) * c[i], end='')
  print()

놀랍게도 입력값 자료형을 숫자로 받아야 이 문제가 쉽게 풀린다.  "alphanumeric"  문자를 숫자 취급해주는 것이다. 이 숫자만큼 for문을 돌려주면 된다. 중요한 것은 R과 P이다. (짠 코드에서는 b / c이다)

b와 c 둘 다 문자 취급을 해준다. 이후 c의 길이만큼 반복시키고, b를 강제 형변환해서 출력, c는 문자열이니 배열로 추출이 가능해진다.


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

답: words = input().split()
print(len(words))

문자를 입력받고, split으로 쪼개준다. 이후 words의 문자열 길이를 출력해 준다. (len)


9단계.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

답: num1, num2 = input().split()
num1 = int(num1[::-1])  
num2 = int(num2[::-1])

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

핵심은 input()함수는 모든 입력값을 "문자열"처럼 여긴다는 것. 즉, 숫자를 문자열처럼 여기고 입력시킨 이후, 배열을 이용해서 문자열을 거꾸로 뒤집어 준다. [::-1]을 써주면 문자열을 서로 거꾸로 바꾸어 준다.

이러면 num1과 num2는 바뀌게 된다. 이후 int로 형변환하고 이 부분을 if문으로 수의 크기를 측정하면 된다.


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

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

할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.

답: dial = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQRS', 'TUV', 'WXYZ']
word = input()
result = 0

for i in range(len(word)) :
    for j in dial :
        if word[i] in j :
            result += dial.index(j)+3
print(result)

문자열 부분에서 가장 어려웠던 문제이었다. 보면 "배열" , "조건문" , "반복문" , "문자열" 관련 문제이다.

정말 단순하게 if문을 각각의 케이스로 나누어서 하드 코딩을 할 수는 있겠지만, 좀 더 간략하게 코드를 작성할 수 있다. 먼저 dial이라는 배열을 만든다. 이 배열은 'ABC' , 'DEF' ~~ 'WXYZ'까지의 문자열을 지니고 있다. 최종값은 "시간"을 구하는 것이니, result를 0으로 초기화해둔다.

이후 단어를 받아주는 word를 입력해 둔다. 이제 이중 for문을 돌 것인데, 어디까지나 단어의 길이만큼만 돌아가야 하기에 len함수를 써두었다. 이후 dial안에서 0부터 차근차근 실행해 간다. 내부 for문은 단어가 dial에 있으면 dial의 인덱스 숫자와 3을 더한 수를 result에 저장한다. (정확히는 result에 더하고 다시 result에 넣어둔다. 계속 합해야 하기 때문..)

이 안의 for문은 탈출하면 다시 밖의 for문으로 돌아간다. 이후 다시 내부 for문으로 돌아가면서 앞에서 말한 과정을 실행한다. 이건 입력받은 단어의 길이가 다 끝나면 종료가 된다. 이 for문이 전부 종료되면 result에 모든 숫자가 기입된다. 이후 result를 출력한다. (dial.index(j)에 3을 더하는 이유는 다이얼 번호 2번까지 3초가 걸리기 때문이다. 2번부터 이야기하는 건 인덱스가 0번부터 시작이기에 2번부터 카운트하는 것이다.) < 다이얼에서 1번은 인덱스 번호로 0번 취급하면 됨.

(구글링 아니였으면 평성 못 풀 듯...)


11단계.
입력 받은 대로 출력하는 프로그램을 작성하시오.

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

일단 입력받는 것에 딱히 제한이 없어서 while True문을 써야 한다. 이후 try문을 써서 예외 사항을 체크해줘야 한다. 예외 사항에서 EOFError가 나면 break를 걸어줘야 한다. EOFError를 모르면 무조건 틀린다. (그래서 호기롭게 썼다가 틀렸음)

 

구글링은 최고다.

정말 다양한 풀이가 있고, 이런 식으로도 풀 수 있구나를 항상 백준 풀면서 느꼈다. 그리고 코드를 이해하는 과정도 중요하다고 느낀다.

'백준 (코테)' 카테고리의 다른 글

7. [7단계] 제목: 2차원 배열  (0) 2024.08.15
6. [6단계] 제목: 심화 1단계  (0) 2024.08.14
1~4단계 백준 복습  (0) 2024.08.12
4. [4단계] 제목: 1차원 배열  (0) 2024.08.10
3. [3단계] 제목: 반복문  (1) 2024.08.09