[백준] 10809번. 알파벳 찾기

leeeha·2021년 9월 30일
0

백준

목록 보기
10/185

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

내 풀이

가장 일반적인 경우를 디폴트로 생각하자.
단어에 포함된 알파벳들의 인덱스를 기억해서 그 위치를 출력하고, 나머지는 -1을 출력한다고 생각하지 말고!!
일단 모든 알파벳을 -1로 설정해두고, 단어에 포함되는 문자일 경우에만 -1을 다른 인덱스 값으로 바꾼다고 생각하자!

// 10809번. 알파벳 찾기
#include <iostream>
#include <string>
using namespace std;

struct Alphabet {
	char ch;
	int idx;
};

int main() {
	Alphabet alpha[26];

	for (int i = 0; i < 26; i++){
		alpha[i].ch = 'a' + i;
		alpha[i].idx = -1;
	}

	string str;
	cin >> str;

	for (unsigned int i = 0; i < str.length(); i++) {
		for (int j = 0; j < 26; j++) {
			// str[i]는 고정된 상태에서, alpha[j].ch는 a~z까지 변화
			// 해당하는 알파벳을 발견하면 그 알파벳의 -1을 str[i]의 i로 변경하기
			if (str[i] == alpha[j].ch) {
				// 단, -1이 아닌 경우는 이미 등장했던 문자이므로 
				// 인덱스 업데이트 없이 넘어가기
				if (alpha[j].idx == -1) {
					alpha[j].idx = i;
				}
			}
		}
	}
	
	for (int i = 0; i < 26; i++) {
		cout << alpha[i].idx << " ";
	}

	return 0;
}

find 함수를 이용한 풀이

https://cryptosalamander.tistory.com/11

find 함수 설명: https://velog.io/@jxlhe46/백준-1436번.-영화감독-숌
find함수는 검색하려는 문자열의 첫번째 문자의 위치를 리턴한다. 문자열을 발견하지 못 하면, std::string::npos를 리턴한다.

static const size_t npos = -1;

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

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

int main() {
	string a = "abc";
	cout << a.find('a') << '\n';
	cout << a.find('b') << '\n';
	cout << a.find('c') << '\n';
	cout << (int)a.find('d') << '\n';
	return 0;
}

/* 
	find의 기본 리턴형은 size_t (unsigned int)
	0
	1
	2
	4294967295 // unsigned int형에서 -1은 최댓값을 나타냄.

	(signed) int형으로 형변환하면?
	0
	1
	2
	-1
*/

언더플로우와 오버플로우: https://dojang.io/mod/page/view.php?id=32

// 10809번. 알파벳 찾기
#include <iostream>
#include <string>
using namespace std;

int main() {
    string alphabet = "abcdefghijklmnopqrstuvwxyz";

    string str;
    cin >> str;

    for (int i = 0; i < alphabet.length(); i++) {
        // str에서 i번째 알파벳을 발견하면, 발견한 그 위치를 출력하기
        // 한 단어에 같은 문자가 여러 번 나오더라도
        // find 함수는 앞에서부터 탐색을 하니까 문자를 처음 발견한 위치를 출력한다.
        cout << (int)str.find(alphabet[i]) << " ";
    }

    return 0;
}
profile
Keep Going!

0개의 댓글