PS/BOJ

[백준 3005번] 크로스워드 퍼즐 쳐다보기 파이썬 풀이

76 2024. 1. 9. 17:43
728x90

 

크로스워드 퍼즐 쳐다보기 

1 초 128 MB 1260 702 603 57.538%

문제

크로스워드 퍼즐은 R*C크기의 직사각형으로 이루어져 있고, 각 칸은 비어있거나 막혀있다. 퍼즐은 가로(왼쪽->오른쪽) 또는 세로(위->아래)로 연속된 빈 칸에 단어를 채우면서 푼다.

동혁이는 크로스워드 퍼즐을 풀지 않는다. 그는 풀려있는 퍼즐을 쳐다본다. 그런 후에, 그는 그 퍼즐에서 사전순으로 제일 앞서는 단어를 찾는다. (단어는 적어도 2글자이다.)

크로스워드 퍼즐이 주어졌을 때, 사전순으로 제일 앞서는 단어를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 R과 C (2 ≤ R, C ≤ 20)가 주어진다. R는 행의 개수, C는 열의 개수이다. 그 다음 R개의 줄엔 C개의 문자가 포함되어 있다. 각 문자는 영어 알파벳 소문자 또는 '#'이며, '#'인 경우에는 막혀있는 것이다.

출력

첫째 줄에 사전순으로 제일 앞서는 단어를 출력한다. 정답이 항상 존재하는 경우만 입력으로 주어진다.

예제 입력 1

4 4
luka
o#a#
kula
i#a#

예제 출력 1 

kala

예제 입력 2 

4 4
luka
o#a#
kula
i#as

예제 출력 2

as

예제 입력 3

4 5
adaca
da##b
abb#b
abbac

예제 출력 3

abb

 

구현, 문자열 문제이다.

 

이 문제를 해결하기 위해 내가 생각한 알고리즘은 아래와 같다.

 

1. 빈 배열을 준비한다.

2. 2차원 배열이므로 2중 반복문을 돌면서 각 문자에 대해 탐색한다.

    2.1. 빈 문자열을 만들고 '#'인지 아니라면 문자열에 합한다.
    2.2. 만약 '#'을 만난다면 지금까지 만든 문자열을 배열에 삽입하고 2.1번으로 되돌아간다.

3. 가로와 세로 모든 줄에 대해 탐색을 완료하였다면 배열을 정렬하고, 첫번째 문자를 출력한다.

# https://www.acmicpc.net/problem/3005
'''
'#' 을 만나기전까지 돌면서, 문자 만들고 만들어진 글자가 2글자 이상이라면 words에 삽입
words 배열을 정렬한 뒤, 첫번재 문자 출력
'''
r,c = map(int,input().split())
words = []
data = [list(input()) for _ in range(r)]
# 가로로 만들 수 있는 문자 삽입
for i in range(r):
    word = ''
    for j in range(c):
        if data[i][j] != '#':
            word += data[i][j] # '#'이 아니라면 더하기
        else: # '#'을 만난경우 만들어진 문자가 2글자 이상인지 검사
            # 2글자 이상이라면 words에 삽입
            if len(word) >= 2:
                words.append(word)
            word = '' # word 초기
    if len(word) >= 2:
        words.append(word)
# 세로로 만들 수 있는 문자 삽입
for i in range(c):
    word = ''
    for j in range(r):
        if data[j][i] != '#':
            word += data[j][i] # '#'이 아니라면 더하기
        else: # '#'을 만난경우 만들어진 문자가 2글자 이상인지 검사
            # 2글자 이상이라면 words에 삽입
            if len(word) >= 2:
                words.append(word)
            word = '' # word 초기
    if len(word) >= 2:
        words.append(word)

# 정렬했을때 가장 먼저 오는 문자 출력
print(sorted(words)[0])

 

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

 

3005번: 크로스워드 퍼즐 쳐다보기

첫째 줄에 R과 C (2 ≤ R, C ≤ 20)가 주어진다. R는 행의 개수, C는 열의 개수이다. 그 다음 R개의 줄엔 C개의 문자가 포함되어 있다. 각 문자는 영어 알파벳 소문자 또는 '#'이며, '#'인 경우에는 막혀

www.acmicpc.net