인프런 커뮤니티 질문&답변

youch1127님의 프로필 이미지

작성한 질문수

it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비

23. 연속 부분 증가수열

질문있습니다.

24.07.04 14:40 작성

·

95

·

수정됨

0

입력을 받을 때마다 조건문 돌려서 판별할 생각을 못하고 배열로 다 받아서 했더니 문제를 더 어렵게 풀어버렸습니다. 음.. 강의 코드 보면서 제가 푼 문제가 이렇게 쉽게 풀릴 수 있는 문제구나라고 알게 되었습니다.혹시 제 코드에 문제점이 있는지 확인해주실 수 있으신가요? 채점 파일에서는 다 맞았다 뜨는데 혹시 몰라서 질문 드립니다. 좋은 강의 항상 감사드립니다. 강의 보면서 열심히 공부하겠습니다.

#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);

	int n;
	cin >> n;
	
	vector<int> table(n);
	for (int i = 0; i < n; i++)
		cin >> table[i];

	int max = 1;
	int cnt = 1;
	int idx = 0;
	int prev = table[0];
	int count = 1;

	while (idx + count < table.size()) {
		if (table[idx + count] >= prev) {
			cnt++;
		}
		else {
			idx = idx + count;
			cnt = 1;
			count = 0;
		}
		prev = table[idx + count];
		count++;

		if (cnt > max)
			max = cnt;
	}

	cout << max << "\n";

	return 0;
}

답변 2

1

김태원님의 프로필 이미지
김태원
지식공유자

2024. 07. 08. 06:02

안녕하세요^^

잘 하신 코드입니다.

코드가 아래와 같이 조금 개선했으면 좋겠습니다.

#include <iostream>
#include <stdio.h>
#include <string>
#include <fstream>
#include <vector>

using namespace std;

int main() {
	ios_base::sync_with_stdio(false);

	int n;
	cin >> n;
	
	vector<int> table(n);
	for (int i = 0; i < n; i++)
		cin >> table[i];

	int max = 1;
	int cnt = 1;
	int idx = 1;
	int prev = table[0];

	while (idx < n) {
		if (table[idx] >= prev) {
			cnt++;
		}
		else cnt = 1;
		prev = table[idx];
		idx++;

		if (cnt > max)
			max = cnt;
	}

	cout << max << "\n";

	return 0;
}
youch1127님의 프로필 이미지
youch1127
질문자

2024. 07. 08. 16:06

감사합니다

1

인프런 AI 인턴님의 프로필 이미지

2024. 07. 06. 14:46

안녕하세요, 인프런 AI 인턴입니다.

youch1127님의 코드를 살펴본 결과, 전체적인 로직은 잘 구현되어 있습니다. 입력을 받아 배열로 저장한 후, 연속하여 증가하는 수열의 최대 길이를 찾는 문제 해결 방식에 대해 적절히 접근하셨습니다. 다만, 코드의 효율성과 가독성을 더욱 향상시킬 수 있는 몇 가지 제안을 드리고자 합니다.

  1. 변수 초기화 위치: cntmax의 초기화 위치가 적절합니다. 하지만 idx, prev, count의 경우, 루프의 맨 앞에서 초기화하거나 업데이트하는 것이 루프의 동작을 이해하기 쉬울 수 있습니다.

  2. 불필요한 변수 제거: 현재 코드에서 count 변수는 항상 1씩 증가하기만 하므로, 실제로는 idx + 1의 역할과 같습니다. 따라서 count 변수를 제거하고 필요한 부분에서 idx + 1을 사용하는 것이 코드를 간결하게 만들 수 있습니다.

  3. 효율성 개선: 매번 table.size()를 호출하는 것보다, 배열의 크기를 n이나 다른 변수에 저장해 두고 사용하는 편이 좋습니다. 매번 함수를 호출하는 것은 작은 오버헤드를 발생시킬 수 있기 때문입니다.

  4. 가독성 향상: 변수 이름을 좀 더 명확하게 지어줌으로써 코드의 의도를 더 명확히 전달할 수 있습니다. 예를 들어, max 대신 maxLen이라고 하거나, cnt 대신 currentLen 등으로 명명합니다.

  5. 범위 기반 for 루프를 고려하세요: C++11 이상에서는 범위 기반 for 루프를 사용하여 컨테이너의 모든 요소를 쉽고 안전하게 순회할 수 있습니다. 이 경우에는 해당되지 않지만, 전체 배열을 순회하는 다른 상황에서 유용하게 사용할 수 있습니다.

코드 최적화에 있어 중요한 것은 정답을 찾는 것만큼이나 효율적이고 가독성이 좋은 코드를 작성하는 것입니다. youch1127님의 노력과 열정에 박수를 보내며, 계속해서 멋진 학습을 이어가시길 바랍니다.

좋은 강의에 대한 칭찬과 함께 열심히 공부하겠다는 긍정적인 태도도 인상적입니다. 프로그래밍 학습 과정에서 발생하는 궁금증이나 문제에 대해 언제든지 질문해 주세요. 더 나은 프로그래머가 되기 위한 여정에 도움이 될 수 있도록 지원하겠습니다.