상세 컨텐츠

본문 제목

백준#1969 - DNA

C#/알고리즘

by McRobbin 2020. 4. 17. 14:14

본문

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

 

1969번: DNA

문제 DNA란 어떤 유전물질을 구성하는 분자이다. 이 DNA는 서로 다른 4가지의 뉴클레오티드로 이루어져 있다(Adenine, Thymine, Guanine, Cytosine). 우리는 어떤 DNA의 물질을 표현할 때, 이 DNA를 이루는 뉴클레오티드의 첫글자를 따서 표현한다. 만약에 Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-Cytosine-Cytosine-Guanine-Adenine-Thymine로 이루어진

www.acmicpc.net

그리디 알고리즘으로 분류된 1969번 DNA문제 입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace _1969
{
    class Program
    {
 
        static void Main(string[] args)
        {
            //길이와 갯수 입력.
            string[] countLength = Console.ReadLine().Split(' ');
            int DNALength = int.Parse(countLength[1]);
            int DNACount = int.Parse(countLength[0]);
 
            //모든 DNA입력.
            var DNAArray = new string[DNACount];
 
            for (int i = 0; i < DNACount; i++)
                DNAArray[i] = Console.ReadLine();
 
            Dictionary<stringint> charDict = new Dictionary<stringint>();
 
            //답을 구할 문자열, 디스턴스.
            string strAnswer = "";
            int intAnswer = 0;
 
            //모든 DNA의 첫번째 문자부터 마지막 문자까지.
            for(int charAt = 0; charAt < DNALength; charAt++)
            {
 
                //각 DNA string을 하나씩 가져옴.
                for(int line = 0; line < DNACount; line++)
                {
                    int charCount;
                    string targetChar = DNAArray[line].Substring(charAt, 1);
                    if (charDict.TryGetValue(targetChar, out charCount))
                        charDict[targetChar] = charCount + 1;
                    else
                        charDict.Add(targetChar, 1);
                }
 
                //딕셔너리 각 요소를 돌며 최소값 찾기.
                string maxString = "ZZ";
                int maxCount = int.MinValue;
 
                foreach(KeyValuePair<stringint> kvp in charDict)
                {
                    if (maxCount == kvp.Value)
                    {
                        if (kvp.Key.CompareTo(maxString) == -1)
                            maxString = kvp.Key;
                    }
                    else if (maxCount < kvp.Value)
                    {
                        maxCount = kvp.Value;
                        maxString = kvp.Key;
                    }
                    
                }
                strAnswer += maxString;
                intAnswer += maxCount;
                charDict.Clear();
            }
 
            Console.WriteLine("{0}\n{1}", strAnswer, DNALength * DNACount - intAnswer);
        }
    }
}
 
 
 

 

ex)5 8

12345678

TATGATAC

TAAGCTAC

AAAGATCC

TGAGATAC

TAAGATGT

이와 같이 예시가 있습니다. 스트링 하나하나를 따로 보는게 아니라 각 스트링의 0번을 모두 보고 1번을 모두 보고

하기 위해 위에 인덱스를 붙였습니다.

 

저는 각 인덱스 알파벳의 대세를 골라줬습니다. 1번줄에 문자가 T T A T T 이런 식으로 있으며 이를 갯수를 세주었습니다. 갯수를 세는데는 Dictionary를 사용했습니다. 그리고 가장 많이 선택된 T와 그 갯수 4개가 나오며 최종 출력할

문자열에 T를 이어줍니다. 또한 최종 갯수에 4를 더해줍니다.

다음 2번줄에 A가 4개 G가 한개 이므로 A를 문자열에 이어주고 A의 카운트를 최종 갯수에 더해줍니다.

 

그럼 TAAGATAC가 나오며 갯수가 33이 나오는데 이는 각 스트링의 대세 문자를 골랐을 때 그 갯수가 되며

대세가 아닌 문자들을 구하려면 모든 문자의 갯수 5 * 8에서 대세의 갯수를 빼주면 되겠습니다.

 

 

'C# > 알고리즘' 카테고리의 다른 글

백준#1427 - 소트인사이드  (0) 2020.04.19
백준#1543 - 문서 검색  (0) 2020.04.18
백준#1449 - 수리공 항승  (0) 2020.04.16
백준#3052 - 나머지  (0) 2020.04.14
백준#1138 - 한 줄로 서기  (0) 2020.04.13

관련글 더보기