inflearn logo
강의

Khóa học

Chia sẻ kiến thức

Bài kiểm tra lập trình Java - Chủ đề doanh nghiệp IT lớn

5. Giải thích code "dãy số bitonic có độ dài tối đa"

5. "최대 길이 바이토닉 수열" 에서 설명해주신 방법과 제가 직접 구현한 방법이 달라, 확인 한번 부탁드립니다

310

dnwls4884491

7 câu hỏi đã được viết

0

안녕하세요 수업 강의를 보다가, 풀어주신 방법이 저와 다르고 for 문 하나만으로 해결이 가능하지 않나 싶어서 확인차 질문 드려봅니다.

pdf 상의 정답은 모두 맞춘 상태입니다. 간단하게 하라도 피드백 주신다면 감사합니다

class Solution5 {
	public static int solution(int[] nums){

		// answer : 정답
		// len : 현재 수열 길이
		// d : 현재 수열의 방향 ( 0: 증가, 1: 감소)
		// prevNum : 이전 숫자
		 
		int answer = 0, len = 0, d = 0, prevNum = Integer.MIN_VALUE;
		
		for (int num : nums) {

			if (d == 0) {
				// 1. 현재 수열이 증가하고 있는 상황

				// 2. 수열이 증가하고 있는 상황에서의 시뮬레이션
				if (prevNum > num) {
					// 이전 숫자보다 작을 경우, 수열의 방향을 감소로 변경
					d = -1;	
				} else if (prevNum == num) {
					// 이전 숫자와 값이 같을 경우, 바이토닉 수열이 아니므로 길이 초기화
					len = 0;
				}

				// 길이 증가
				len++;
			} else {
				// 1. 현재 수열이 감소하고 있는 상황

				// 2. 수열이 감소하고 있는 상황에서의 시뮬레이션
				if (prevNum > num) {
					// 2-1. 이전 숫자보다 작을 경우, 길이 증가
					len++;	
				} else {
					// 2-2. 이전 숫자보다 크거나, 같을 경우 수열이 끝났다고 판단

					// 2-2-1. 현재까지의 길이를 계산하여 더 길면 정답으로 변경
					if (answer < len) {
						answer = len;
					}

					// 2-2-2. 초기화
					len = 1; // 현재 숫자부터 다시 시작하므로 값은 1
					d = 0;

					// 2-2-3. 현재 숫자 이전의 값을 비교했을 때, 증가하고 있었다면 길이 하나 증가
					if (prevNum < num) {
						len++;
					}
				}
			}
			
			prevNum = num;
		}

		// 현재 진행중이던 수열이 감소하고 있고 길이가 정답보다 크다면, 정답으로 변경
		if (answer < len && d == -1) {
			answer = len;
		}
				
		return answer;	
	}

	public static void main(String[] args){
		Solution5 T = new Solution5();
		System.out.println(Solution5.solution(new int[]{1, 2, 1, 2, 3, 2, 1}));
		System.out.println(Solution5.solution(new int[]{1, 1, 2, 3, 5, 7, 4, 3, 1, 2}));
		System.out.println(Solution5.solution(new int[]{3, 2, 1, 3, 2, 4, 6, 7, 3, 1}));
		System.out.println(Solution5.solution(new int[]{1, 3, 1, 2, 1, 5, 3, 2, 1, 1}));
	}
}

java 코딩-테스트

Câu trả lời 1

0

communityai8509

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

코드 잘 확인하였습니다. 꾸준히하면언젠간님의 구현 방식도 올바른 방향성을 가지고 있습니다. 바이토닉 수열의 특성에 맞게 증가 상황과 감소 상황을 나누어 처리하고, 방향 전환 시점을 적절히 파악하여 상태를 전환하는 로직을 구현하셨네요.

올려주신 코드대로라면 수열을 한 번의 순회로 바이토닉 수열의 최대 길이를 알아낼 수 있습니다. lend를 이용하여 현재 수열의 길이와 바이토닉 상태를 관리하고 있으며, 증가 혹은 감소 상황에 따라 조건을 처리하는 방식이 잘 구현되어 있습니다.

다만, 주어진 문제의 조건이나 강의에서 제시된 방법론과 차이가 있다면 해당 방법론에 대해서도 이해하고 있는 것이 추후 유사 문제에 대한 접근법을 다양화하는데 도움이 될 것입니다.

각 경우의 수에 대한 조건 처리가 잘 되어 있으나 논리적으로 맞는지 한번 더 검토해 보시고, 가능하다면 몇 가지 테스트 케이스를 추가하여 꼼꼼히 검증해 보시길 권장합니다.

좋은 질문 감사합니다. 추가적인 궁금증이 있다면 언제든 문의해 주세요!

비밀번호

0

65

1

과일 가져가기 이러한 경우에는 반례가 생기지 않나요?

0

161

2

cpu 스케줄링

0

105

2

외부 문제 질문

0

122

2

가장 많이 사용된 회의실

0

117

2

심사위원 문제 시간복잡도 질문

0

127

1

현관문 출입순서

0

96

1

미로의 최단거리 통로

0

74

1

집으로 이동 문제 코드

0

124

1

채점 사이트 개설

0

161

2

송아지를 잡자

1

110

1

다익스트라 + 환승횟수

0

135

2

문제풀이 해설 질문입니다.

0

124

2

"이동 횟수" 문제가 변형된다면?

0

155

2

예제 3번의 정답이 이해가 되지 않아요 선생님 ㅜㅜ

0

248

1

"비밀번호" 문제 확인 부탁드립니다!

0

170

1

최대 길이 연속수열 질문

0

192

1

잃어버린 강아지 문제 count 관련 질문있습니다

0

202

1

바둑대회 질문입니당

0

221

1

알파코드 풀이질문입니다

0

217

1

7번 비밀 번호 문제에 시간복잡도가 궁금합니다!

0

163

1

혹시 이렇게 작성해도 괜찮나요?

0

285

2

문제풀이 확인 부탁드립니다.

0

244

1

혼자서 푼 문제 확인 부탁드립니다.

0

299

1