www.acmicpc.net/group/practice/9883/13
5번은 자료구조 내용이라 좀 생소하실 수 있을텐데, 스택을 배우지 않았어도 리스트와 if문으로 충분히 풀 수 있는 문제라서 넣어보았습니다. 참고로 5번 문제는 여기에서 설명하지 않고, 깃북 5주차 스택 파트에 나와있습니다.
1. BOJ 2966 찍기
상근이는 A, B, C, ....
창영이는 B, A, B, C, ....
현진이는 C, C, A, A, B, B, ...
위 순서대로 반복하여 문제를 찍고 가장 많이 맞힌 사람을 구하라고 합니다.
일단 입력 값을 받아봅시다. 상근, 창영, 현진이의 답안을 각각 X, Y, Z로 설정하고, 점수를 저장하는 변수를 각각 x, y, z라고 정하여 만들어보겠습니다.
n = int(input())
s = input()
x, y ,z = 0, 0, 0
X = ['A', 'B', 'C']
Y = ['B', 'A', 'B', 'C']
Z = ['C', 'C', 'A', 'A', 'B', 'B']
이제 for문으로 답안지 s를 훑어보면서 학생들의 점수를 채점해야 하는데요.
위에서 살펴봤듯이 상근이는 3개씩 반복, 창영이는 4개씩 반복, 현진이는 6개씩 반복하여서 for i in range(len(s))로 for문이 돌아갈 때 X[i % 3], Y[i % 4], Z[i % 6]로 답을 비교해볼 수 있습니다.
왜냐하면 창영이(Y)로 비교해볼경우 Y[i%4]는 0 -> 1 -> 2 -> 3 -> 0 -> 1 -> 2 -> 3 -> 0 -> .... 으로 계속 4개씩 반복하여 확인할 수 있기 때문입니다.
그래서 위 내용으로 점수를 획득하는 코드를 짜보면 아래와 같습니다.
n = int(input())
s = input()
x, y ,z = 0, 0, 0
X = ['A', 'B', 'C']
Y = ['B', 'A', 'B', 'C']
Z = ['C', 'C', 'A', 'A', 'B', 'B']
for i in range(len(s)):
if X[i%3] == s[i]: x += 1
if Y[i%4] == s[i]: y += 1
if Z[i%6] == s[i]: z += 1
이제 점수를 다 구했으면 출력을 해주면 됩니다. 이 부분은 max()함수를 이용하여 최고 점수와 최고 점수를 받은 사람을 출력할 수 있습니다.
n = int(input())
s = input()
x, y ,z = 0, 0, 0
X = ['A', 'B', 'C']
Y = ['B', 'A', 'B', 'C']
Z = ['C', 'C', 'A', 'A', 'B', 'B']
for i in range(len(s)):
if X[i%3] == s[i]: x += 1
if Y[i%4] == s[i]: y += 1
if Z[i%6] == s[i]: z += 1
print(max(x,y,z))
if x == max(x,y,z): print('Adrian')
if y == max(x,y,z): print('Bruno')
if z == max(x,y,z): print('Goran')
2. BOJ 5656 비교 연산자
이 문제는 다들 쉽게 풀었을거라고 생각합니다.
입력값 3개를 입력 받아서 if문과 format을 사용하면 출력을 하면 되는 문제입니다.
먼저 입력값을 받아봅시다. 첫번째 값과 세번째 값은 int형으로 바꾸어주면 됩니다.
i = 1 # 출력할 때 필요한 변수
while True:
a, b, c = input().split()
if b == 'E': break
a, c = int(a), int(c)
이제 if문 6개를 이용하여 True, False를 구해주고 출력을 해주시면 됩니다.
주의할 점은 출력할 때 True, False가 아닌 true, false임을 주의해주세요
i = 1
while True:
a, b, c = input().split()
if b == 'E': break
a, c = int(a), int(c)
if b == '>': x = a > c
elif b == '>=': x = a >= c
elif b == '<': x = a < c
elif b == '<=': x = a <= c
elif b == '==': x = a == c
else: x = a != c
print('Case {}:'.format(i), end = ' ')
if x: print('true')
else: print('false')
i += 1
3. BOJ 11945 뜨거운 붕어빵
문자열을 반대로 뒤집는 문제입니다.
이것은 [::-1]을 사용하여 문제를 풀 수 있습니다. 혹은 for문과 print(@@, end = '')를 이용해서 출력할 수도 있겠네요.
n, m = map(int,input().split())
for i in range(n):
s = input()
print(s[::-1])
4. BOJ 5789 한다 안한다
for문을 이용하여 문자열을 양 끝에서 중앙까지 가는 방법도 있겠지만, 문제를 잘 읽어보시면 마지막에 고르는 두 숫자로 결정이 된다는 것을 확인할 수 있습니다.
그래서 이 문제는 문자열의 개수가 짝수일 때와 홀수일 때를 나눠서 확인해봐야 하는데, 문제에서 입력값은 짝수 길이만 주어진다고 나와있네요.
문자열의 길이가 4일 때를 확인해봅시다.
index번호가 1 ~ 4이면 1, 2, 3, 4이므로 2와 3을 비교해주면 끝납니다.
길이가 10일 때를 확인해봅시다.
index번호가 1 ~ 10이면 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이므로 5와 6을 비교해주면 끝납니다.
그러면 길이가 2n이면 어떻게 될까요?
index 번호가 1 ~ 2n이므로 n과 n+1을 비교해주면 끝납니다.
따라서 이것을 코딩으로 짜본다면 코딩은 index가 0부터 시작하므로 s[len(s)//2 - 1] 과 s[len(s)//2]를 해주면 된다는 것이죠.
코드 이해가 좀 어렵다면 t = len(s)//2로 설정하여 s[t-1]과 s[t]를 비교해주시면 됩니다.
그래서 아래와 같은 코드로 간단하게 비교하여 출력할 수 있습니다.
n = int(input())
for i in range(n):
s = input()
if s[len(s)//2 - 1] == s[len(s)//2]:
print('Do-it')
else:
print('Do-it-Not')
n = int(input())
for i in range(n):
s = input()
t = len(s)//2
if s[t - 1] == s[t]:
print('Do-it')
else:
print('Do-it-Not')
'Koala - 3기 > 기초 스터디' 카테고리의 다른 글
7주차 복습 문제 해설 (1) | 2021.04.27 |
---|---|
6주차 복습 문제 해설 (0) | 2021.04.20 |
5주차 복습 문제 해설 (1) | 2021.04.13 |
3주차 복습 문제 해설 (0) | 2021.03.30 |
기초 스터디 출석부 (0) | 2021.03.23 |