[백준] 12970번 AB Java

JeongYong·2022년 11월 23일
0

Algorithm

목록 보기
74/263

문제 링크

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

문제

정수 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 길이의 문자열이 최대 몇 개의 쌍이 나오는지 구해야 한다.
최대 쌍은 짝수면 N/2 N/2이고, 홀수면 N/2(몫만 취함) (N-N/2)이다.
한쪽은 a의 개수 한쪽은 b의 개수이다. 작은 쪽을 a라고 하겠다.
K가 a*b보다 크면 S가 존재하지 않는 경우이기 때문에 -1을 출력한다.
그렇지 않은 경우 S를 'B'로 채우고 A의 위치를 구해야 하는데
K/B개는 S의 맨 앞에서부터 +1씩 A를 위치시킨다.
K%B가 0이 아니라면 S의 ((K/B + 1) + (B - K%B))번째 위치에 A를 하나 위치시키고,
나머지 A들은 S의 맨 뒤에서부터 -1씩 위치시키면 된다.

소스 코드

import java.io.*;
import java.util.*;

public class Main {
    static int N,K;
    static char S[];
    static String ans;
    public static void main(String args[]) throws IOException {
      BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
      StringTokenizer st = new StringTokenizer(br.readLine());
      N = Integer.parseInt(st.nextToken());
      K = Integer.parseInt(st.nextToken());
      S = new char[N];
      Arrays.fill(S, 'B');
      int ca= N/2;
      int cb = N - ca;
      if(ca * cb < K) System.out.println(-1);
      else {
          int front_ac = K/cb - 1;
          int loc_a = -1;
          int back_ac = ca;
          if(K%cb != 0) {
              loc_a = front_ac + 1 + cb - K%cb;
              if(front_ac == -1) back_ac -= 1;
              else back_ac -= front_ac + 2;
          } else {
              if(front_ac != -1) back_ac -= front_ac + 1;
          }
          for(int i=0; i<N; i++) {
              if(front_ac >= i) {
                  S[i] = 'A';
              } else if(loc_a == i) {
                  S[i] = 'A';
              } else if(N-back_ac<= i) {
                  S[i] = 'A';
              }
          }
        ans = new String(S);
        System.out.println(ans);
      }
    }
}

0개의 댓글