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));
}
}
반응형