다희의 코딩 성장일기

[백준] 9177. 단어 섞기 (자바 JAVA) 본문

Algorithm/백준 BOJ

[백준] 9177. 단어 섞기 (자바 JAVA)

ilmiodiario 2021. 12. 16. 23:36

[ 문제 ]  [백준] 9177. 단어 섞기 (자바 JAVA)

 

문제 링크 : https://www.acmicpc.net/problem/9177

 

9177번: 단어 섞기

세 개의 단어가 주어졌을때, 꿍은 첫 번째 단어와 두 번째 단어를 섞어서 세 번째 단어를 만들 수 있는지 궁금해졌다. 첫 번째와 두 번째 단어는 마음대로 섞어도 되지만 원래의 순서는 섞여서는

www.acmicpc.net

 


# 접근 방법 및 풀이 

 

  • 어디 기업 코테 풀면서 봤던 문제 같아서 풀어봤다. 정답률 26으로 극악이다..
  • 처음에 풀고 50프로만 맞아서 풀이방법 찾아봤다. bfs로 접근해서 다시 풀었다.
  • 입력받은 3개의 단어들은 char[] 배열로 받고, 인덱스로 비교한다.
  • Queue에는 첫번째 단어 인덱스와, 두번째 단어인덱스를 담기위해 Point로 선언.
  • Point.x = 첫번째단어 인덱스, Point.y = 두번째 단어 인덱스다.
  • bfs에서 방문체크는 visit[][] 2차원 배열로 선언하고, 행부분에는 첫번째단어, 열부분은 두번째 단어 인덱스를 체크한다.
  • visit[][] = new visit[word1.length+1][word2.length+1]; 
  • bfs에서 break 조건은 queue에서 pop한 첫번째단어 인덱스와 두번째단어 인덱스를 더했을 때 세번째 단어의 길이가 나온다면. 두 단어가 순서대로 잘 합쳐진 것이므로 ans = "yes"를 담고 break 한다.
  • 자세한건 코드참조

# 주의할 점 

 

  • visit[word1.length+1][word2.length+1] 크기 선언할 때 +1해줘야함. 

 

JAVA 코드
package Gold;

import java.awt.Point;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class bj9177_단어섞기 {
	static char[] word1, word2, word3;
	static String ans = "";
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(in.readLine());
		for(int tc = 1; tc <= T; tc++) {
			StringTokenizer st = new StringTokenizer(in.readLine());
			word1 = st.nextToken().toCharArray();
			word2 = st.nextToken().toCharArray();
			word3 = st.nextToken().toCharArray();
			ans = "no";
			bfs();
			System.out.println("Data set " + tc + ": " + ans);
		}
	}

	private static void bfs() {
		Queue<Point> queue = new LinkedList<>();
		boolean visit[][] = new boolean[word1.length+1][word2.length+1];
		queue.add(new Point(0, 0));
		visit[0][0] = true;
		while(!queue.isEmpty()) {
			Point p = queue.poll();
			int aIdx = p.x;
			int bIdx = p.y;
			if(aIdx + bIdx == word3.length) {
				ans = "yes";
				break;
			}
			if(aIdx < word1.length && word3[aIdx+bIdx] == word1[aIdx] && !visit[aIdx+1][bIdx]) {
				visit[aIdx+1][bIdx] = true;
				queue.add(new Point(aIdx+1, bIdx));
			}
			if(bIdx < word2.length && word3[aIdx+bIdx] == word2[bIdx] && !visit[aIdx][bIdx+1]) {
				visit[aIdx][bIdx+1] = true;
				queue.add(new Point(aIdx, bIdx+1));
			}
		}
	}
}

 

 

 

REVIEW

더 열심히 풀자..

Comments