Post

[백준BOJ1157 C++] 단어 공부

[백준BOJ1157 C++] 단어 공부

문제

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


풀이

  1. 알파벳 대소문자로 이루어진 단어

    아스키 코드로 이용해서 대문자, 소문자에 따라 특정 값을 구한다.

  2. 단어의 길이는 1,000,000을 넘지 않는다

    char은 -128~+127 저장하기 때문에 string을 사용해야 된다.

  3. 가장 많이 사용된 알파벳을 대문자로 출력한다.

    먼저 1번에서 아스키코드로 통해 알파벳 순서 값을 구한다. 이후 알파벳 배열(크기:26)에 해당하는 순서값의 인덱스에 +1 씩 더한 후, 가장 많이 사용된 알파벳을 대문자로 출력하기 위해서 max 값에 해당하는 인덱스를 아스키 코드로 이용해서 대문자로 출력하게 만든다.

  4. 가장 많이 사용된 알파벳이 여러 개 존재하면 ?를 출력한다.

    갱신되고 있는 max값과 같은 값이 발견될 경우 ?를 출력하도록 작성한다.


제출

#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	string c;
	int a[26] = { 0 };
	int max = 0;
	char r = '?';

	cin >> c;

	for (size_t i = 0; i < c.length(); i++) {
		if (c[i] > 64 && c[i] < 91) a[c[i] - 'A'] += 1;
		if (c[i] > 96 && c[i] < 123) a[c[i] - 'a'] += 1;
	}


	for (int i = 0; i < 26; i++) {
		if (a[i] != 0) {
			if (a[i] == max) r = '?';
			else if (a[i] != 0 && a[i] > max) {
				max = a[i];
				r = char(i + 'A');
			}
		}
	}

	cout << r;
}

제출했던 오답코드

이전에는 max값을 가장 많이 사용된 알파벳 순서에 해당하는 인덱스에 할당했다. 예를 들면 Z가 많이 나오면, 0~25 중 25번째에 해당하기 때문에 max에 25를 넣는 방식이었다.

또한 출력값을 따로 char 변수에 할당하지 않고, 인덱스값을 받은 max+’A’를 즉석에서 char 타입으로 변환시키고 ?가 나오는 경우에는 바로 return 0;으로 끝내도록 했다.

#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	string c;
	int a[26] = { 0 };
	int max = 0;

	cin >> c;

	for (int i = 0; i < c.length(); i++) {
		if (c[i] > 64 && c[i] < 91) a[c[i] - 'A'] += 1;
		if (c[i] > 96 && c[i] < 123) a[c[i] - 'a'] += 1;
	}


	for (int i = 1; i < 26; i++) {
		if (a[i] != 0 && a[i] == a[max]) {
			cout << "?";
			return 0;
		}
		if (a[i] != 0 && a[i] > a[max]) max = i;
	}

	cout << char(max + 'A');
}

그러나 이 방법으로 할 경우 반례로 ‘abcc’에서 C가 아닌 ? 가 나오게 된다. 왜냐하면 a, b 각각 인덱스 0, 1에서 값 1이 발견되기 때문에 순서대로 max 계산을 하면 a[max] = a[i]가 모두 1 로 값이 같기 때문에 더이상 계산하지 않고 자동으로 ‘?’가 나오게 된다. 따라서 return 0을 제거했다.

위와 같은 문제로 return 0을 제거하면 이젠 ‘?’가 출력된 후에 cout « char(max + ‘A’);가 또 출력되는 문제가 발생한다. 따라서 char 타입의 변수를 초기화한 상태로 부른 후에 변수에 ‘?’ 혹은 char(i + ‘A’)를 받는 과정으로 바꾸고 max는 i 인덱스가 받은 값(알파벳이 나온 횟수)를 받도록 바꾸어 최종제출을 했다.


메모

  • length()는 strlen 함수와 다르게 1번만 호출되기 때문에 for문에 사용할 수 있지만 size_t 타입을 반환하기 때문에 int i가 아닌 size_t i로 작성해야 된다.
  • char 변수도 초기화가 필요하다.
This post is licensed under CC BY 4.0 by the author.