inflearn logo
강의

Course

Instructor

Java Coding Test - IT Conglomerate Problem Set

5. "Longest Bitonic Subsequence" Code Explanation

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

310

dnwls4884491

7 asked

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 코딩-테스트

Answer 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

216

1

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

0

162

1

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

0

284

2

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

0

244

1

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

0

298

1