www.acmicpc.net/group/practice/9883/17
이번 문제는 3번 문제가 문제 해석이 좀 힘들었겠고, 난이도는 5번이 제일 어려웠을 것으로 생각합니다.
1. BOJ 10769 행복한지 슬픈지
:-), :-( 이모티콘 개수에 따라 출력 내용이 달라지는 문제입니다.
이모티콘의 길이가 둘 다 3이므로 for문을 (문장의 길이)-2번만 확인하면 되는 간단한 문제입니다.
x는 :-)의 개수, y는 :-(의 개수입니다.
s = input()
x, y = 0,0
for i in range(len(s)-2):
if s[i:i+3] == ':-)': x += 1
elif s[i:i+3] == ':-(': y += 1
if x == y== 0: print('none')
elif x == y: print('unsure')
elif x > y: print('happy')
else: print('sad')
2. BOJ 2386 도비의 영어 공부
문제에서 첫 입력 알파벳은 소문자이지만, 문장에서 대문자가 나와도 같은 알파벳이면 개수를 세라고 나와 있습니다.
일단 #을 입력 받으면 종료해야하므로 입력값을 받아주는 코드를 짜봅시다.
while 1:
s = input()
if s == '#': break
정상적인 입력값은 (소문자)(공백)(문장)으로 되어 있으므로 소문자의 값을 x라고 두면 x = s[0], s = s[2:]로 첫 공백을 기준으로 값을 나눌 수 있습니다.
while 1:
s = input()
if s == '#': break
x, s = s[0], s[2:]
여기서 우리는 대문자든 소문자든 상관없으므로 s를 전부 소문자로 바꾸어줍시다.
while 1:
s = input()
if s == '#': break
x, s = s[0], s[2:].lower()
이제 for문을 이용하여 개수를 세어주고 출력하면 됩니다.
while 1:
s = input()
if s == '#': break
x, s = s[0], s[2:].lower()
ans = 0
for i in range(len(s)):
if x == s[i]: ans += 1
print(x, ans)
3. BOJ 4592 중복을 없애자
문제를 주의깊게 읽어야했던 문제입니다. 만약 10 3 3 3 4 4 4 3 3 3 4라는 입력값이 나오면 출력값은 3 4 3 4 $ 이여야 합니다.
일단 입력값은 list(map(input().split()))으로 받고, 처음값이 0이면 break로 루프문을 빠져나올 수 있게하는 while문을 사용하면 됩니다.
while 1:
arr = list(map(int,input().split()))
if arr[0] == 0: break
그다음 처음값과 나중값들을 분리시켜야하니 n = arr[0], arr = arr[1:]로 변경해주시면 됩니다.
while 1:
arr = list(map(int,input().split()))
if arr[0] == 0: break
n, arr = arr[0], arr[1:]
처음값을 제외하고는 입력값 범위가 1부터 99까지이므로 처음엔 이전값(prev)을 0으로 설정해주고, 그 이후엔 prev = 이전값을 저장하여 prev == arr[i]인지 확인 후에 ans 리스트에 넣어주면 되겠습니다. 그리고 마지막으로 join을 이용하여 출력을 하면 됩니다.
while 1:
arr = list(map(int,input().split()))
if arr[0] == 0: break
n, arr = arr[0], arr[1:]
ans = []
prev = 0
for i in range(n):
if arr[i] != prev:
ans.append(arr[i])
prev = arr[i]
print(' '.join(map(str,ans)),'$')
4. BOJ 8611 팰린드롬 숫자
진법 변환과 팰린드롬이 섞인 문제입니다.
일단 2진법에서 10진법까지 변환을 해야하므로 for문을 2부터 10까지 돌아가게 해줍시다.
그리고 진법 변환하는 방법은 깃북에 있는 예시를 들고 왔는데 아래처럼 나머지를 다 저장해주고 거꾸로 출력해주면 됩니다.
n = int(input())
for k in range(2,11):
x = n
ans = []
이제 이렇게 세팅을 해주고 while문을 이용하여 x가 0이 될 때까지 k로 나눠서 나머지를 ans에 저장해주면 됩니다.
n = int(input())
for k in range(2,11):
x = n
ans = []
while x != 0:
ans.append(x % k)
x //= k
그러면 이제 ans에 숫자가 저장되어 있으니 바로 팰린드롬을 확인한 후에 거꾸로 출력하면 되겠습니다. 아니면 먼저 ans를 거꾸로 뒤집고 팰린드롬인지 확인한 후에 출력을 해도 상관없습니다. 저는 전자로 하겠습니다.
n = int(input())
for k in range(2,11):
x = n
ans = []
while x != 0:
ans.append(x % k)
x //= k
flag = True
for i in range(len(ans)//2):
if ans[i] != ans[-1-i]: flag = False
if flag:print(k, ''.join(map(str,ans[::-1])))
5. BOJ 1935 후위 표기식2
자료구조 시간에 후위 표기식을 배워서 추가한 문제입니다 ㅋㅋ..
후위 표기식은 +, -, *, / 를 만나면 스택에 있는 값 2개를 빼와서 계산을 한 후, 다시 스택에 넣어주면 됩니다.
먼저 입력값을 받는 코드를 짜봅시다.
알파벳 각각의 값을 입력 받는 것은 딕셔너리를 이용해도 상관 없습니다.
n = int(input())
s = input()
arr = [0]*n
for i in range(n):
arr[i] = int(input())
이제 스택에 값을 추가해야 하는데, if / else문을 이용하여 스택에 값을 추가할지, 연산을 할지 조건을 붙여야 합니다. 조건은 알파벳 아스키 코드 범위로 하거나 멤버 연산자를 이용하거나 편한 것을 사용하면 되겠습니다.
n = int(input())
s = input()
arr = [0]*n
for i in range(n):
arr[i] = int(input())
stack = []
for i in range(len(s)):
if ord('A') <= ord(s[i]) <= ord('Z'):
else:
이렇게 만들거나
n = int(input())
s = input()
arr = [0]*n
for i in range(n):
arr[i] = int(input())
stack = []
for i in range(len(s)):
if s[i] in '+-*/':
else:
이렇게 아무거나 편하게 만들어주면 됩니다.
대문자 알파벳이면 arr[ord(s[i])-65] 를 이용하여 스택에 값을 추가하고, 사칙연산 기호면 값을 2개 빼서 계산을 해준 후에 스택에 넣어주면 됩니다. 여기서 주의할 점은 사칙연산이 나올 때, 나중에 빼온 값이 식에서 먼저 나온다는 점입니다.
저는 바로 위에 있는 코드를 사용하겠습니다.
n = int(input())
s = input()
arr = [0]*n
for i in range(n):
arr[i] = int(input())
stack = []
for i in range(len(s)):
if s[i] in '+-*/':
y, x = stack.pop(), stack.pop()
if s[i] == '+': stack.append(x+y)
elif s[i] == '-': stack.append(x-y)
elif s[i] == '*': stack.append(x*y)
else: stack.append(x/y)
else:
stack.append(arr[ord(s[i]) - 65])
그리고 이제 출력을 해야하는데 format을 이용하여 소숫점 둘째자리까지 출력하면 됩니다.
n = int(input())
s = input()
arr = [0]*n
for i in range(n):
arr[i] = int(input())
stack = []
for i in range(len(s)):
if s[i] in '+-*/':
y, x = stack.pop(), stack.pop()
if s[i] == '+': stack.append(x+y)
elif s[i] == '-': stack.append(x-y)
elif s[i] == '*': stack.append(x*y)
else: stack.append(x/y)
else:
stack.append(arr[ord(s[i]) - 65])
print('{:.2f}'.format(stack[0]))
'Koala - 3기 > 기초 스터디' 카테고리의 다른 글
8주차 복습 문제 해설 (0) | 2021.05.05 |
---|---|
7주차 복습 문제 해설 (1) | 2021.04.27 |
5주차 복습 문제 해설 (1) | 2021.04.13 |
4주차 복습 문제 해설 (0) | 2021.04.06 |
3주차 복습 문제 해설 (0) | 2021.03.30 |