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 |
댓글