상세 컨텐츠

본문 제목

[백준] 2804번 크로스워드 만들기 (Go)

Development/Algorithm

by thisisnew 2022. 12. 28. 00:01

본문

반응형

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에서 제일 처음 나오는 것을 선택한다. 예를 들어, A = "ABBA"이고, B = "CCBB"라면, 아래와 같이 만들 수 있다.

입력

첫째 줄에 두 단어 A와 B가 주어진다. 두 단어는 30글자 이내이고, 공백으로 구분되어져 있다. 또, 대문자로만 이루어져 있고, 적어도 한 글자는 두 단어에 포함되어 있다.

 

출력

A의 길이를 N, B의 길이를 M이라고 했을 때, 출력은 총 M줄이고, 각 줄에는 N개 문자가 있어야 한다. 문제 설명에 나온 것 같이 두 단어가 교차된 형태로 출력되어야 한다. 나머지 글자는 '.'로 출력한다.


package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"
)

func main() {

	var read = bufio.NewReader(os.Stdin)
	t, _, _ := read.ReadLine()
	text := strings.Split(string(t), " ")

	printCrossWord(text[0], text[1])
}

func getIndexBetweenTwoWords(a, b string) (int, int) {

	var aIdx int
	var bIdx int
	var isAssign bool

	for i, ar := range a {
		if isAssign {
			return aIdx, bIdx
		}

		for j, br := range b {
			if ar == br {
				aIdx = i
				bIdx = j
				isAssign = true
				break
			}
		}
	}

	return aIdx, bIdx
}

func printCrossWord(a, b string) {

	aIdx, bIdx := getIndexBetweenTwoWords(a, b)

	for i := 0; i < len([]rune(b)); i++ {
		for j := 0; j < len([]rune(a)); j++ {
			if i == bIdx {
				fmt.Print(a[j : j+1])
				continue
			}

			if j == aIdx {
				fmt.Print(b[i : i+1])
				continue
			}

			fmt.Print(".")
		}

		if i < len([]rune(b))-1 {
			fmt.Println()
		}
	}
}

반응형

관련글 더보기

댓글 영역