[백준] 1436번. 영화감독 숌

leeeha·2021년 9월 23일
0

백준

목록 보기
5/186
post-custom-banner

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

문제

종말의 숫자란 어떤 수에 6이 "적어도 3개 이상 연속으로" 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.

따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.

숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.

입력

첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.

출력

첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.


풀이1: 입력값을 숫자로 인식

https://cocoon1787.tistory.com/155

#include<iostream>
using namespace std;

int main()
{
	// 몇번째 종말의 수를 구할지 입력 받기
	int N;
	cin >> N;

	int num = 665;
	int cnt = 0;
	int temp; 

	// N번째 종말의 수를 구할 때까지 반복
	while (cnt != N) { 
		num++; // 666부터 1씩 증가시키면서 종말의 수 찾기

		// 종말의 수를 찾아보자!
		temp = num;
		while (temp != 0) {
			// 종말의 수일 경우 cnt++
			if (temp % 1000 == 666) {
				cnt++; 
				break;
			}
			else {
				temp /= 10;
			}
		}

		/*  내부 루프 탈출
		Case1. 종말의 수 발견해서 break한 경우
		1) cnt == N이라면, 외부 루프도 탈출하여 종말의 수 출력
		2) cnt != N이라면 'N번째에 맞는' 종말의 수를 구하기 위해 다시 num 증가시키기

		Case2. temp == 0이 된 경우
		cnt != N인 상태에서 종말의 수를 구할 때까지 num 증가시키기
		*/
	}

	// N번째에 해당하는 종말의 수 출력하기
	cout << num;

	return 0;
}

풀이2: 입력값을 문자열로 인식

https://j3sung.tistory.com/224

string의 find 함수에 대해 알아보자!

https://www.cplusplus.com/reference/string/string/find/

string (1)
size_t find(const string& str, size_t pos = 0) const noexcept;

c-string (2)
size_t find(const char* s, size_t pos = 0) const;

buffer (3)
size_t find(const char* s, size_t pos, size_type n) const;

character (4)
size_t find(char c, size_t pos = 0) const noexcept;

문자열 내에서 특정한 부분 문자열을 찾고 싶을 때 사용한다. pos를 지정하면, pos 혹은 그 이후의 인덱스에 대해서만 검색을 진행한다. 당연히 문자 하나만 일치하면 안 되고, 인자로 전달한 문자열과 완전히 일치해야 한다.

1. 매개변수

  • str: 검색하려는 부분 문자열
  • pos: 검색을 시작할 위치 (이 값이 문자열 길이보다 크다면, 일치하는 문자열을 찾을 수 없다. 기본은 인덱스 0부터 검색한다.)
  • s: 문자 배열을 가리키는 포인터
    (3)번처럼 n이 지정되어 있으면, 일치시킬 시퀀스는 배열의 처음 n개 문자이다. 반면에 (2)번처럼 n이 지정되어 있지 않으면, null로 끝나는 시퀀스가 예상된다. 일치하는 시퀀스의 길이는 null 문자가 처음 발생하는 지점에 의해 결정된다.
  • n: 일치하는 문자 시퀀스의 길이

2. 리턴값

검색하려는 문자열의 첫번째 문자의 위치를 리턴한다. 문자열을 발견하지 못 하면, std::string::npos를 리턴한다.

static const size_t npos = -1;

npos는 size_t 타입의 최댓값을 갖는 상수이다. size_t는 부호 없는 정수 타입이므로 -1은 이 타입에서 가장 큰 값을 나타낸다. 이 값이 len함수의 인자로 사용되면 그것은 "문자열의 끝까지"를 의미한다. 반면에, 리턴값으로 사용되면 "일치하는 값이 없음"을 의미한다.

3. 예제

// string::find
#include <iostream> // std::cout
#include <string>   // std::string

int main()
{
    std::string str("There are two needles in this haystack with needles.");
    std::string str2("needle");

    // different member versions of find in the same order as above:
    std::size_t found = str.find(str2);
    if (found != std::string::npos)
        std::cout << "first 'needle' found at: " << found << '\n';

    found = str.find("needles are small", found + 1, 6);
    if (found != std::string::npos)
        std::cout << "second 'needle' found at: " << found << '\n';

    found = str.find("haystack");
    if (found != std::string::npos)
        std::cout << "'haystack' also found at: " << found << '\n';

    found = str.find('.');
    if (found != std::string::npos)
        std::cout << "Period found at: " << found << '\n';

    // let's replace the first needle:
    str.replace(str.find(str2), str2.length(), "preposition");
    std::cout << str << '\n';

    return 0;
}

find 함수 이용해서 1436번 풀기

#include <iostream>
#include <string>
using namespace std;

int main()
{
	// 몇번째 종말의 수를 구할지 입력 받기
	int N;
	cin >> N;

	int num = 665;
	int cnt = 0;

	// N번째 종말의 수를 구할 때까지 반복
	while (cnt != N) {
		num++; // 666부터 검색 시작

		// 666이 포함된 종말의 수를 발견하면
		if (to_string(num).find("666") != string::npos) {
			cnt++; // cnt == N이 되면 루프 탈출해서 결과 출력
		}
		// 종말의 수가 아닐 경우, num++하면서 검색 반복하기
	}

	// N번째 종말의 수 출력하기
	cout << num;

	return 0;
}
profile
습관이 될 때까지 📝
post-custom-banner

0개의 댓글