[백준] 12970번 AB - Python / 알고리즘 중급 1/3 - 그리디 알고리즘 (연습)

ByungJik_Oh·2025년 6월 19일
0

[Baekjoon Online Judge]

목록 보기
169/244
post-thumbnail



💡 문제

정수 N과 K가 주어졌을 때, 다음 두 조건을 만족하는 문자열 S를 찾는 프로그램을 작성하시오.

  • 문자열 S의 길이는 N이고, 'A', 'B'로 이루어져 있다.
  • 문자열 S에는 0 ≤ i < j < N 이면서 s[i] == 'A' && s[j] == 'B'를 만족하는 (i, j) 쌍이 K개가 있다.

입력

첫째 줄에 N과 K가 주어진다. (2 ≤ N ≤ 50, 0 ≤ K ≤ N(N-1)/2)

출력

첫째 줄에 문제의 조건을 만족하는 문자열 S를 출력한다. 가능한 S가 여러 가지라면, 아무거나 출력한다. 만약, 그러한 S가 존재하지 않는 경우에는 -1을 출력한다.


💭 접근

이 문제를 해결하기 위해서 만약 입력 n이 5로 주어졌다면 [B, B, B, B, B]에서 시작하여 리스트의 맨 끝에서부터 A를 채운 후, 각 A를 기준으로 보다 뒤에 있는 B의 개수를 세는 방식으로 문제를 해결하였다. 예제를 통해 알아보자.

ex) 예제
n = 10, k = 12
B B B B B B B B B A -> 0
B B B B B B B B A B -> 1
B B B B B B B A B B -> 2
B B B B B B A B B B -> 3
B B B B B A B B B B -> 4
B B B B A B B B B B -> 5
B B B A B B B B B B -> 6
B B A B B B B B B B -> 7
B A B B B B B B B B -> 8
A B B B B B B B B B -> 9
A B B B B B B B B A -> 8
A B B B B B B B A B -> 8 + 1 = 9
A B B B B B B A B B -> 8 + 2 = 10
A B B B B B A B B B -> 8 + 3 = 11
A B B B B A B B B B -> 8 + 4 = 12

위와 같은 순서로 A를 채운 후, B의 개수가 k와 같아지는 경우에 이를 출력하고, 만약 모든 리스트가 A로 채워질 때까지 k와 같아지는 경우가 없다면 -1을 출력한다.


📒 코드

n, k = map(int, input().split())
ans = ['B' for _ in range(n)]
break_point = ['A' for _ in range(n)]

cursor = n - 1
while ans != break_point:
    if cursor == n - 1:
        ans[cursor] = 'A'
    else:
        ans[cursor] = 'A'
        ans[cursor + 1] = 'B'
    cursor -= 1

    if cursor < 0 or ans[cursor] == 'A':
        cursor = n - 1

    cnt = 0
    for i in range(n):
        if ans[i] == 'A':
            for j in range(i + 1, n):
                if ans[j] == 'B': cnt += 1

    if cnt == k:
        print(*ans, sep='')
        break
else:
    print(-1)

💭 후기

처음 문제를 보자마자 어렵지 않게 풀이를 떠올릴 수 있던 문제였다.


🔗 문제 출처

https://www.acmicpc.net/problem/12970


profile
精進 "정성을 기울여 노력하고 매진한다"

0개의 댓글