https://www.acmicpc.net/problem/1436
종말의 숫자란 어떤 수에 6이 "적어도 3개 이상 연속으로" 들어가는 수를 말한다. 제일 작은 종말의 숫자는 666이고, 그 다음으로 큰 수는 1666, 2666, 3666, .... 과 같다.
따라서, 숌은 첫 번째 영화의 제목은 세상의 종말 666, 두 번째 영화의 제목은 세상의 종말 1666 이렇게 이름을 지을 것이다. 일반화해서 생각하면, N번째 영화의 제목은 세상의 종말 (N번째로 작은 종말의 숫자) 와 같다.
숌이 만든 N번째 영화의 제목에 들어간 숫자를 출력하는 프로그램을 작성하시오. 숌은 이 시리즈를 항상 차례대로 만들고, 다른 영화는 만들지 않는다.
첫째 줄에 숫자 N이 주어진다. N은 10,000보다 작거나 같은 자연수이다.
첫째 줄에 N번째 영화의 제목에 들어간 수를 출력한다.
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;
}
https://j3sung.tistory.com/224
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 혹은 그 이후의 인덱스에 대해서만 검색을 진행한다. 당연히 문자 하나만 일치하면 안 되고, 인자로 전달한 문자열과 완전히 일치해야 한다.
검색하려는 문자열의 첫번째 문자의 위치를 리턴한다. 문자열을 발견하지 못 하면, std::string::npos를 리턴한다.
static const size_t npos = -1;
npos는 size_t 타입의 최댓값을 갖는 상수이다. size_t는 부호 없는 정수 타입이므로 -1은 이 타입에서 가장 큰 값을 나타낸다. 이 값이 len함수의 인자로 사용되면 그것은 "문자열의 끝까지"를 의미한다. 반면에, 리턴값으로 사용되면 "일치하는 값이 없음"을 의미한다.
// 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;
}
#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;
}