190110 백준 알고리즘 문제풀기
10 Jan 2019 | baekjoonBaekjoon 알고리즘 문제풀기
[11654] 아스키 코드
문제
-
입력받은 문자를 아스키코드표의 10진수 형태로 출력
ord(chr(문자))
는 문자 하나를 입력받아 아스키코드표의 10진수 형태로 출력해준다.- 반대로
chr(ascii number)
를 입력하면 숫자를 문자로 변환해준다.
정답
char = input()
print(ord(str(char)))
[10809] 알파벳 찾기
문제
-
단어가 입력된 경우, 단어에 포함된 알파벳이 위치하는 index를 출력하고, 단어에 포함되지 않은 알파벳의 경우엔 -1을 출력한다.
-
더 간단하게 푸는 방법이 있을 듯 한데.. 너무 복잡하게 풀어낸 것 같다.
정답
a = str(input())
alphabets = []
result = []
for j in range(26):
alphabets.append(chr(97+j))
result.append('-1')
for j in range(len(a)):
for i in range(len(alphabets)):
if alphabets[i]==a[j]:
if result[i]=='-1':
result[i] = str(j)
for j in range(len(result)):
print(result[j], '',end='')
print('')
[2675] 문자열 반복
문제
- 입력 된 테스트 케이스만큼의 각 문자 반복 횟수와 문자열을 받고, 반복횟수만큼 문자열 각 자리를 반복해서 출력
정답
a = int(input())
for j in range(a):
n, k = map(str, input().split())
#print(n, k)
for i in range(len(k)):
for p in range(int(n)):
print(k[i], end='')
print('')
[1157] 단어 공부
문제
- 알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성
-
대문자와 소문자를 구분하지 않음
ord(chr)
를 사용하여 아스키 코드로의 변환 후 32 증감으로(ascii index) 대소문자 변환을 함list.count(member)
를 이용하여 해당 리스트에 해당member
가 존재하는지 갯수 확인max(list)
를 사용하여 해당 리스트의 최댓값을 확인
정답
a = list(str(input()))
for j in range(len(a)):
if ord(a[j])<91:
a[j] = chr(ord(a[j])+32)
a = sorted(a)
alphabets = sorted(set(a))
result = []
for j in range(len(alphabets)):
result.append(a.count(alphabets[j]))
if len(result)==1:
print(chr(ord(alphabets[0])-32))
elif result.count(max(result))>1:
print('?')
else:
print(chr(ord(alphabets[result.index(max(result))])-32))
[1316] 그룹 단어 체커
문제
- N개의 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 찾는 프로그램을 제작
- 예시
- ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나므로 그룹 단어
- kin kin도 k, i, n이 연속해서 나타나므로 그룹 단어
- aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아님
string.find(chr)
는chr
문자를string
의 왼쪽에서부터 찾은 후, index를 반환한다.string.rfind(chr)
는chr
문자를string
의 오른쪽에서부터 찾은 후, index를 반환한.
정답
def find_group(l):
temp = []
s = ''
result = []
for j in range(len(l)): # 입력 된 list를 string형태로 변환
s += l[j]
for j in range(len(s)): # 변환 된 string에 왼쪽부터 loop를 돌며
l = s.find(s[j]) # l: 해당 문자(string의 j번째 문자)가 가장 왼쪽에서 나오는 순번
r = s.rfind(s[j]) # r: 해당 문자(string의 j번째 문자)가 가장 오른쪽에서 나오는 순번
temp = [] # temp 변수 초기화
for i in range(l, r+1): # string에서 l부터 r 사이에
temp.append(s[i]) # 존재하는 문자들을 temp에 이어 붙인 후
if temp.count(s[l])==len(temp): # 만약 l과 r 사이에 s[l](최 좌측 문자)과 동일한 문자만 들어있다면
result.append(True) # 그룹 문자이므로 True
else: # 그렇지 않다면
result.append(False) # 그룹 문자가 아니므로 False
# for loop을 돌면서 문자별로 전체 단어에 대해서 수행
if False in result: # 만약 하나의 False만 존재하더라도 그룹 문자가 아니므로 counting되면 안됨
return 0
else: # False가 하나도 없다면 그룹 문자이므로 counting 되도록 1 return
return 1
n = int(input())
cnt = 0
for j in range(n):
a = list(str(input()))
if len(set(a))==len(a): # 입력된 단어가 모두 다른 문자로 구성된 경우
cnt += 1 # 그룹 단어
else: # 그렇지 못한 경우
cnt += find_group(a) # 그룹 단어인지 판별 후 그룹 단어로 카운팅
print(cnt)
[2908] 상수
문제
- 두 수를 입력받고, 입력 받은 두 수를 각각 거꾸로 읽은 후 대소를 비교하여 큰 수를 출력
- 예시
- 734과 893을 입력 받았을 때, 수를 437과 398로 거꾸로 인식한 후 대소를 비교하여 두 수중 큰 수인 437을 출력한다.
정답
a, b = map(str, input().split())
a_r = ''
b_r = ''
for j in range(len(a)-1, -1, -1):
a_r += a[j]
for j in range(len(b)-1, -1, -1):
b_r += b[j]
if int(a_r)>int(b_r):
print(a_r)
else:
print(b_r)
[5622] 다이얼
문제
- 입력된 문자열을 조건에 따라 숫자로 변환 한 후, 주어진 조건에 따른 다이얼 누르는 시간을 계산하여 출력
- 조건
- 1~9, 0의 숫자는 각각 전화기의 숫자배열대로 나뉘어짐
- 입력은 대문자로 이루어진 영어단어
- 단어의 각 문자에 알맞는 숫자로 변환 후 1~0 순서로 구성된 전화 다이얼 누르는 시간을 계산
- 각각 1은 2초, …. 0은 11초가 걸림
정답
a = list(str(input()))
numbers = []
for j in range(len(a)):
b = ord(a[j])
if b>ord('Z'):
numbers.append(0)
elif b>ord('V'):
numbers.append(9)
elif b>ord('S'):
numbers.append(8)
elif b>ord('O'):
numbers.append(7)
elif b>ord('L'):
numbers.append(6)
elif b>ord('I'):
numbers.append(5)
elif b>ord('F'):
numbers.append(4)
elif b>ord('C'):
numbers.append(3)
elif b>64:
numbers.append(2)
else:
numbers.append(1)
result = 0
for j in range(len(numbers)):
if numbers[j]==0:
result += 11
else:
result += (int(numbers[j])+1)
print(result)
[2941] 크로아티아 알파벳
문제
- 아래의 문자표를 보고, 문자열을 크로아티아 문자열로 변경 후 크로아티아 문자의 갯수를 센다.
- 상당한 노가다성 문제이다.
- 중간에 길이가 3짜리인 문자가 있어서
IndexError
때문에try:
,except IndexError:
와continue
를 사용하여 해결하였다. - 리스트 내의 빈 칸을 제거하는
list = [x for x in list if x]
로 문제를 쉽게 풀 수 있었다.
정답 1
a = list(str(input()))
for j in range(len(a)-1):
if a[j]=='c':
if a[j+1]=='=':
a[j] = 'c='
a[j+1] = ''
j += 1
elif a[j+1]=='-':
a[j] = 'c-'
a[j+1] = ''
j += 1
elif a[j]=='d':
try:
if a[j+1]=='-':
a[j] = 'd-'
a[j+1] = ''
j += 1
if a[j+1]=='z' and a[j+2]=='=':
a[j] = 'dz='
a[j+1] = ''
a[j+2] = ''
j += 2
except IndexError:
continue
elif a[j]=='l' and a[j+1]=='j':
a[j] = 'lj'
a[j+1] = ''
j += 1
elif a[j]=='n' and a[j+1]=='j':
a[j] = 'nj'
a[j+1] = ''
j += 1
elif a[j]=='s' and a[j+1]=='=':
a[j] = 's='
a[j+1] = ''
j += 1
elif a[j]=='z' and a[j+1]=='=':
a[j] = 'z='
a[j+1] = ''
j += 1
else:
continue
a = [x for x in a if x]
print(len(a))
- 미리 크로아티아 문자를 정의하는 dictionary를 만들어 더 쉽게 풀 수 있다.
정답 2
a = input() # string 형식으로 입력을 받고
dics = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="] # 크로아티아 문자가 저장된 dictionary 안에서
for key in dics: # 각 key 값에 대해(c= 부터 차례대로 z=까지)
a = a.replace(key, "_") # key값과 동일한 문자를 _로 대체
print(len(a)) # 결과 출