<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>12891번 Archives - 어제와 내일의 나 그 사이의 이야기</title>
	<atom:link href="https://lycos7560.com/tag/12891%eb%b2%88/feed/" rel="self" type="application/rss+xml" />
	<link></link>
	<description>생각의 흐름을 타고 다니며 만드는 블로그</description>
	<lastBuildDate>Fri, 18 Oct 2024 07:07:21 +0000</lastBuildDate>
	<language>ko-KR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.2</generator>

<image>
	<url>https://lycos7560.com/wp-content/uploads/2022/11/cropped-cropped-cropped-log-1-150x150-1-80x80.png</url>
	<title>12891번 Archives - 어제와 내일의 나 그 사이의 이야기</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>백준 12891번 (DNA 비밀번호, C++) [BAEKJOON]</title>
		<link>https://lycos7560.com/cpp/%eb%b0%b1%ec%a4%80-12891%eb%b2%88-dna-%eb%b9%84%eb%b0%80%eb%b2%88%ed%98%b8-c-baekjoon/38394/</link>
					<comments>https://lycos7560.com/cpp/%eb%b0%b1%ec%a4%80-12891%eb%b2%88-dna-%eb%b9%84%eb%b0%80%eb%b2%88%ed%98%b8-c-baekjoon/38394/#respond</comments>
		
		<dc:creator><![CDATA[lycos7560]]></dc:creator>
		<pubDate>Fri, 18 Oct 2024 07:07:19 +0000</pubDate>
				<category><![CDATA[BaekjoonOnlineJudge]]></category>
		<category><![CDATA[C++/CPP]]></category>
		<category><![CDATA[12891]]></category>
		<category><![CDATA[12891번]]></category>
		<category><![CDATA[Baekjoon]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[DNA 비밀번호]]></category>
		<category><![CDATA[study]]></category>
		<category><![CDATA[공부]]></category>
		<category><![CDATA[기초]]></category>
		<category><![CDATA[백준]]></category>
		<category><![CDATA[백준 12891]]></category>
		<category><![CDATA[백준 12891번]]></category>
		<category><![CDATA[슬라이딩]]></category>
		<category><![CDATA[슬라이딩 윈도우]]></category>
		<category><![CDATA[알고리즘]]></category>
		<category><![CDATA[윈도우]]></category>
		<category><![CDATA[코딩테스트]]></category>
		<category><![CDATA[코테]]></category>
		<guid isPermaLink="false">https://lycos7560.com/?p=38394</guid>

					<description><![CDATA[<p>DNA 비밀번호 https://www.acmicpc.net/problem/12891 시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율 2 초 512 MB 27005 9765 7139 34.957% 문제 평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. 예를 들어 “ACKA”는 DNA 문자열이 아니지만 “ACCA”는 DNA 문자열이다. [&#8230;]</p>
<p>The post <a href="https://lycos7560.com/cpp/%eb%b0%b1%ec%a4%80-12891%eb%b2%88-dna-%eb%b9%84%eb%b0%80%eb%b2%88%ed%98%b8-c-baekjoon/38394/">백준 12891번 (DNA 비밀번호, C++) [BAEKJOON]</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading">DNA 비밀번호 <img decoding="async" width="35" height="45" class="wp-image-37910" style="width: 35px;" src="https://lycos7560.com/wp-content/uploads/2024/03/Sliver_2.jpg" alt="" srcset="https://lycos7560.com/wp-content/uploads/2024/03/Sliver_2.jpg 400w, https://lycos7560.com/wp-content/uploads/2024/03/Sliver_2-234x300.jpg 234w" sizes="(max-width: 35px) 100vw, 35px" /></h1>



<p class="wp-block-paragraph"><a href="https://www.acmicpc.net/problem/12891" target="_blank" rel="noreferrer noopener">https://www.acmicpc.net/problem/12891</a></p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th class="has-text-align-left" data-align="left">시간 제한</th><th class="has-text-align-left" data-align="left">메모리 제한</th><th class="has-text-align-left" data-align="left">제출</th><th class="has-text-align-left" data-align="left">정답</th><th class="has-text-align-left" data-align="left">맞힌 사람</th><th class="has-text-align-left" data-align="left">정답 비율</th></tr></thead><tbody><tr><td class="has-text-align-left" data-align="left">2 초</td><td class="has-text-align-left" data-align="left">512 MB</td><td class="has-text-align-left" data-align="left">27005</td><td class="has-text-align-left" data-align="left">9765</td><td class="has-text-align-left" data-align="left">7139</td><td class="has-text-align-left" data-align="left">34.957%</td></tr></tbody></table></figure>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">문제</h2>



<p class="wp-block-paragraph">평소에 문자열을 가지고 노는 것을 좋아하는 민호는 DNA 문자열을 알게 되었다. </p>



<p class="wp-block-paragraph">DNA 문자열은 모든 문자열에 등장하는 문자가 {‘A’, ‘C’, ‘G’, ‘T’} 인 문자열을 말한다. </p>



<p class="wp-block-paragraph">예를 들어 “ACKA”는 DNA 문자열이 아니지만 “ACCA”는 DNA 문자열이다. </p>



<p class="wp-block-paragraph">이런 신비한 문자열에 완전히 매료된 민호는 임의의 DNA 문자열을 만들고 만들어진 DNA 문자열의 부분문자열을 비밀번호로 사용하기로 마음먹었다.</p>



<p class="wp-block-paragraph">하지만 민호는 이러한 방법에는 큰 문제가 있다는 것을 발견했다. </p>



<p class="wp-block-paragraph">임의의 DNA 문자열의 부분문자열을 뽑았을 때 “AAAA”와 같이 보안에 취약한 비밀번호가 만들어 질 수 있기 때문이다. </p>



<p class="wp-block-paragraph">그래서 민호는 부분문자열에서 등장하는 문자의 개수가 특정 개수 이상이여야 비밀번호로 사용할 수 있다는 규칙을 만들었다.</p>



<p class="wp-block-paragraph">임의의 DNA문자열이 “AAACCTGCCAA” 이고 민호가 뽑을 부분문자열의 길이를 4라고 하자. </p>



<p class="wp-block-paragraph">그리고 부분문자열에 ‘A’ 는 1개 이상, ‘C’는 1개 이상, ‘G’는 1개 이상, ‘T’는 0개 이상이 등장해야 비밀번호로 사용할 수 있다고 하자. </p>



<p class="wp-block-paragraph">이때 “ACCT” 는 ‘G’ 가 1 개 이상 등장해야 한다는 조건을 만족하지 못해 비밀번호로 사용하지 못한다. </p>



<p class="wp-block-paragraph">하지만 “GCCA” 은 모든 조건을 만족하기 때문에 비밀번호로 사용할 수 있다.</p>



<p class="wp-block-paragraph">민호가 만든 임의의 DNA 문자열과 비밀번호로 사용할 부분분자열의 길이, 그리고 {‘A’, ‘C’, ‘G’, ‘T’} 가 각각 몇번 이상 등장해야 비밀번호로 사용할 수 있는지 순서대로 주어졌을 때 </p>



<p class="wp-block-paragraph">민호가 만들 수 있는 비밀번호의 종류의 수를 구하는 프로그램을 작성하자. 단 부분문자열이 등장하는 위치가 다르다면 부분문자열이 같다고 하더라도 다른 문자열로 취급한다.</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">입력</h2>



<p class="wp-block-paragraph">첫 번째 줄에 민호가 임의로 만든 DNA 문자열 길이 |S|와 비밀번호로 사용할 부분문자열의 길이 |P| 가 주어진다. (1 ≤&nbsp;|P| ≤ |S| ≤ 1,000,000)</p>



<p class="wp-block-paragraph">두번 째 줄에는 민호가 임의로 만든 DNA 문자열이 주어진다.</p>



<p class="wp-block-paragraph">세번 째 줄에는 부분문자열에 포함되어야 할 {‘A’, ‘C’, ‘G’, ‘T’} 의 최소 개수가 공백을 구분으로 주어진다. </p>



<p class="wp-block-paragraph">각각의 수는 |S| 보다 작거나 같은 음이 아닌 정수이며 총 합은 |S| 보다 작거나 같음이 보장된다.</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">출력</h2>



<p class="wp-block-paragraph">첫 번째 줄에 민호가 만들 수 있는 비밀번호의 종류의 수를 출력해라.</p>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">예제 입/출력 1</h3>



<div class="wp-block-uagb-container uagb-block-ecb9f492 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-5a2a4110">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">9 8
CCTGGATTG
2 0 1 1</pre>
</div>



<div class="wp-block-uagb-container uagb-block-99e5d95d">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0</pre>
</div>
</div></div>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">예제 입/출력 2</h3>



<div class="wp-block-uagb-container uagb-block-1a4486a4 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-edc25381">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">4 2
GATA
1 0 0 1</pre>
</div>



<div class="wp-block-uagb-container uagb-block-7c5a70a3">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">2</pre>
</div>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">추가예제 입/출력 3</h3>



<div class="wp-block-uagb-container uagb-block-71ca8357 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-b1bd4748">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">9 4
CCTGGATTG
0 0 1 3</pre>
</div>



<div class="wp-block-uagb-container uagb-block-dec598d8">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">0</pre>
</div>
</div></div>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">추가예제 입/출력 4</h3>



<div class="wp-block-uagb-container uagb-block-bda1c3c3 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-8f098227">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">8 3
AAGTCCGA
2 0 1 0</pre>
</div>



<div class="wp-block-uagb-container uagb-block-7fe3ea99">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">1</pre>
</div>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">추가 예제 입/출력 5</h3>



<div class="wp-block-uagb-container uagb-block-4452252d alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-ec7b5546">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">10 2
AAAAAAAAAA
0 0 0 0</pre>
</div>



<div class="wp-block-uagb-container uagb-block-ef7f641b">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">9</pre>
</div>
</div></div>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">추가 예제 입/출력 6</h3>



<div class="wp-block-uagb-container uagb-block-fc839852 alignfull uagb-is-root-container"><div class="uagb-container-inner-blocks-wrap">
<div class="wp-block-uagb-container uagb-block-446d62a4">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">15 4
CGTACGTTAGGACGT
1 1 1 1</pre>
</div>



<div class="wp-block-uagb-container uagb-block-586f7842">
<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">5</pre>
</div>
</div></div>



<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">알고리즘 분류</h2>



<ul class="wp-block-list">
<li><a href="https://www.acmicpc.net/problem/tag/158" target="_blank" rel="noreferrer noopener">문자열</a></li>



<li><a href="https://www.acmicpc.net/problem/tag/68" target="_blank" rel="noreferrer noopener">슬라이딩 윈도우</a></li>
</ul>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">통과된 코드</h2>



<p class="wp-block-paragraph">슬라이딩 윈도우를 이용하여 해결</p>



<p class="wp-block-paragraph">O(n) 시간동안 해결하는 문제 </p>



<pre class="EnlighterJSRAW" data-enlighter-language="cpp" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="false" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;iostream>
using namespace std;

// DNA 문자열 길이 S, 부분 문자열 길이 P, 결과값 Res
int S, P, Res = 0;

// 입력받을 DNA 문자열과 ACGT 타겟 배열 및 현재 ACGT 배열
string DNAstring;
int TargetACGT[4] = { 0 }; 
int CurrentACGT[4] = { 0 };

// DNA 문자에 대응되는 인덱스를 반환하는 함수
int DNAConverter(char _dna){
    switch (_dna) {
        case 'A':
            return 0;
        case 'C':
            return 1;
        case 'G':
            return 2;
        case 'T':
            return 3;
        default:
            return -100; // 예외 상황을 위한 반환값
    }
}

int main() {
    ios_base::sync_with_stdio(0); // C++의 표준 스트림 동기화를 비활성화하여 입출력 성능 향상
    cin.tie(0); // 입출력의 묶음을 풀어줌
    cout.tie(0); // 출력 속도를 높임

    cin >> S >> P >> DNAstring >> TargetACGT[0] >> TargetACGT[1] >> TargetACGT[2] >> TargetACGT[3]; // 입력 받기
    int len = DNAstring.length(); // DNA 문자열 길이 저장
    int _start = 0; // 슬라이딩 윈도우 시작 위치

    // 초기 윈도우 설정: 첫 P개의 문자를 카운팅
    for (int i = 0; i &lt; P; i++)
        CurrentACGT[DNAConverter(DNAstring[i])]++;

    bool isTrue;
    while (_start + P - 1 &lt; len) {
        isTrue = true;
        // 현재 윈도우의 ACGT 개수가 목표값을 만족하는지 확인
        for (int i = 0; i &lt; 4; i++) {
            if (CurrentACGT[i] &lt; TargetACGT[i]) {
                isTrue = false;
                break;
            }
        }
        if (isTrue)
            Res++; // 목표값을 만족하면 결과값 증가

        // 윈도우를 오른쪽으로 한 칸 이동: 첫 번째 문자 제거, 다음 문자 추가
        CurrentACGT[DNAConverter(DNAstring[_start])]--;
        _start++; // 윈도우 시작 위치 증가
        CurrentACGT[DNAConverter(DNAstring[_start + P - 1])]++; // 새로운 문자의 카운트 증가
    }

    cout &lt;&lt; Res; // 결과 출력
    return 0;
}
</pre>



<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>



<figure class="wp-block-image size-full is-resized"><img fetchpriority="high" decoding="async" width="1203" height="184" src="https://lycos7560.com/wp-content/uploads/2024/10/image-16.png" alt="" class="wp-image-38395" style="width:809px;height:auto" srcset="https://lycos7560.com/wp-content/uploads/2024/10/image-16.png 1203w, https://lycos7560.com/wp-content/uploads/2024/10/image-16-300x46.png 300w, https://lycos7560.com/wp-content/uploads/2024/10/image-16-768x117.png 768w" sizes="(max-width: 1203px) 100vw, 1203px" /></figure>



<p class="wp-block-paragraph">슬라이딩 윈도우의 범위를 잘못 지정하여 삽질</p>
<p>The post <a href="https://lycos7560.com/cpp/%eb%b0%b1%ec%a4%80-12891%eb%b2%88-dna-%eb%b9%84%eb%b0%80%eb%b2%88%ed%98%b8-c-baekjoon/38394/">백준 12891번 (DNA 비밀번호, C++) [BAEKJOON]</a> appeared first on <a href="https://lycos7560.com">어제와 내일의 나 그 사이의 이야기</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://lycos7560.com/cpp/%eb%b0%b1%ec%a4%80-12891%eb%b2%88-dna-%eb%b9%84%eb%b0%80%eb%b2%88%ed%98%b8-c-baekjoon/38394/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
