사이트
solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac
이번 주 문제 풀이
사용 언어 : python
10797번 10부제
문제 출처
https://www.acmicpc.net/problem/10797
문제
서울시는 6월 1일부터 교통 혼잡을 막기 위해서 자동차 10부제를 시행한다. 자동차 10부제는 자동차 번호의 일의 자리 숫자와 날짜의 일의 자리 숫자가 일치하면 해당 자동차의 운행을 금지하는 것이다. 예를 들어, 자동차 번호의 일의 자리 숫자가 7이면 7일, 17일, 27일에 운행하지 못한다. 또한, 자동차 번호의 일의 자리 숫자가 0이면 10일, 20일, 30일에 운행하지 못한다.
여러분들은 일일 경찰관이 되어 10부제를 위반하는 자동차의 대수를 세는 봉사활동을 하려고 한다. 날짜의 일의 자리 숫자가 주어지고 5대의 자동차 번호의 일의 자리 숫자가 주어졌을 때 위반하는 자동차의 대수를 출력하면 된다.
코드
num = int(input())
L = list(map(int, input().split()))
violate = L.count(num)
print(violate)
입력값 (날짜의 일의 자리 숫자)을 받습니다.
5대의 자동차 번호의 일의 자리 숫자를 리스트로 저장합니다.
입력값과 같은 수가 리스트 안에 총 몇개가 존재하는지 구하기 위해 count 메소드를 사용합니다.
10부제를 위반한 차량 수를 violate 변수에 저장하고, 출력합니다.
10156번 과자
문제 출처
https://www.acmicpc.net/problem/10156
문제
동수는 제과점에 과자를 사러 가는데 현재 가진 돈이 모자랄 경우 부모님께 모자란 돈을 받으려고 한다. 과자 한 개의 가격이 K, 사려고 하는 과자의 개수가 N이고, 현재 가진 돈의 액수를 M이라 할 때 여러분은 동수가 부모님께 받아야 하는 모자란 돈을 계산하려고 한다.
예를 들어, 과자 한 개의 가격이 30원, 사려고 하는 과자의 개수가 4개, 현재 동수가 가진 돈이 100원이라 할 때, 동수가 부모님께 받아야 하는 돈은 20원이다. 과자 한 개의 가격이 250원, 사려고 하는 과자의 개수가 2개, 현재 동수가 가진 돈이 140원이라 할 때, 동수가 부모님께 받아야 하는 돈은 360원이다. 과자 한 개의 가격이 20원, 사려고 하는 과자의 개수가 6개, 현재 동수가 가진 돈이 120원이라 할 때 동수가 부모님께 받아야 하는 돈은 0원이다. 과자 한 개의 가격이 20원, 사려고 하는 과자의 개수가 10개, 현재 동수가 가진 돈이 320원이라 할 때 동수가 부모님께 받아야 하는 돈은 역시 0원이다.
과자 한 개의 가격, 사려고 하는 과자의 개수와 동수가 현재 가진 돈의 액수가 주어질 때 동수가 부모님께 받아야 하는 돈의 액수를 출력하는 프로그램을 작성하시오.
코드
price, num, money = map(int, input().split())
expense = price * num
if expense > money:
need_money = expense - money
else:
need_money = 0
print(need_money)
과자 가격(price), 사려고 하는 과자의 개수(num), 현재 가진 돈의 액수(money)를 map함수를 통해 입력 받아 저장합니다.
과자를 구매함으로써 지출하는 비용(expense)을 구합니다.
지출 비용이 현재 가진 돈의 액수보다 많다면, 필요한 돈은 지출에서 현재 가진 돈만큼 차감하여 구할 수 있습니다.
지출 비용이 현재 가진 돈의 액수보다 적다면, 현재 가진 돈으로 구매할 수 있으므로 필요한 돈은 0원으로 결과를 출력하면 됩니다.
15917번 노솔브 방지문제야!!
문제 출처
https://www.acmicpc.net/problem/15917
문제
여러분은 Q개의 쿼리를 수행해야 합니다. 수행해야 하는 쿼리는 다음과 같습니다.
어떤 수 a를 2의 거듭제곱 꼴로 나타낼 수 있는가?
출력
각 쿼리마다, 답이 Yes이면 1을, 그렇지 않으면 0을 출력합니다.
코드
import sys
input = sys.stdin.readline
a = [2**i for i in range(32)]
for i in range(int(input())):
print(1 if int(input()) in a else 0)
실행 속도를 높이기 위해 sys 모듈을 불러옵니다.
*참고
sys.stdin.readline()은 사용자가 Enter 키를 누를 때까지의 모든 입력을 한 줄로 받아옵니다. 이 줄의 끝에는 보통 줄바꿈 문자(\\n)가 포함됩니다.
2의 0부터 32제곱 까지의 값을 리스트의 형태로 a에 저장합니다.
입력 받은 수가 a 리스트에 있다면 1을 없다면 0을 출력하는 것을 한 줄에 작성할 수 있습니다.
26645번 성장의 비약 선택권
문제 출처
https://www.acmicpc.net/problem/26645
문제
지훈이가 즐겨 하는 게임인 ‘메이플스토리’에는 레벨과 경험치가 존재한다. 메이플스토리에서 캐릭터의 레벨을 올리기 위해서는 많은 몬스터를 사냥하여 경험치를 얻어야 하지만, 다행히도 레벨업의 난이도를 낮추기 위해 다량의 경험치를 얻을 수 있는 아이템 ‘성장의 비약’이 존재한다.
이벤트로 가끔 얻을 수 있는 ‘성장의 비약 선택권’을 사용하면 위 사진처럼 네 가지의 성장의 비약 중 한 가지를 선택하여 적힌 개수만큼 얻을 수 있다. 캐릭터의 현재 레벨을 포함하는 구간의 성장의 비약을 사용하면 캐릭터의 레벨이 정확히 1만큼 오른다. 태풍 성장의 비약은 200∼239레벨의 캐릭터를 정확히 1레벨 올려준다. 모든 성장의 비약은 한번에 한 개씩 사용할 수 있고, 캐릭터의 현재 레벨을 포함하지 않는 구간의 성장의 비약은 사용하지 못한다.
지훈이가 성장의 비약을 사용할 캐릭터의 현재 레벨이 주어졌을 때, 어떤 성장의 비약을 선택해야 가장 높은 레벨에 도달할 수 있는지 알려주자!
만약 가장 높은 레벨에 도달할 수 있는 성장의 비약의 종류가 둘 이상이라면, 사진상 더 아래에 있는 성장의 비약을 선택한다.
입력
첫 번째 줄에 지훈이가 성장의 비약을 사용할 캐릭터의 현재 레벨을 나타내는 정수 N이 주어진다. (200≤N≤239)
출력
지훈이가 선택해야 할 성장의 비약이 성장의 비약 (200∼209)이라면 1, 성장의 비약 (200∼219)이라면 2,성장의 비약 (200∼229)이라면 3, 태풍 성장의 비약이라면 4를 출력한다.
코드
Level = int(input())
if Level < 206:
option = 1
elif Level < 218:
option = 2
elif Level < 229:
option = 3
else:
option = 4
print(option)
먼저 캐릭터의 현재 레벨(Level)을 입력 받습니다.
현재 레벨에 따라 레벨을 최대로 올릴 수 있는 옵션을 if문을 통해 구합니다.
성장의 비약 (200∼209)은 8개 사용 가능하지만 209초과부터는 사용이 불가 하므로, 성장의 비약 (200∼219) 4개로 레벨을 올리는 것 보다 효율이 좋아야 한다. 210 - 4 = 206으로 206미만이라면, 1번 옵션이 1레벨을 더 올릴 수 있다.
다음 급간인 220을 기준으로 성장의 비약 (200∼229)은 2개 사용 가능하므로 220 - 2 = 218, 218 미만으로는 2번 옵션이 1레벨을 더 올릴 수 있다.
다음 급간인 230을 기준으로 태풍 성장의 비약은 1개 사용 가능하므로 230 - 1 = 229, 229미만으로는 3번 옵션이 1레벨을 더 올릴 수 있으며, 이외의 상황에서는 4번 옵션을 선택하는 것이 좋다.
조건을 충족한 옵션을 출력합니다.
모든 경우의 수를 고려하여 최적의 선택을 하는 것이 이 문제의 핵심이라고 생각했습니다.
5598번 카이사르 암호
문제 출처
https://www.acmicpc.net/problem/5598
문제
가이우스 율리우스 카이사르(Gaius Julius Caesar)는 고대 로마 군인이자 정치가였다. 카이사르는 비밀스럽게 편지를 쓸 때, 'A'를 'D로', 'B'를 'E'로, 'C'를 'F'로... 이런 식으로 알파벳 문자를 3개씩 건너뛰어 적었다고 한다.
26개의 대문자 알파벳으로 이루어진 단어를 카이사르 암호 형식으로 3문자를 옮겨 겹치지 않게 나열하여 얻은 카이사르 단어가 있다. 이 카이사르 단어를 원래 단어로 돌려놓는 프로그램을 작성하시오.
각 문자별로 변환 전과 변환 후를 나타낸 건 아래와 같다.
변환전 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
변환후 D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
예를 들어서, 이 방법대로 단어 'JOI'를 카이사르 단어 형식으로 변환한다면 'MRL'을 얻을 수 있고, 앞의 예와 같은 방법으로 얻은 카이사르 단어 'FURDWLD'를 원래 단어로 고치면 'CROATIA'가 된다.
출력
입력받은 카이사르 단어를 원래 단어로 고친 걸 출력하시면 된다.
코드
cipher_list = 'D E F G H I J K L M N O P Q R S T U V W X Y Z A B C'
original_list = 'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z'
result = ""
cipher_list = cipher_list.split(' ')
original_list = original_list.split(' ')
quiz = input()
for alpha in quiz:
result += original_list[cipher_list.index(alpha)]
print(result)
먼저 문제의 목표는 카이사르 단어(시저 암호화된 단어)를 원래 단어로 바꾸는 것입니다. 시저 암호는 원래 단어의 알파벳 순서에서 3개를 건너뛴 것이므로 카이사르 단어의 알파벳에서 3번째 전 알파벳으로 바꿔서 해석하면 됩니다.
카이사르 단어에서의 알파벳 순서와 원래 단어 알파벳 순서를 가져옵니다.
결과 출력을 위한 result 변수를 빈 문자열로 정의합니다.
split 메소드를 통해 공백을 기준으로 문자열을 리스트로 변환합니다.
해독하고자 하는 카이사르 단어(quiz)를 입력받습니다.
for i in 리스트: 구조를 통해 리스트의 요소에 바로 접근합니다. 같은 인덱스에 위치한 단어로 바꾸어야 하기에 먼저 카이사르 단어 리스트에 위치한 요소로 인덱스를 구하고 해당 인덱스를 원래 단어 리스트에서 인덱싱하여 result에 추가합니다.
위 과정을 반복하면 카이사르 단어를 원래 단어로 바꿀 수 있습니다.
14624번 전북대학교
문제 출처
https://www.acmicpc.net/problem/14624
문제
전북대학교의 심볼은 균형과 조화, 지성과 이상을 향한 방향성과 목표를 나타낸다. 절제된 한국적 아름다움을 꾸밈없는 소박함과 여백을 통해 시각화하였으며, 심볼의 방향에 따라 한국적인 대학, 학문에 정진하는 대학, 미래로 나아가는 대학의 의미를 포함하여 ‘성장을 넘어 성숙의 대학으로 나아가는 전북대학교’의 철학과 비전을 상징한다.
입력
정수 N (3 ≤ N ≤ 50)을 입력받는다.
출력
입력 N이 홀수인 경우 '*'을 이용해 가로의 길이가 N인 전북대학교 심볼을 출력한다. (예제 참고)
짝수인 경우, 'I LOVE CBNU'를 출력한다.
코드
num = int(input())
if num % 2 == 0:
print("I LOVE CBNU")
else:
repeat = num // 2
print("*"*num)
print(" "*repeat+"*")
for i in range(1, repeat+1, 1):
print(" "*(repeat-i)+"*"+" "*(2*i-1)+"*")
사용자로부터 정수를 입력받아 num 변수에 저장합니다.
짝수일 경우 : 입력된 숫자 num이 짝수(num % 2 == 0)인 경우, "I LOVE CBNU"라는 문자열을 출력합니다.
홀수일 경우 : 입력된 숫자 num이 홀수인 경우, 별(*)로 특정 패턴을 출력합니다. 이 부분을 자세히 설명하면 다음과 같습니다.
반복 횟수 설정 ****: repeat는 num을 2로 나눈 몫으로 설정됩니다. 이는 별 패턴을 출력할 때 사용됩니다.
공통된 부분 출력
첫 번째 줄
첫 번째 줄에는 num개의 별(*)이 일렬로 출력됩니다. 예를 들어, num이 7이면 *******가 출력됩니다.
두 번째 줄
두 번째 줄에는 중앙에 하나의 별(*)만 출력됩니다. 별 앞에는 공백(repeat 수만큼)이 포함됩니다. 예를 들어, num이 7이면 " *"가 출력됩니다.
나머지 줄
대칭을 이용하여 repeat만큼 공백을 채웁니다.
반복문은 1부터 repeat까지 실행됩니다.
각 줄에서는 공백, 별, 공백, 별 순으로 출력됩니다.
별 바깥의 공백의 수는 줄마다 감소하며, 별 사이의 공백은 줄마다 증가합니다.
요약
입력된 숫자가 홀수일 때,
- 첫 번째 줄에 num개의 별 출력
- 두 번째 줄에 중앙에 위치한 하나의 별 출력
- 나머지 줄에 점점 벌어지는 패턴의 별들을 출력
입력된 숫자가 짝수일 때,
I LOVE CBNU 를 출력