[어제의 백준]파이썬 문자열

한지원·2021년 1월 6일
1

어제 노트북을 찾으러 갔는데 로그인이 안되는 것이다. 수리해주신 분과 한시간가량 구글링 하며 해결법을 찾다가 결국 시간이 지나니 로그인이 되었다. (시들..) 수리할 때 메인보드가 꺼지기 때문에 윈도우 자체에서 보안을 위해 로그인을 막아놓은 것 같다고 했다. (확실하진 않음) 진을 다 빼고와서 그런지 이날의 공부는 큰 진척이 없었다.😝 결국 백준 리뷰도 못하고 자버렸고.. 오늘의 내 몫이 되었당 ㅋ


2675. 문자열 반복

문제
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다.
QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ$%*+-./: 이다.


입력
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. S의 길이는 적어도 1이며, 20글자를 넘지 않는다.


출력
각 테스트 케이스에 대해 P를 출력한다.

첫번째 제출

import sys
for i in range(int(input())):
        line = sys.stdin.readline().split()
        for j in range(len(line[1])):
                print(line[1][j]*int(line[0]), end='')
        print()

이날 느낀건데 파이썬에서 for문을 너무 못써먹었다. 왜 굳이 j를 인덱스로밖에 못썼는지..ㅋ c언어적 사고.. 연습이 답이다. 많이 풀어봐야겠다.

두번째 제출

import sys
for i in range(int(input())):
        r, s = sys.stdin.readline().split()
        a = ''
        for j in s:
                a += j*int(r)
        print(a)

처음엔 r과 s를 line이라는 리스트에 [0], [1]번째 인덱스로 넣었다면 두번째엔 r과 s 변수를 따루 두어 입력받았다. 그리고 위에서 느낀대로 for문을 더 잘 활용하기 위해 j에 문자열 s를 그대로 집어넣었다. 참 직관적이고 쉬운 개념인데 익숙하지 않아서 코드를 길어지게 만드는 것 같다. 그리고 첫번째 코드에서는 s의 알파벳 개수만큼 for문을 돌려서 출력을 모두 해주었지만 두번째엔 a에 문자열의 형태로 이어준 뒤 한번에 출력했다.


1157. 단어공부

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


입력
첫째 줄에 알파벳 대소문자로 이루어진 단어가 주어진다. 주어지는 단어의 길이는 1,000,000을 넘지 않는다.


출력
첫째 줄에 이 단어에서 가장 많이 사용된 알파벳을 대문자로 출력한다. 단, 가장 많이 사용된 알파벳이 여러 개 존재하는 경우에는 ?를 출력한다.

첫번째 코드

import sys
l = []

a = ''.join(sorted(sys.stdin.readline().rstrip('\n')))
a = a.upper()
b = list(set(a))

for i in b:
        l.append(a.count(i))
        
max_idx = l.index(max(l))
cnt = 0

for i in range(len(b)):
        if l[i] == max(l): cnt += 1
            
if cnt == 1: print(b[max_idx])
else: print('?')

두번째 코드

import sys
l = []
max_cnt = 0
a = sys.stdin.readline().rstrip('\n').upper()
b = set(a)
for i in b:
        if (a.count(i)) > max_cnt:
             max_cnt = a.count(i)
             max_alph = i
        elif a.count(i) == max_cnt:
             max_alph = '?'

print(max_alph)

두번째 코드에서 코드길이, 실행시간, 메모리 모두를 줄일 수 있었다. 어찌 보면 당연한 것.
a에서 중복을 제거하기 위해 b에 set으로 넣고 그걸 다시 list로 바꿔버리기..
선택정렬을 할 때처럼 알파벳이 반복된 최대값(max_cnt)을 찾은 뒤 마지막에 그것을 바로 출력시켜버리면 되었는데 갯수를 또 리스트 l에 추가해서 또 맥스함수에 인덱스에 ㅋㅋ

필요한 라이브러리를 적절히 이용하기와 동시에 무분별하게 호출하지 않기 연습!!!


2908. 상수

문제
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.
상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.
두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.


입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.


출력
첫째 줄에 상수의 대답을 출력한다.

reverse를 하면 리스트는 뒤집어지지만 문자열은 뒤집을 수 없다. join을 함께 이용해서 문자열을 뒤집었다.
첫번째 코드

a, b = input().split()
a = ''.join(reversed(a))
b = ''.join(reversed(b))
print(a) if int(a)>int(b) else print(b)

join말고 문자열을 뒤집는 방법은 없을까? 있다.

a = int(a[::-1])
b = int(b[::-1])

파이썬의 삼항연산자는 c와 좀 다른 방식으로 쓰인다. 삼항연산자를 쓰면 여러줄을 써야할 조건문을 한줄에서 끝낼 수 있다는게 참 좋다.
참일 때 실행문 if 조건식 else 거짓일때 실행문


그동안 노트북에서 팬소음이 정말 1초도 쉬지 않고 나서 신경쓰지 않고 공부해도 어느샌가 머리가 지끈했는데 조용해지니까 노트북 킬 맛이 난다.. 8만원에 정신건강을 얻었다. 해피~🥳

0개의 댓글