dev/algorithm
BOJ / 1969๋ฒ / DNA [Go][Python3]
crscnt
2021. 1. 24. 21:00
๐ฉ๐ป๐ป ๋ฌธ์
1969๋ฒ: DNA
DNA๋ ์ด๋ค ์ ์ ๋ฌผ์ง์ ๊ตฌ์ฑํ๋ ๋ถ์์ด๋ค. ์ด DNA๋ ์๋ก ๋ค๋ฅธ 4๊ฐ์ง์ ๋ดํด๋ ์คํฐ๋๋ก ์ด๋ฃจ์ด์ ธ ์๋ค(Adenine, Thymine, Guanine, Cytosine). ์ฐ๋ฆฌ๋ ์ด๋ค DNA์ ๋ฌผ์ง์ ํํํ ๋, ์ด DNA๋ฅผ ์ด๋ฃจ๋ ๋ดํด๋ ์ค
www.acmicpc.net
โ๐ป ํ์ด
๐จ Go
// https://www.acmicpc.net/problem/1969
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
reader := bufio.NewReader(os.Stdin)
writer := bufio.NewWriter(os.Stdout)
defer writer.Flush()
var n, m int
fmt.Fscanln(reader, &n, &m)
var counts = make([]map[string]int, m)
for i := 0; i < m; i++ {
counts[i] = map[string]int{} // DNA์ ๊ฐ ์์น์ ์กด์ฌํ๋ ๋ดํด๋ ์คํฐ๋ ์ข
๋ฅ๋ณ ๊ฐ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ๋งต ์์ฑ
}
for i := 0; i < n; i++ {
var dna string
fmt.Fscanln(reader, &dna)
nucleotide := strings.Split(dna, "")
for j := 0; j < len(nucleotide); j++ {
counts[j][nucleotide[j]]++
}
}
var answerDNA string
var answerCount int
for i := 0; i < len(counts); i++ {
count := counts[i]
var pairs []pair
for k, v := range count {
pairs = append(pairs, pair{k, v})
}
sort.Slice(pairs, func(i, j int) bool {
if pairs[i].value > pairs[j].value { // ๊ฐ ์์น๋ณ๋ก ๊ฐ์ฅ ๋ง์ด ์กด์ฌํ๋ ๋ดํด๋ ์คํฐ๋๋ฅผ ์ฑํ
return true
} else if pairs[i].value == pairs[j].value {
return pairs[i].key < pairs[j].key // ๋์ผํ ๊ฐ์์ผ ๊ฒฝ์ฐ ์ฌ์ ์์ผ๋ก ์ฑํ
}
return false
})
answerDNA += pairs[0].key // ์ฑํ๋ ๋ดํด๋ ์คํฐ๋ ๊ฐ ์ถ๊ฐ
answerCount += n - pairs[0].value // DNA ๊ฐ์์์ ์ฑํ๋ ๋ดํด๋ ์คํฐ๋์ ๊ฐ์๋ฅผ ๋บ ๊ฐ์ hamming distance๋ก ๊ณ์ฐ
}
fmt.Fprintln(writer, answerDNA)
fmt.Fprintln(writer, answerCount)
}
type pair struct {
key string
value int
}
๐จ Python3
# https://www.acmicpc.net/problem/1969
import sys
if __name__ == "__main__":
n, m = list(map(int, sys.stdin.readline().split()))
counts = [{} for i in range(m)]
for i in range(n):
dna = sys.stdin.readline()
nucleotide = list(dna)
for j in range(m):
if counts[j].get(nucleotide[j]):
counts[j][nucleotide[j]] += 1
else:
counts[j][nucleotide[j]] = 1
answer_dna = ""
answer_count = 0
for i in range(len(counts)):
count = counts[i]
answer = sorted(count.items(), key=lambda item: (-item[1], item[0]))[0]
answer_dna += answer[0]
answer_count += n - answer[1]
print("{}\n{}".format(answer_dna, answer_count))
728x90