백준 12970번 AB 파이썬

박슬빈·2021년 9월 25일
0

알고리즘

목록 보기
22/40
post-custom-banner

문제

입력 , 출력

solution

n, k = map(int, input().split())
idx = 0
res = []  #len(res) 는 a의 개수 , a의 인덱스가 들어갈거임
cnt = 0
bcnt = n - 1  # b의 개수
for i in range(n):
    if cnt == k:
        break
    cnt -= len(res)  #a가 한개 들어가므로 쌍의 개수가 1개씩 사라짐
    bcnt -= 1  #a가 들어가므로 b의 개수가 줄어듬
    for j in range(n, idx, -1):
        if cnt + n - j == k: #k개의 쌍이 만들어지면 종료
            idx = j #사실 의미없는줄..
            res.append(j) # res에 A가 들어가는 인덱스
            cnt += n - j #만들수있는지 체크하기위해서 cnt를 넣어줌
            break
        if idx == j - 1 and cnt + n - j <= k:
            idx = j
            res.append(idx)
            cnt += n - j
        elif cnt + n - j < k:
            continue
        elif cnt + n - j > k:
            idx = j + 1
            cnt += n - j - 1
            res.append(j + 1)
            break
if cnt != k:
    print(-1)
else:
    ans = ''
    for i in range(1, n + 1):
        if i in res:
            ans += 'A'
        else:
            ans += 'B'
    print(ans)

설명

우선 B로 글자전체를 채운다고 가정
입력이 10 12 가 들어왔으면 10줄에 12개의 쌍이 필요함
B B B B B B B B B B 로 시작한다고 가정
A를 하나 삽입
B B B B B B B B B A 일경우에는 쌍이 0
B B B B B B B B A B 일경우에는 쌍이 한개
이럭식으로 쌍의 A의 인덱스를 왼쪽으로 계속 보내면서 쌍의 개수를 표현함
A B B B B B B B B B 이렇게 끝까지 보냈지만 쌍의 개수는 9 개
A가 들어갈 위치의 인덱스 1을 res배열에 삽입 그리고 A가 마지막에 들어간
위치를 기억하기위해서 idx에 A가 들어간 인덱스 1을 대입
쌍의 개수가 12개가 안되므로 A한개를 더 삽입
A B B B B B B B B A 이렇게 되면 앞에 A의 개수만큼 쌍이 사라지므로
앞에서 삽입했던 A의 개수만큼 쌍의 개수를 없애줌
총 쌍의 개수 - len(res)를 하면 9 - 1 해서 현재상태에선 쌍의 개수가 8개
그이후 A를 마지막으로 삽입했던 A의 인덱스 전까지 왼쪽으로 이동 , A를 마지막으로 삽입한 인덱스는 1 이기때문에 최대 2까지 이동
왼쪽으로 이동하다보면
A B B B B A B B B B 이 되었을때는
1번 A의 쌍의개수 8개 6번인덱스 A의 쌍의 개수 4개 , 총 12개가 되어서
반복문을 종료
그리고 res에는 1,6가 삽입이 되었으므로 10개 중에 1번째 , 6번째에 A를 넣어주면 총 쌍의 개수가 12개가 된다.

후기

너무 어렵다...

profile
이것저것합니다
post-custom-banner

0개의 댓글