[algorithm] 백준 단계별 문제 풀이 (심화 1탄)
안녕하세요. 심심한 코딩쟁이입니다.
오늘은 여태까지 풀어오면서 익힌 스킬들을 동원해야 하는 심화 문제들을 살펴보려 합니다.
파이썬3 를 사용해 문제 풀이를 진행하겠습니다.
문제마다 링크를 걸어두었으니 문제를 살펴보시고 문제를 푼 다음에 저와
풀이를 비교해 보시는 걸 추천드립니다.
차근차근 풀어봅시다.
백준 BAEKJOON 25083
https://www.acmicpc.net/problem/25083
25083번: 새싹
아래 예제와 같이 새싹을 출력하시오.
www.acmicpc.net
문제 해석
문제에서 주어진 새싹 모양을 출력하는 문제
풀이
print(" ,r\'\"7")
print("r`-_ ,\' ,/")
print(" \\. \". L_r\'")
print(" `~\\/")
print(" |")
print(" |")
풀이 해석 및 팁
이스케이프 문자(/)를 잘 활용해야 제대로 된 출력 결과를 얻을 수 있습니다.
백준 BAEKJOON 3003
https://www.acmicpc.net/problem/3003
3003번: 킹, 퀸, 룩, 비숍, 나이트, 폰
첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.
www.acmicpc.net
문제 해석
킹 퀸 룩 비숍 나이트 폰의 순서로 1 1 2 2 2 8 개의 말이 있어야 할 때 주어진 말의 개수와 비교하는 문제
풀이
a = [1, 1, 2, 2, 2, 8]
b = list(map(int,input().split()))
for i in range(len(a)):
print(a[i]-b[i], end=" ")
풀이 해석 및 팁
map() 함수를 사용해 주어진 말의 개수 문자열을 공백을 기준으로 각각 인트형으로 받아오며
list로 변환해 변수 b에 대입합니다.
for 반복문으로 a와 b에 차례대로 접근해 각 자리에 존재하는 말의 개수의 차를 출력하면 해결
print 문에서 end=' '를 추가적으로 넣어주면 개행 문자 대신에 공백이 뒤에 붙습니다.
백준 BAEKJOON 2444
https://www.acmicpc.net/problem/2444
2444번: 별 찍기 - 7
첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.
www.acmicpc.net
문제 해석
*를 마름모 모양으로 출력하는 문제
풀이
n = int(input())
for i in range(1, n + 1):
print(' ' * (n - i), end = '')
print('*' * (2 * i - 1))
for i in range(1, n):
print(' ' * i, end='')
print('*' * ((2 * (n - i))-1))
풀이 해석 및 팁
특별한 규칙은 없고 가운데 줄을 기준으로 구간을 둘로 나누어서 출력하면 쉽게 출력할 수 있습니다.
백준 BAEKJOON 10812
https://www.acmicpc.net/problem/10812
10812번: 바구니 순서 바꾸기
도현이는 바구니를 총 N개 가지고 있고, 각각의 바구니에는 1번부터 N번까지 번호가 순서대로 적혀져 있다. 바구니는 일렬로 놓여져 있고, 가장 왼쪽 바구니를 1번째 바구니, 그 다음 바구니를 2
www.acmicpc.net
문제 해석
바구니가 N개 주어지고 일렬로 나열시켰을 때 앞에서부터 1~N의 번호를 가집니다.
문제에서 주어진 3개의 숫자를 통해 i번 바구니에서 j번 바구니를 회전구간으로 잡고 k번 바구니를 구간 내에서
제일 처음으로 오도록 로테이션시키는 문제입니다.
구간이 정해지면 k번째 바구니가 제일 앞으로 오도록 구간 내에서 회전시킨다고 생각하시면 쉽습니다.
풀이
n, rotation = map(int, input().split())
basket = [i for i in range(1, n+1)]
for _ in range(rotation):
i, j, k = map(int, input().split())
basket[i-1:j]= basket[k-1:j]+basket[i-1:k-1]
print(*basket)
풀이 해석 및 팁
basket 리스트를 만들 때 for 문을 활용해 차례대로 값을 주었습니다.
회전에 대한 정보를 읽어 들이면 그에 맞게 리스트에 슬라이싱을 활용해 순서를 바꿔줍니다.
모든 회전 작업이 종료된 후 print문을 보시면 리스트 basket 앞에 * (Asterisk)를 붙이면 Unpacking 역할을 하면서
요소들을 공백으로 구분해서 반환해 줍니다.
백준 BAEKJOON 10988
https://www.acmicpc.net/problem/10988
10988번: 팰린드롬인지 확인하기
첫째 줄에 단어가 주어진다. 단어의 길이는 1보다 크거나 같고, 100보다 작거나 같으며, 알파벳 소문자로만 이루어져 있다.
www.acmicpc.net
문제 해석
팬린드롬이란 거꾸로 읽어도 똑같은 문자배열을 가진 단어를 의미합니다.
주어진 문자열이 거꾸로 뒤집혀도 처음과 같은지를 검사하는 문제입니다.
풀이
def palindrome(str):
if len(str) % 2 == 1:
index = len(str) // 2
for i in range(index):
if str[i] != str[len(str) - 1 - i]:
return '0'
return '1'
else:
index = len(str) // 2
for i in range(index + 1):
if str[i] != str[len(str) - 1 - i]:
return '0'
return '1'
str = input()
print(palindrome(str))
풀이 해석 및 팁
문자열의 가운데 지점부터 좌우로 나아가면서 같은 문자로 구성되어 있는지 검사합니다.
문자열의 길이가 짝수일 때와 홀수 일 때 검사 방법을 다르게 합니다.
여기까지 백준 단계별 문제 심화 1탄의 풀이였습니다.
문제를 풀어오면서 익힌 스킬들을 이용해 비교적 쉽게 풀이가 가능했습니다.
다른 누군가의 풀이를 보고 이해하고 배워가는 방법도 중요하지만 최초의 풀이 시간에
어떻게 풀어야 하는가 골똘히 고민해 보는 시간이 가장 중요한 것 같습니다.
궁금하신 점이나 도움이 필요한 부분이 있다면 댓글로 남겨주시기 바랍니다.
감사합니다.
'programming > algorithm' 카테고리의 다른 글
[algorithm] 백준 단계별 문제 풀이 (2차원 배열) (0) | 2023.03.06 |
---|---|
[algorithm] 백준 단계별 문제 풀이 (심화 2탄) (0) | 2023.03.02 |
[algorithm] 백준 단계별 문제 풀이 (문자열 2탄) (0) | 2023.02.24 |
[algorithm] 백준 단계별 문제 풀이 (문자열 1탄) (0) | 2023.02.23 |
[algorithm] 백준 단계별 문제 풀이 (함수) (0) | 2023.02.18 |