백준 단계별로 풀어보기 - 5단계: 문자열, 6단계: 심화1 코드 리뷰

Kim So-Myoung·2024년 2월 15일
0
post-thumbnail

5단계: 문자열

  • 아스키 코드 변환
    ord(문자): 아스키 코드 값 반환
    chr(숫자): 숫자에 맞는 아스키 코드 반환
print(ord('A')) # 65
print(chr(65)) # A
  • list, map 함수로 입력 받은 값 리스트 형태로 만들기
numList = list(map(int,input())) # 공백 없이 54321 입력
stringList = list(input()) # 공백 없이 UNUCIC 입력
print(numList) # [5, 4, 3, 2, 1]
print(stringList) # ['U', 'N', 'U', 'C', 'I', 'C']
  • split 함수 주의사항
string = "word1 word2  word3    word4     "
print(string.split())
print(string.split(" "))
>>> ['word1', 'word2', 'word3', 'word4']
['word1', 'word2', '', 'word3', '', '', '', 'word4', '', '', '', '', '']

split() -> 공백이 n개가 있어도 1개로 처리하여 공백없이 구분
split(" ") -> 공백 1개까지만 변수 구분자로 처리, 나머지는 리스트 요소로 처리

10809: 알파벳 찾기

내 코드

string = list(map(str, input()))
result = [ -1 for _ in range(26)]
stringIndex = []
index = 0

for i in range (len(string)):
  # print(ord('a')) 97 ~ print(ord('z')) 122 = 소문자 개수 26개
  stringIndex.append(ord(string[i]) - 97)

for i in stringIndex:
  if result[i] == -1:
    result[i] = index
  index += 1

for i in range(26):
  print(result[i], end=' ')

다른 사람 코드

word = input()
# print(ord('a')) 97 ~ print(ord('z')) 122 = 소문자 개수 26개
alphabet = list(range(97, 123))

for x in alphabet:
  print(word.find(chr(x)), end=' ')

아스키 코드를 사용한다는 아이디어까지는 캐치했지만, find 함수를 생각해내지 못했다.

  • find 함수
    find 메서드는 "찾을 문자" 혹은 "찾을 문자열"이 존재하는지 확인
    찾는 문자가 존재 한다면 해당 위치의 index를 반환
    찾는 문자가 존재 하지 않는다면 -1을 반환
str.find(찾을 문자)
str.find(찾을 문자, 시작 index)
str.find(찾을 문자, 시작 index, 끝 index)
  • 문자열 순서 뒤집기

slice

[start:stop:step]
string[::-1] # 반대 방향으로 데이터 나열

2908: 상수

a, b = input().split()
print(max(a[::-1],b[::-1])) #슬라이스를 이용한 문자열 뒤집기

5622: 다이얼

내 코드

# 아스키 코드 이용
number = list(input())
sum = 0

# 아스키코드 print(ord('A')): 65 ~ print(ord('Z')): 90 대문자 총 26개
list = list(range(65, 91))

for i in range(len(number)):
  if(79 >= ord(number[i])): # 숫자 2~6
    sum += 3 # 숫자 2에 도달하기까지 3초
    sum += (ord(number[i])-65) // 3 # 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다.
  elif(83 >= ord(number[i])): # 숫자 7
    sum += 8
  elif(86 >= ord(number[i])): # 숫자 8
    sum += 9
  else: # 숫자 9
    sum += 10

print(sum)

다른 사람 코드

dial = ['ABC','DEF','GHI','JKL','MNO','PQRS','TUV','WXYZ']
string = input()
sum = 0

for i in range(len(string)):
  for j in dial:
    if string[i] in j:
      sum += dial.index(j) + 3 # 숫자 2에 도달하기까지 3초 + index

아스키 코드를 사용하는게 능사는 아닌 듯 하다.
아래가 더 좋은 코드로 파악된다. 알고리즘을 잘 파악하자.

11718: 그대로 출력하기

while True:
  try:
    print(input())
  except EOFError: # EOF는 END OF FILE 즉 문자의 끝 
    break

EOF(End Of File) Error: input을 사용한 입력 시 더 이상 입력할 파일이 없음을 의미

6단계: 심화 1

1157: 단어 공부

word = input().upper()
wordList = list(set(word)) # set 함수를 쓰고 list화 - 단어의 문자 list(중복x)
countList = []

for i in wordList:
  countList.append(word.count(i))

if(countList.count(max(countList)) > 1):
  print('?')
else:
  print(wordList[countList.index(max(countList))])

해설 및 사용된 함수
upper() - 대문자 변경 함수/ lower() - 소문자 변경 함수
wordList - 단어의 문자 list(중복x)
countList - wordList에서 요소를 뽑아 단어에 사용된 횟수로 변환하여 배열화
wordList & countList 배열의 길이 같음, index 매핑

1316: 그룹 단어 체커

n = int(input())
sum = n

for _ in range(n):
    word = input()
    for i in range(len(word) - 1):
        if (word[i] == word[i + 1]):
            pass
        elif (word[i] in word[i + 1:]):
            sum -= 1
            break
print(sum)

word[i]와 word[i + 1]을 비교 하므로 for문은 단어의 길이 - 1만큼만 돌려야한다.
sum = 0, sum += 1로 count할 경우 elif (word[i] in word[i + 1:]): 조건 식을 만족하지 못하면 sum이 계산이 되지 않는다. 그러므로 count는 n으로 초기화하고, elif (word[i] in word[i + 1:]): 일 경우에만 count에서 제외하면 된다.

  • pass, continue, break 차이
  1. pass : 실행할 코드가 없는 것으로 다음 행동을 수행(문법적으로 문장이 필요하지만, 프로그램이 특별히 할 일이 없을 때 사용).
  2. continue : 하위 코딩을 건너뛰고 다음 loop로 넘어갈때 사용
  3. break : 반복문을 멈추고 loop를 중단할때 사용

25206: 너의 평점

grade = ['A+', 'A0', 'B+', 'B0', 'C+', 'C0', 'D+', 'D0', 'F']
gradeNum = [4.5, 4.0, 3.5, 3.0, 2.5, 2.0, 1.5, 1.0, 0.0]

total = 0
result = 0

for _ in range(20):
    n, s, g = input().split()
    if g != 'P':
        total += float(s)
        result += float(s) * gradeNum[grade.index(g)]

avg = result/total
print(round(avg, 6))

💡Tip
문자, 숫자의 list length가 같고 매핑되는 경우, if문이 아닌
리스트a[리스트b.index(리스트b에 존재하는 요소 값)] 를 이용

profile
Full-Stack Engineer

0개의 댓글