코딩테스트/BOJ

[BOJ] 2804 크로스워드 만들기 - JAVA

5월._. 2022. 3. 9.
728x90

1. 문제

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

 

2804번: 크로스워드 만들기

A의 길이를 N, B의 길이를 M이라고 했을 때, 출력은 총 M줄이고, 각 줄에는 N개 문자가 있어야 한다. 문제 설명에 나온 것 같이 두 단어가 교차된 형태로 출력되어야 한다. 나머지 글자는 '.'로 출력

www.acmicpc.net

창영이는 크로스워드 퍼즐을 만들려고 한다.

두 단어 A와 B가 주어진다. A는 가로로 놓여야 하고, B는 세로로 놓여야 한다. 또, 두 단어는 서로 교차해야 한다. (정확히 한 글자를 공유해야 한다.) 공유하는 글자는 A와 B에 동시에 포함되어 있는 글자여야 하고, 그런 글자가 여럿인 경우 A에서 제일 먼저 등장하는 글자를 선택한다. 마찬가지로 이 글자가 B에서도 여러 번 등장하면 B에서 제일 처음 나오는 것을 선택한다. 


2. 풀이

  • 문자열 A,B를 입력받고 각 길이를 따로 저장한다.(length()함수를 여러번 호출하지 않도록 하기 위함)
  • a,b 변수는 겹친 인덱스를 저장한다.
  • A문자열을 처음부터 탐색하면서 해당 char이 B에 존재한다면 탐색을 멈춘다.
    • B.indexOf()는 char이 여러번 등장한다면 맨 처음 인덱스를 반환하기 때문에 가능하다.
    • b 변수에 인덱스를 먼저 할당하고 비교한다.
    • 만약 없다면 음수를 반환하므로 b가 양수인지 체크하면 탐색을 멈출지 정할 수 있다.
  • B가 세로, A가 가로이므로 M반복->N반복 이중반복한다. 만약 해당 행이 b와 같다면 A문자열을 전부 출력한다.
  • 열이 a인 경우는 B 부분(행번호로 접근)을 출력하고, 그 외에는 전부 '.'를 출력한다.  
public static void main(String[] args) throws Exception {
   StringTokenizer st = new StringTokenizer(new BufferedReader(new InputStreamReader(System.in)).readLine());
   String A = st.nextToken();
   String B = st.nextToken();
   
   int N = A.length();
   int M = B.length();
   
   int a, b=0;
   for(a=0;a<N;a++) {
      if((b = B.indexOf(A.charAt(a)))>=0) break;
   }
   
   StringBuilder sb = new StringBuilder();
   for(int i=0;i<M;i++) {
      if(i==b) {
         sb.append(A).append("\n");
         continue;
      }
      for(int j=0;j<N;j++) {
         if(j==a) sb.append(B.charAt(i));
         else sb.append(".");
      }
      sb.append("\n");
   }
   
   System.out.print(sb);
}

3. 결과

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 1932 정수 삼각형 - JAVA  (0) 2022.03.09
[BOJ] 9461 파도반 수열 - JAVA  (0) 2022.03.09
[BOJ] 1149 RGB거리 - JAVA  (0) 2022.03.09
[BOJ] 1904 01타일 - JAVA  (0) 2022.03.08
[BOJ] 1780 종이의 개수 - JAVA  (0) 2022.03.08

댓글