solved.ac
알고리즘 문제해결 학습의 이정표 🚩 Baekjoon Online Judge 문제들의 난이도 및 티어 정보를 제공하는 사이트입니다.
solved.ac
- Class 1에 해당하는 마지막 포스팅입니다.
- 이전 문제들(단순 출력, 연산)과는 다르게 이번 포스팅에서는 꽤나(?) 구현할 게 있지만, 별다른 알고리즘이 필요하지 않기에 쉽게 접근하실 수 있으실 것입니다. 👍🏻
- 이 글에서의 대부분 문제들은 python의 자료형들을 활용할 줄 알거나 문자열 관련 내장 함수를 사용할 수 있으면 더욱 간단히 풀이가 가능합니다.
10818번 : 최소, 최대
10818번: 최소, 최대
첫째 줄에 정수의 개수 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에는 N개의 정수를 공백으로 구분해서 주어진다. 모든 정수는 -1,000,000보다 크거나 같고, 1,000,000보다 작거나 같은 정수이다.
www.acmicpc.net
- 여러 정수를 입력받아 최솟값, 최댓값을 구하는 문제들은 보통 python의 내장 함수 중 min(list: iterable), max(list: iterable)를 사용하곤 합니다. 저도 이 방법을 이용하여 해당 문제를 해결하였습니다.
def find_min_max(numbers):
return min(numbers), max(numbers)
if __name__ == '__main__':
N = int(input())
num_list = list(map(int, input().split()))
minimum, maximum = find_min_max(num_list)
print(minimum, maximum)
1152번 : 단어의 개수
1152번: 단어의 개수
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 이 문자열의 길이는 1,000,000을 넘지 않는다. 단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 또한 문자열
www.acmicpc.net
- 문자열이 주어지면 이 문자열에 쓰여진 단어의 개수를 찾는 문제입니다.
- python에는 split(str) 함수 덕분에 이러한 문제들을 쉽게 풀어낼 수 있습니다.
- split(str) 함수는 문자열이 입력으로 들어오면 공백을 기준으로 문자열을 나눈 뒤, 각 요소들을 하나의 문자열 list 형태로 반환해줍니다.
def count_words(string):
return len(string.split())
if __name__ == '__main__':
string = input()
print(count_words(string))
2577번 : 숫자의 개수
2577번: 숫자의 개수
첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 크거나 같고, 1,000보다 작은 자연수이다.
www.acmicpc.net
- 3개의 숫자가 주어지면, 이 숫자들을 곱하고 곱한 숫자 안에 0부터 9까지 각각의 숫자가 몇 번씩 쓰였는지를 구하는 문제입니다.
- 이 문제는 곱해진 숫자를 문자형으로 변환 후에 count(str) 함수를 이용하여 해당 문자열에 숫자가 몇 번씩 쓰여져있는지 세어줌으로써 풀어낼 수 있습니다.
def get_product():
result = 1
for _ in range(3):
num = int(input())
result *= num
return result
def count_digits_in_number(number):
result = str(number)
digit_count = [result.count(str(i)) for i in range(10)]
return digit_count
if __name__ == '__main__':
product = get_product()
digit_count = count_digits_in_number(product)
for count in digit_count:
print(count)
2675번 : 문자열 반복
2675번: 문자열 반복
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다
www.acmicpc.net
- 각 테스트 케이스만큼 문자열이 입력되면 그 문자열에 포함된 각 문자를 일정 횟수만큼 반복하여 출력해주는 문제입니다.
- 위 문제는 빈 문자열을 선언해 준 다음, 각 문자를 일정 횟수만큼 곱한 형태를 빈 문자열에 계속해서 추가해주는 형식으로 풀어낼 수 있습니다.
def repeat_characters(R, S):
result = ''
for char in S:
result += char * int(R)
return result
if __name__ == '__main__':
T = int(input())
for _ in range(T):
R, S = input().split()
repeated = repeat_characters(R, S)
print(repeated)
2920번 : 음계
2920번: 음계
다장조는 c d e f g a b C, 총 8개 음으로 이루어져있다. 이 문제에서 8개 음은 다음과 같이 숫자로 바꾸어 표현한다. c는 1로, d는 2로, ..., C를 8로 바꾼다. 1부터 8까지 차례대로 연주한다면 ascending, 8
www.acmicpc.net
- 정렬에 있어서 가장 기본적인 문제라고 볼 수 있습니다.
- 오름차순과 내림차순, 혹은 그렇지 않은 것들을 분류하는 문제로 저는 시간복잡도 O(NlogN)을 보장하는 sorted() 함수를 이용해 정렬된 배열과 기존 배열을 비교하는 형태로 문제를 풀어보았습니다.
- 기본적으로 sorted() 함수는 reverse 매개변수가 False로 설정되어 있어 오름차순으로 정렬해줍니다. 이에 반해 reverse 매개변수를 True로 주게 되면 입력값은 내림차순으로 정렬됩니다.
def check_order(scale):
if numbers == sorted(scale):
return 'ascending'
elif numbers == sorted(scale, reverse=True):
return 'descending'
else:
return 'mixed'
if __name__ == '__main__':
scale = list(map(int, input().split()))
print(check_order(scale))
3052번 : 나머지
3052번: 나머지
각 수를 42로 나눈 나머지는 39, 40, 41, 0, 1, 2, 40, 41, 0, 1이다. 서로 다른 값은 6개가 있다.
www.acmicpc.net
- 10가지의 수를 입력받은 뒤, 각각을 42로 나눈 나머지들 중에서 서로 다른 값이 몇 개인지를 판단하는 문제입니다.
- 서로 다른 값이 몇 개인지를 더욱 쉽게 판단하기 위해 저는 set() 함수 즉, 집합을 사용하여 중복값을 처리했습니다.
- 중간에 쓰여진 add() 함수의 경우 해당 set에 요소를 추가해주는 함수입니다.
- 이처럼 서로 다른 값이 총 몇 개인지를 판단하는 문제에서는 중복를 제거해주는 방향으로 푸는 것이 좋다고 판단됩니다.
def count_unique_remainders():
remainders = set()
for _ in range(10):
number = int(input())
remainders.add(number % 42)
return len(remainders)
if __name__ == '__main__':
print(count_unique_remainders())
8958번 : OX퀴즈
8958번: OX퀴즈
"OOXXOXXOOO"와 같은 OX퀴즈의 결과가 있다. O는 문제를 맞은 것이고, X는 문제를 틀린 것이다. 문제를 맞은 경우 그 문제의 점수는 그 문제까지 연속된 O의 개수가 된다. 예를 들어, 10번 문제의 점수
www.acmicpc.net
- 연속해서 맞은 문제들을 주의하여 점수를 계산해야 하는 문제입니다.
- 연속으로 맞는 문제들의 점수를 누적하기 위해 변수를 하나 설정해준 뒤, 문자열에서 O가 계속될 때마다 해당 변수를 증가시켜줌으로써 해결할 수 있습니다. 이후 틀리는 문제가 발생하면 이 변수를 다시 0으로 초기화해주시면 되겠습니다.
def calculate_score(quiz):
score, consecutive = 0, 0
for ox in quiz:
if ox == 'O':
consecutive += 1
score += consecutive
else:
consecutive = 0
return score
if __name__ == '__main__':
N = int(input())
for _ in range(N):
quiz = input()
print(calculate_score(quiz))
10809번 : 알파벳 찾기
10809번: 알파벳 찾기
각각의 알파벳에 대해서, a가 처음 등장하는 위치, b가 처음 등장하는 위치, ... z가 처음 등장하는 위치를 공백으로 구분해서 출력한다. 만약, 어떤 알파벳이 단어에 포함되어 있지 않다면 -1을 출
www.acmicpc.net
- 이 문제는 python의 find() 함수를 무조건 사용하라는 문제 같습니다...
- find() 함수는 입력 문자열에서 특정 부분의 문자열을 찾고, 그 특정 문자열이 처음 나타나는 인덱스를 반환합니다. 존재하지 않을 경우에는 -1을 반환합니다.
- find() 함수와 list comprehension을 이용해서 모든 문자에 대해 인덱스 값을 검사할 수 있습니다.
def find_char_positions(string, alphabet='abcdefghijklmnopqrstuvwxyz'):
return [string.find(char) for char in alphabet]
if __name__ == '__main__':
alpha = input()
positions = find_char_positions(alpha)
print(*positions)
1157번 : 단어 공부
1157번: 단어 공부
알파벳 대소문자로 된 단어가 주어지면, 이 단어에서 가장 많이 사용된 알파벳이 무엇인지 알아내는 프로그램을 작성하시오. 단, 대문자와 소문자를 구분하지 않는다.
www.acmicpc.net
- 단어에서 가장 많이 사용된 문자를 '대문자'로 출력해주는 문제입니다.
- 우선 출력되는 결과가 대문자이고, 대소문자를 구분하지 않는다고 문제에서 명시되어 있기에 입력으로 주어지는 문자열을 upper() 함수를 통하여 대문자로 변경해줍니다.
- 이 문자열에 포함되어 있는 문자들 각각을 count() 함수로 세어준 뒤, 이 중에서 최댓값을 가지는 문자의 인덱스를 index() 함수로 찾아 해당 문자를 반환해줍니다.
- 그러나 최댓값이 여러 개가 되는 경우에는 '?'를 반환해줍니다.
def find_most_frequent_char(string):
counts = []
string = string.upper()
chars = list(set(string))
for char in chars:
count = string.count(char)
counts.append(count)
if counts.count(max(counts)) >= 2:
return '?'
else:
return chars[counts.index(max(counts))]
if __name__ == '__main__':
string = input()
print(find_most_frequent_char(string))
- 문제 이해를 돕기 위해 간단한 시각화를 제공해드립니다. 영단어를 입력해주시고 버튼을 누르시면 실행됩니다.
'알고리즘 문제 > Class (solved.ac)' 카테고리의 다른 글
Class 2 (Hashing ~ 부녀회장이 될테야) (3) | 2023.12.15 |
---|---|
Class 2 (직각삼각형 ~ 블랙잭) (0) | 2023.12.06 |
Class 1 (A x B ~ ACM 호텔) (1) | 2023.11.28 |
Class 1 (윤년 ~ A+B - 5) (2) | 2023.11.26 |
Class 1 (A+B ~ N 찍기) (3) | 2023.11.21 |