190110 백준 알고리즘 문제풀기

|

Baekjoon 알고리즘 문제풀기

[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] 크로아티아 알파벳

문제

  • 아래의 문자표를 보고, 문자열을 크로아티아 문자열로 변경 후 크로아티아 문자의 갯수를 센다.
views
  • 상당한 노가다성 문제이다.
  • 중간에 길이가 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)) # 결과 출