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

 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

 

#코드

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

int alph[26];

int    main(void)
{
    string s;
    cin >> s;
    for (auto c : s)
        alph[c - 'a']++;
    for (auto n : alph)
        cout << n << ' ';
}

 

#설명

알파벳을 저장할 배열을 전역에 선언합니다. (배열을 전역에 선언하면 배열의 원소들이 자동으로 0으로 초기화됩니다.)

알파벳 소문자 a ~ z 까지 총 26개를 저장하기 위해 크기는 26으로 선언했습니다.

 

for문에서 string (char 타입 배열)의 원소들, 즉 알파벳에 하나씩 접근하면서 

알파벳의 순서에 해당하는 인덱스의 값을 증가시켜줍니다. 

( 알파벳 소문자는 아스키코드 상에서 97 ~ 122이기 때문에 97(='a')을 빼서 0 ~ 26 사이의 숫자로 바꿔주었습니다. )

 

그리고 나서 배열 alpha의 원소들을 공백으로 구분해 하나씩 출력해주면 됩니다. 

 

 

 

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

 

4949번: 균형잡힌 세상

문제 세계는 균형이 잘 잡혀있어야 한다. 양과 음, 빛과 어둠 그리고 왼쪽 괄호와 오른쪽 괄호처럼 말이다. 정민이의 임무는 어떤 문자열이 주어졌을 때, 괄호들의 균형이 잘 맞춰져 있는지 판단

www.acmicpc.net

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

stack<char> stck;

void	print_result(int is_balanced)
{
	if (is_balanced)
		cout << "yes\n";
	else
		cout << "no\n";
}

int		find_match(char c)
{
	if (stck.empty())
		return (0);
	if ((c == ')' && stck.top() == '(') ||
		(c == ']' && stck.top() == '['))
	{
		stck.pop();
		return (1);
	}
	return (0);
}

int		main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int flag;

	while (1)
	{
		string s;
		flag = 1;
		while (!stck.empty()) stck.pop();
		getline(cin, s);
		if (s == ".")
			break ;
		for (auto c : s)
		{
			if (c == '(' || c == '[')
				stck.push(c);
			else if (c == ')' || c == ']')
			{
				if (!find_match(c))
				{
					flag = 0;
					break ;
				}
			}
		}
		if (stck.empty() && flag)
			print_result(1);
		else
			print_result(0);
	}
}

 

문제 풀 때 참고한 글

https://twpower.github.io/75-how-to-use-stack-in-cpp

 

[C++] C++ STL stack 기본 사용법과 예제

Practice makes perfect!

twpower.github.io

 

 

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

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지 �

www.acmicpc.net

 

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

int	stac[10001];
int	pos = 0;

void		print_is_empty()
{
	if (pos == 0)
		cout << 1 << '\n';
	else
		cout << 0 << '\n';
}

void		print_top()
{
	int top;

	if (pos == 0)
		cout << -1 << '\n';
	else
		cout << stac[pos - 1] << '\n';
}

void		push(int X)
{
	stac[pos] = X;
	pos++;
}

void		pop()
{
	if (pos == 0)
		cout << -1 << '\n';
	else
	{
		cout << stac[pos - 1] << '\n';
		pos--;
	}
}

void		print_size()
{
	cout << pos << '\n';
}

void		check_order(string order)
{
	if (order == "pop")
		pop();
	else if (order == "size")
		print_size();
	else if (order == "empty")
		print_is_empty();
	else
		print_top();
}

int			main(void)
{
	int		N;
	int		X;
	string	order = "";

	cin >> N;
	for (int i = 0; i < N; i++)
	{
		cin >> order;
		if (order == "push")
		{
			cin >> X;
			push(X);
		}
		else
			check_order(order);
	}
	return (0);
}

 

문제 링크

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

 

2577번: 숫자의 개수

첫째 줄에 A, 둘째 줄에 B, 셋째 줄에 C가 주어진다. A, B, C는 모두 100보다 같거나 크고, 1,000보다 작은 자연수이다.

www.acmicpc.net

 

풀이

#include <stdio.h>

int main() {
    int a, b, c;
    int arr[10] = {0, };
    scanf("%d %d %d", &a, &b, &c);
    int n = a*b*c;
    
    int num;
    while(n>0) {
        num = n%10;
        arr[num]++;
        n /= 10;
    }
    
    for(int i=0; i<10; i++) {
        printf("%d\n", arr[i]);
    }
    
    return 0;
}

정수를 자릿수에 따라 쪼개야할 때는 10으로 나눗셈/나머지연산을 하면 간단하게 처리할 수 있다.

배열 arr은 while문에서 값을 새로 할당하는 것이 아니라 원래 값을 증가시키기 때문에(증감 연산자 사용)

선언할 때 0으로 초기화를 해두어야한다. 

 

배열 0으로 초기화하기 : https://dojang.io/mod/page/view.php?id=294

(C언어 코딩 도장 36.2 배열을 0으로 초기화하기)

 

문제 링크 : https://www.acmicpc.net/problem/1110

 

1110번: 더하기 사이클

0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자. 26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 =

www.acmicpc.net

 

풀이

#include  

int main() { 
    int n; 
    int a, b, c; 
    int cycle = 0; 
    int comp; 
    c = -1; 
     
    scanf("%d", &n); 
    comp = n; 
     
    do { 
        a = n/10; 
        b = n%10; 
        c = a + b; 
        n = b*10 + c%10; 
        cycle++; 
    } while (n!=comp); 
     
    printf("%d", cycle); 
    return 0; 
}

그렇게 깔끔하진 못한 것 같다. 그래도 맞다고 나오기는 했다. 

 

숫자를 자릿수에 따라 쪼개려면 나눗셈과 나머지연산을 이용하면 된다. 

 

주어진 수가 26일 때, 

주어진 수를 10으로 나눠 10의 자리를 구하고 (26/10 = 2),

주어진 수를 10으로 나눴을 때의 나머지를 구해 1의 자리를 구하면 된다. (26%10 = 6)

 

주어진 수가 두 자리수가 아닐 때도 같은 방법으로 하면 된다.

주어진 수가 9라면, 

9/10 = 0

9%10 = 9 이므로 문제에서 요구하는 조건을 만족한다. 

(문제 : 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. )

 

 

 

+ Recent posts