※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18416번 문제인 最長昇順連続部分列 (Longest Ascending Contiguous Subsequence)이다.
문제는 아래 링크를 확인하자.

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

 

18416번: 最長昇順連続部分列 (Longest Ascending Contiguous Subsequence)

長さ N の正整数列 A=(A1, A2, ..., AN) が与えられる.正整数列 A の連続部分列の中で昇順に並んでいるもののうち,最長のものの長さを求めよ. すなわち,Al ≦ Al+1 ≦ ... ≦ Ar を満たすよ

www.acmicpc.net

각 인덱스 i에 대하여 i-1번째 수보다 i번째 수가 더 작다면 i번째 수로 끝나는 [조건을 만족하는 수열]의 길이의 최댓값은 1이고 그렇지 않다면 i-1번째 수로 끝나는 [조건을 만족하는 수열]의 길이의 최댓값에 1을 더한 값이 된다.

 

위와 같은 관계를 이용해 배열의 수를 차례대로 읽어나가며 문제를 해결해주자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N;
int old = -1, ans, combo;

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

	cin >> N;

	while (N--) {
		int x; cin >> x;
		if (x >= old) {
			combo++;
			ans = max(ans, combo);
		}
		else combo = 1;
		
		old = x;
	}

	cout << ans;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 27182 // C++] Rain Diary  (0) 2023.01.15
[BOJ 23320 // C++] 홍익 절대평가  (0) 2023.01.15
[BOJ 15832 // C++] Aku Negaraku  (0) 2023.01.14
[BOJ 18409 // C++] 母音を数える (Counting Vowels)  (0) 2023.01.14
[BOJ 18411 // C++] 試験 (Exam)  (0) 2023.01.14

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18409번 문제인 母音を数える (Counting Vowels)이다.
문제는 아래 링크를 확인하자.

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

 

18409번: 母音を数える (Counting Vowels)

長さ N の英小文字からなる文字列 S が与えられる.S のうち母音字の個数,つまり a,i,u,e,o の個数の総和を求めよ.

www.acmicpc.net

주어지는 문자열의 각 문자를 읽어나가면서 해당 글자가 모음인지, 즉 'a', 'e', 'i', 'o', 'u'인지를 확인해 문제를 해결하자.

 

아래와 같이 각 글자가 모음인지의 여부를 나타내는 배열을 만들면 구현을 간편하게 할 수 있다.

 

아래는 제출한 소스코드이다.

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

bool v[128];
int N, ans;
string s;

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

	v['a'] = v['e'] = v['i'] = v['o'] = v['u'] = 1;

	cin >> N >> s;
	for (auto l : s) {
		if (v[l]) ans++;
	}

	cout << ans;
}
728x90

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18411번 문제인 試験 (Exam)이다.
문제는 아래 링크를 확인하자.

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

 

18411번: 試験 (Exam)

JOI 君は情報の試験を 3 回受けた.試験の点数はすべて 0 以上 100 以下の整数である. JOI 君の成績は 3 回の試験の点数のうち高い方から 2 つを足し合わせた合計によって決まる. 3 回

www.acmicpc.net

주어진 세 수중 가장 큰 두개의 수를 합쳐 출력하는 문제이다.

 

길이 3의 배열에 세 수를 입력받고 배열을 정렬시켜 문제를 손쉽게 해결해주자.

 

아래는 제출한 소스코드이다.

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

int arr[3];

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

    for (int i = 0; i < 3; i++) cin >> arr[i];
    sort(arr, arr + 3);

    cout << arr[1] + arr[2];
}
728x90

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18414번 문제인 X に最も近い値 (The Nearest Value)이다.
문제는 아래 링크를 확인하자.

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

 

18414번: X に最も近い値 (The Nearest Value)

整数 X, L, R が与えられる. L 以上 R 以下の整数のうち,X との差の絶対値が最も小さいものを出力せよ.そのような整数はちょうど 1 つだけ存在することが証明できる.

www.acmicpc.net

X가 L보다 작다면 문제의 답은 L, R보다 크다면 문제의 답은 R이 됨을 관찰하자. 이에 해당되는 경우가 없다면 X의 값은 L 이상 R 이하이므로 문제의 답은 X가 된다.

 

위의 관찰을 코드로 작성해 문제를 해결하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int X, L, R;

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

	cin >> X >> L >> R;
	if (X < L) cout << L;
	else if (X > R) cout << R;
	else cout << X;
}
728x90

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18415번 문제인 キャピタリゼーション (Capitalization)이다.
문제는 아래 링크를 확인하자.

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

 

18415번: キャピタリゼーション (Capitalization)

JOI 君は長さ N の文字列 S を見つけた.S に含まれる文字はすべて英小文字である. JOI 君はこの文字列から自分の名前である joi が連続している部分を先頭から順にすべて探しだすこと

www.acmicpc.net

소문자로 이루어진 문자열이 주어질 때, 모든 "joi"와 일치하는 부분문자열을 "JOI"로 바꾸어 출력하는 문제이다.

 

substr 메소드를 이용해 주어진 문자열의 모든 세 글자 부분문자열을 확인하고 "joi"를 "JOI"로 바꾸어 문제를 해결하자.

 

여담으로, "joi"는 서로 다른 문자들로 구성되어있으므로 서로 다른 두 "joi"가 겹쳐있거나 하는 일을 걱정할 필요는 없다.

 

아래는 제출한 소스코드이다.

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

int slen;
string s;

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

	cin >> slen >> s;

	for (int i = 2; i < slen; i++) {
		if (s.substr(i - 2, 3) == "joi") {
			s[i - 2] = 'J';
			s[i - 1] = 'O';
			s[i] = 'I';
		}
	}

	cout << s;
}
728x90

※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 18413번 문제인 最頻値 (Mode)이다.
문제는 아래 링크를 확인하자.

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

 

18413번: 最頻値 (Mode)

数列 B1, B2, B3 は 2, 1, 1 となり,これらの最大値は 2 である.

www.acmicpc.net

주어지는 N개의 수 중 가장 많이 등장하는 수의 그 개수를 출력하는 문제이다.

 

등장하는 수가 M 이하이므로, 크기 M의 배열을 준비해 각 수가 등장한 수의 횟수를 세는 것으로 문제를 해결할 수 있다.

 

N과 M의 크기가 충분히 작게 주어지므로, 주어지는 N개의 수를 M회 반복해 살펴보면서 한번 살필 때마다 각 수가 몇 개씩 있는지를 세어보는 알고리즘으로도 문제를 해결할 수 있을 것이다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int N, M;
int cnt[101];
int ans;

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

	cin >> N >> M;
	while (N--) {
		int x; cin >> x;
		cnt[x]++;
	}

	for (int i = 1; i <= M; i++) ans = max(ans, cnt[i]);

	cout << ans;
}
728x90

+ Recent posts