Notice
Recent Posts
Recent Comments
Link
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

Ryureka

m 본문

카테고리 없음

m

Ryureka 2023. 12. 15. 09:41

https://school.programmers.co.kr/learn/courses/30/lessons/150369

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

위 링크에 있는 문제를 풀면서 제가 공부했던 내용을 다시 상기시킬 목적으로 작성한 글입니다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number == 5){
				answer += 5; // 5를 (10 - number)로 생각하면 아래 else if문과 중복된 코드
				if(i-1 >= 0 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
			} else if(number > 5) {
				answer += (10 - number);                
				if(i-1 >= 0) { 
					numbers[i-1]++;
				}
			} else {
				answer += number;
			}    
		}

		return answer;
	}

가장 짧은 부분인 else 문에 해당하는 부분을 if 문으로 변경하여 조건을 명시한 후 맨 위로 올린다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
			} else if(number == 5){
				answer += 5; // 5를 (10 - number)로 생각하면 아래 else if문과 중복된 코드
				if(i-1 >= 0 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
			} else {
				answer += (10 - number);                
				if(i-1 >= 0) { 
					numbers[i-1]++;
				}
			}    
		}

		return answer;
	}

number < 5인 경우 answer += number 말고는 for문 내에 더 실행할 명령이 없으므로

continue를 사용하여 else if문의 첫 번째 else를 제거한다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			} 
            
			if(number == 5){
				answer += 5; // 5를 (10 - number)로 생각하면 아래 else if문과 중복된 코드
				if(i-1 >= 0 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
			} else {
				answer += (10 - number);                
				if(i-1 >= 0) { 
					numbers[i-1]++;
				}
			}    
		}

		return answer;
	}

5를 (10 - number)로 고친다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			} 
            
			if(number == 5){
				answer += (10 - number);
				if(i-1 >= 0 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
			} else {
				answer += (10 - number);                
				if(i-1 >= 0) { 
					numbers[i-1]++;
				}
			}    
		}

		return answer;
	}

중복되는 answer += (10 - number) 부분을 남기고 따로 추출한다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			} 
            
			if(number == 5){
				answer += (10 - number);                
			} else {
				answer += (10 - number);                                
            }    
            
			if(number == 5 && i-1 >= 0 && numbers[i-1] >= 5){
				numbers[i-1]++;
			}
            
			if(number > 5 && i-1 >= 0) { 
				numbers[i-1]++;
			}
		}

		return answer;
	}

if else 모두 같은 결과이므로 if else문을 삭제한다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(number == 5 && i-1 >= 0 && numbers[i-1] >= 5){
				numbers[i-1]++;
			}
            
			if(number > 5 && i-1 >= 0) { 
				numbers[i-1]++;
			}
		}

		return answer;
	}

i-1 >= 0이 중복으로 있으므로 이것을 기준으로 하나의 if문으로 묶어낸다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 >= 0){
				if(number == 5 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
				if(number > 5) { 
					numbers[i-1]++;
				}
			}
		}

		return answer;
	}

그 아래 비어있는 else문을 써 넣어본다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 >= 0){
				if(number == 5 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
				if(number > 5) { 
					numbers[i-1]++;
				}
			} else {
			
			}
		}

		return answer;
	}

else문에 조건을 넣고 if문에 있는 조건을 else문으로 바꾼다.

(보호절 방식으로 !을 붙이는 것이라 생각하면 된다.)

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
			    
			} else {
				if(number == 5 && numbers[i-1] >= 5){
					numbers[i-1]++;
				}
				if(number > 5) { 
					numbers[i-1]++;
				}
			}
		}

		return answer;
	}

if(i-1 < 0)일 때는 for문 내에 더 실행할 명령이 없으므로 continue를 넣고 else를 제거한다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
				continue;
			}
            
			if(number == 5 && numbers[i-1] >= 5){
				numbers[i-1]++;
			}
			if(number > 5) { 
				numbers[i-1]++;
			}            
		}

		return answer;
	}

if문안에 같은 numbers[i-1]++이 있으므로 중복을 제거해보자.

number와 numbers[i-1] 두 개의 조건이 있으므로 이와 관련해서 4가지 조건을 모두 만든다.

number < 5인 경우는 맨 위에 continue에서 걸려서 처리되었으므로 생각하지 않는다.

 

그러면 number와 numbers[i-1]로 만들 수 있는 모든 조건을 아래와 같이 네 개의 식으로 구성할 수 있다.

number > 5인 경우 numbers[i-1] 값에 관계없이 numbers[i-1]++을 실행하면 된다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
			answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
				continue;
			}
            
			if(number == 5 && numbers[i-1] >= 5){
				numbers[i-1]++;
			} else if(number == 5 && numbers[i-1] < 5){

			} else if(number > 5 && numbers[i-1] >= 5){
				numbers[i-1]++;
			} else if(number > 5 && numbers[i-1] < 5) { // else와 동일하지만 명시적으로 표현했음.
				numbers[i-1]++;
			}	            
		}

		return answer;
	}

여기서 비어있는 else if(number == 5 && numbers[i-1] < 5)를 맨위의 if문으로 올린다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
				continue;
			}
            
			if(number == 5 && numbers[i-1] < 5){

			} else if(number == 5 && numbers[i-1] >= 5){
				numbers[i-1]++;
			} else if(number > 5 && numbers[i-1] >= 5){
				numbers[i-1]++;
			} else if(number > 5 && numbers[i-1] < 5) { // else와 동일하지만 명시적으로 표현했음.
				numbers[i-1]++;
			}	            
		}

		return answer;
	}

세 개의 else if 안에 실행할 명령이 numbers[i-1]++으로 공통이고 나머지 모든 경우를 커버하므로 하나의 else로 묶는다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
				continue;
			}
            
			if(number == 5 && numbers[i-1] < 5){

			} else {
				numbers[i-1]++;
			}	            
		}

		return answer;
	}

if문에 continue를 넣고 밑에 else를 제거한다.

	public int solveWithGreedy(int storey){        
		int answer = 0;
		int numbersLength = getLength(storey);
		int[] numbers = getSplitNumbers(storey);
        
		for(int i = numbersLength; i >= 0; i--) {
			int number = numbers[i];
			if(number < 5){
				answer += number;
				continue;
			}             

			answer += (10 - number);                
            
			if(i-1 < 0){
				continue;
			}
            
			if(number == 5 && numbers[i-1] < 5){
				continue;
			}

			numbers[i-1]++;	            
		}

		return answer;
	}

이렇게 중첩된 if문을 제거해보았다.

들여쓰기도 적고 가독성 면에서 더 깔끔해진 코드로 바뀌었다.