Algorithm

[백준 1706] 크로스워드 (C++, Java)

WantAirpod 2020. 7. 5. 12:19
반응형

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

문제

가로와 세로에서 낱말이 있으면 모두 추출해서 사전식으로 가장 앞서 있는 낱말을 찾는다.

 

입력 & 출력

R*C는 최대 20x20 --> 완탐이다.

 

주관적인 문제난이도 : 프로그래머스 Lv2 정도, ★★☆

 

SOL)

문제 보자마자 Set 자료구조를 쓰면 편리하다고 생각했음(자동정렬, 중복제거) 하지만 자료 구조에 넣을 때 iterator로 순회한 후 중복체크하는것 연습하기 위해 그냥 Vecotor로 구현 ! 

 

예외처리1) 가로 세로 순회하며 '#'을 만날 때 Vector에 넣어준다. 그때 적재했던 단어의 길이가 1보다 작으면 vector에 넣지 않고 해당 적재했던 값을 초기화한다.

 

소스코드

 

C++

#include <iostream>
#include <vector> 
#include <string>
#include <algorithm>

using namespace std;
char arr[20][20];
string str;
int n, m;
vector<string> v;
void input()
{

	cin >> n;
	cin >> m;
	//input()
	for (int i = 0; i < n; i++)
	{
		string s;
		cin >> s;
		for (int j = 0; j < m; j++)
		{	
			arr[i][j] = s[j];
		}
	}

}
void sol()
{ 
	vector<string>::iterator it;
	//가로
	for (int i = 0; i < n; i++)
	{ 
		string sumStr=""; 
		for (int j = 0; j < m; j++)
		 {
			if (arr[i][j] == '#')
			{
				//문자있을때
				if (sumStr.size() > 1)
				{
				 
                 	v.push_back(sumStr);
                	sumStr = "";
               	 	continue; 
				}
				else 
				{
					sumStr = "";
					continue;
				}
				
			}
			else
			{ 
				sumStr += arr[i][j];
			}
			if (j == m - 1 && sumStr.size() > 1)
			{
				sumStr += arr[i][j];
				v.push_back(sumStr); 
                sumStr = "";
 
			}
		} 
	}

	//새로
 
	for (int i = 0; i < m; i++)
	{
		string sumStr = "";
	 
		for (int j = 0; j < n; j++)
		{

			if (arr[j][i] == '#')
			{
				if (sumStr.size()>1)
				{ 
                  v.push_back(sumStr);
                  sumStr = "";
                  continue;
				 
				}
				else
				{
					sumStr = ""; 
					continue;

				}
				
			}
			else
			{
		 
				sumStr += arr[j][i];
			}

			if (j == n - 1 && sumStr.size() > 1)
			{
			 
             v.push_back(sumStr);
             sumStr = "";

			}
		}
	} 
	sort(v.begin(), v.end());
	
	 
}
int main()
{
	string answer;
	input();
	sol();
	if(v.size()>0)
	cout << v[0] << endl;
	
	return 0;


}

 

Java

package Z_ShinHanCard_Prepare;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
 
 
public class 백준1706_크로스워드 {
	static int R;
	static int C;
	static char crossWord [][];
	static Set<String> wordList = new HashSet<String>();
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
		String input = br.readLine();
		StringTokenizer st= new StringTokenizer(input);
		R= Integer.parseInt(st.nextToken());
		C= Integer.parseInt(st.nextToken());
		crossWord= new char[R][C];
		//StringBuilder sb;
		for (int i=0; i<R; i++) {
			input = br.readLine();
			for (int j=0; j<C; j++) {
				crossWord[i][j]=input.charAt(j);
			}
		}
		
		
		for (int i=0; i<R; i++) {
		//	sb= new StringBuilder();
			String tempStr = "";
			for(int j=0; j<C; j++) {
				if (crossWord[i][j]=='#') {
					if (tempStr.length()>1)
						{
						wordList.add(tempStr.toString());
						
						}
					tempStr = "";
				}
				else {
					tempStr += crossWord[i][j];
					
				}
			}
			if (tempStr.length()>1)
			{
			wordList.add(tempStr);
			
			}
		}
		for (int j=0; j<C; j++) {
			//sb= new StringBuilder();
			String tempStr = "";
			for (int i=0; i<R;i++) {
				if (crossWord[i][j]=='#') {
					if (tempStr.length()>1)
					{
					wordList.add(tempStr);
					
					}
					  tempStr = "";
				}
				else {
					tempStr += crossWord[i][j];
				}
			}
			if (tempStr.length()>1)
			{
			wordList.add(tempStr);
			
			}
		}
		ArrayList<String> list= new ArrayList<String>();
		for (String s: wordList) {
			list.add(s);
		}
		Collections.sort(list);
		
		System.out.println(list.get(0));
	}

}

반응형