목차
아스키 코드(#11654)
- Problem
알파벳 소문자, 대문자, 숫자 0-9중 하나가 주어졌을 때, 주어진 글자의 아스키 코드값을 출력하는 프로그램을 작성하시오.
- Hint
파이썬에서는 ord() 함수를 이용하여 아스키코드로 변환을 할 수 있고 chr() 함수를 이용하여 아스키코드에서 변환할 수 있다.
- Solution
ord()을 이용한 풀이
print(ord(input()))
ord() 함수는 str 자료형을 받는 함수이다.
숫자의 합(#11720)
- Problem
N개의 숫자가 공백 없이 쓰여있다. 이 숫자를 모두 합해서 출력하는 프로그램을 작성하시오.
- Hint
문제에서 나올 수 있는 조건등을 생각해보면 공백없이 나열되어있는 숫자 N은 절대 2자리수 이상이 될수 없다.
- Solution
map()을 이용한 풀이
input()
print(sum(map(int,input())))
알파벳 찾기(#10809)
- Problem
알파벳 소문자로만 이루어진 단어 S가 주어진다. 각각의 알파벳에 대해서, 단어에 포함되어 있는 경우에는 처음 등장하는 위치를, 포함되어 있지 않은 경우에는 -1을 출력하는 프로그램을 작성하시오.
- Hint
받아오는 알파벳을 그대로 사용하려면 str 끼리의 비교
ASCII 문제에서 배웠던 ord()를 사용하여 정수끼리의 비교
find() 함수로 몇번째에 있는지 찾을수도 있다.
- Solution
ord()을 이용한 풀이
a=[-1]*26
count=0
for i in map(ord,input()):
if a[i-97]==-1:
a[i-97]=count
count+=1
print(*a)
a=[-1]*26은 마치 matlab의 zeros() 리스트 생성하는 것과 비슷한데 -1 값을 가진 크기가 26인 리스트를 형성하여 받아온 인자를 count 변수를 할당해주는 방식을 사용하였다.
find를 이용한 풀이
print(*map(input().find,map(chr,range(97,123))))
map함수 내에 적용함수와 find 할 인자까지 전부 탑재하여 짧게 코딩을 해보았다.
백준 숏코딩 상위 답안과 같다!
문자열 반복(#2675)
- Problem
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. S에는 QR Code "alphanumeric" 문자만 들어있다. QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.
- Solution
open() 을 이용한 풀이
for n,_,*a,_ in [*open(0)][1:]:
for i in a:
print(i*int(n), end='')
print('')
open을 이용하여 처음 입력값을 무시하고 n_*a_ 형태로 받아오게 하였다.
<str 자료형> * <int 자료형> 은 str이 n 번 반복하는 형태로 출력이 된다. end=''을 이용하여 같은 줄끼리는 줄바꿈이 없도록 하고 줄이 넘어갈 시에는 for 문이 한번 끝나면 print('')을 통하여 줄바꿈을 해주었다.
단어 공부(#1157)
- Problem
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
- Hint
본 문제에서는 대소문자를 구분하지 않고 출력값은 대문자로 통일한다 했으니 a와 A를 같게 받아들이는 코드를 생각해보자
1. 알파벳 소문자 a 의 아스키 코드는 97이고 대문자는 65이다. 아스키를 이용한 방법
2. upper() 함수로 대문자로 만들어줄 수가 있다.
dict(), set() 자료형을 활용해보자
- Solution
1번의 방법을 이용한 풀이
a={}
count=0
for i in list(map(ord,input())):
if i>=97:
i-=32
if i not in a:
a[i] = 0
a[i] += 1
for n in a:
if a.get(n)==max(a.values()):
count+=1
result = n
if count==1:
print(chr(result))
else:
print('?')
2번의 방법을 이용한 풀이
a={}
count=0
for i in list(input().upper()):
if i not in a:
a[i] = 0
a[i] += 1
for n in a:
if a.get(n)==max(a.values()):
count+=1
result = n
if count==1:
print(result)
else:
print('?')
집합 set()을 이용한 풀이
s=input().upper()
m=0
for i in set(s):
td=s.count(i)
if m==td:
out='?'
if m<td:
m=td
out=i
print(out)
최대값을 m에 계속 저장하면서 다음 값이 m 과 같으면 ? 을 출력인자에 넣어놓고 더 큰 값이 나오면 그 값을 또 m에 저장하고 출력인자도 리프레시 해준다.
단어의 개수(#1152)
- Problem
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.
- Hint
공백이 앞 뒤에 있을수도 있다.
공백의 len() 은 0으로 길이가 없다.
공백인 리스트는 if not (리스트명): 이 True 이다.
- Solution
공백의 개수를 이용한 풀이
print(len(input.split()))
공백인 리스트 특성을 이용한 풀이
cnt=0
for i in input().split():
cnt+=1
if not i:
cnt-=1
print(cnt)
상수(#2908)
- Problem
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다. 상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다. 두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.
- Hint
항상 세자리수를 주었기 때문에 신경을 쓰지 않아도 되는 부분이 있다.
[::-1]을 이용하면 리스트의 순서를 바꿀수 있다.
- Solution
join을 이용한 풀이
a,b = input().split()
print(max(int(''.join(list(a)[::-1])),int(''.join(list(b)[::-1]))))
두 수를 입력받고 join() 함수를 이용하여 역 순으로 배열된 리스트의 인자들을 다시 하나의 문자열로 만들고 int() 형으로 선언후에 max() 함수를 통하여 최대값을 출력하였다.
입력값 전체를 역수로 먼저 만든 후에 계산한 풀이
print(max(input()[::-1].split()))
위의 식처럼 자료형의 변화를 주지 않아도 되기 때문에 이 방법이 더 간편하다.
다이얼(#5622)
- Problem
상근이의 할머니는 아래 그림과 같이 오래된 다이얼 전화기를 사용한다. 전화를 걸고 싶은 번호가 있다면, 숫자를 하나를 누른 다음에 금속 핀이 있는 곳 까지 시계방향으로 돌려야 한다. 숫자를 하나 누르면 다이얼이 처음 위치로 돌아가고, 다음 숫자를 누르려면 다이얼을 처음 위치에서 다시 돌려야 한다. 숫자 1을 걸려면 총 2초가 필요하다. 1보다 큰 수를 거는데 걸리는 시간은 이보다 더 걸리며, 한 칸 옆에 있는 숫자를 걸기 위해선 1초씩 더 걸린다. 상근이의 할머니는 전화 번호를 각 숫자에 해당하는 문자로 외운다. 즉, 어떤 단어를 걸 때, 각 알파벳에 해당하는 숫자를 걸면 된다. 예를 들어, UNUCIC는 868242와 같다. 할머니가 외운 단어가 주어졌을 때, 이 전화를 걸기 위해서 필요한 최소 시간을 구하는 프로그램을 작성하시오.
- Hint
중간에 중복되는 4개를 해결할 방법을 찾아야한다.
- Solution
몫을 이용한 풀이
out=0
for i in input():
if ord(i)<=80:
out+=(ord(i)-56)//3
elif ord(i)==90:
out+=10
else:
out+=(ord(i)-57)//3
print(out)
뭔가 숫자 간의 추가적인 공통 지표를 찾거나 최대 최소 지표를 이용하면 규칙은 찾을 수 있겠지만 총 3번의 케이스에 나눠서 풀이를 하였다.
크로아티아 알파벳(#2941)
- Problem
예전에는 운영체제에서 크로아티아 알파벳을 입력할 수가 없었다. 따라서, 다음과 같이 크로아티아 알파벳을 변경해서 입력했다. 크로아티아 알파벳 변경 č c= ć c- dž dz= đ d- lj lj nj nj š s= ž z= 예를 들어, ljes=njak은 크로아티아 알파벳 6개(lj, e, š, nj, a, k)로 이루어져 있다. 단어가 주어졌을 때, 몇 개의 크로아티아 알파벳으로 이루어져 있는지 출력한다. dž는 무조건 하나의 알파벳으로 쓰이고, d와 ž가 분리된 것으로 보지 않는다. lj와 nj도 마찬가지이다. 위 목록에 없는 알파벳은 한 글자씩 센다.
- Hint
문제의 조건을 잘 읽고 replace() 함수를 사용해보자
- Solution
c=['c=','c-','dz=','d-','lj','nj','s=','z=']
a=input()
l=len(a)
for i in c:
t= a.count(i)
l-=len(i)*t
l+=t
a=a.replace(i,' ')
print(a)
print(l)
일단 크로아티아 알파벳을 리스트 내에 저장하는 것은 불가피 하다고 생각하였고 세운 전략은 처음 글자수에서 크로아티아 알파벳의 개수*크로알파벳의 길이를 빼고 크로알파벳의 개수를 더해주면 될것이라 생각하고 제출을 하였지만 처음에는 a=a.replace(i,'') 하는 바람에 오류가 났었다.빈칸을 이용하여 자리수를 띄어놓지 않으면 nljj의 경우에는 순서대로 소거가 되다가 남은 2개의 알파벳의 합이 또 다른 크로알파벳이 되기 때문에 오류가 날 수 있었다. 좀 더 꼼꼼하게 문제를 살펴봐야겠다고 생각이 들었다.
그룹 단어 체커(#1316)
- Problem
그룹 단어란 단어에 존재하는 모든 문자에 대해서, 각 문자가 연속해서 나타나는 경우만을 말한다. 예를 들면, ccazzzzbb는 c, a, z, b가 모두 연속해서 나타나고, kin도 k, i, n이 연속해서 나타나기 때문에 그룹 단어이지만, aabbbccb는 b가 떨어져서 나타나기 때문에 그룹 단어가 아니다. 단어 N개를 입력으로 받아 그룹 단어의 개수를 출력하는 프로그램을 작성하시오.
- Hint
쉽지 않을 수 있다. 차근차근 반복문과 조건문의 서순에 대해 생각해보자
- Solution
count=0
for i in [*open(0)][1:]:
out=0
td=i[0]
a=[]
for n in i:
if n!=td:
if n in a:
out=1
a.append(n)
td = n
if out!=1:
count += 1
print(count)
sorted() 함수와 key 를 이용한 풀이
b=0
for _ in range(int(input())):
a=input()
b+=[*a]==sorted(a,key=a.find)
print(b)
sorted() 포스팅예정
'Baekjoon > Stepbystep' 카테고리의 다른 글
[백준/python] 기본 수학 2 전체 풀이(8단계) (0) | 2022.08.02 |
---|---|
[백준/python] 기본 수학 1 전체 풀이(7단계) (0) | 2022.08.01 |
[백준/python] 함수 전체 풀이(5단계) (0) | 2022.07.29 |
[백준/python] 1차원 배열 전체 풀이(4단계) (0) | 2022.07.29 |
[백준/python] 반복문 전체 풀이(3단계) (0) | 2022.07.29 |