Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

ASAP 개발

[C# 프로그래머스] 코딩 테스트 입문 > 가장 큰 수 찾기 본문

알고리즘/프로그래머스(C#)

[C# 프로그래머스] 코딩 테스트 입문 > 가장 큰 수 찾기

아라동 2022. 10. 20. 15:39

안녕하세요  개발자 이현석 입니다.

이번에는 큰 수를 찾는 과정에서는 문제가 없었지만 배열에서 큰 수의 위치에 대한 정보를 담는 과정에서 많은 우여곡절이 있었습니다.

그럼 포스팅 시작하겠습니다.


가장 큰 수 찾기

문제 설명 및 입출력예시

- 코드1

using System;

public class Solution {
    public int[] solution(int[] array) {

        int max = 0;
        int count = 0;
        int[] result = new int[2]{max,count};   //(1)
        
        for(int i = 0; i < array.Length; i++){
            if(array[i] > max){
                max = array[i];                 //(2)
                count++;                        //(3)
            }
        }return result;
    }
}
  • 가장 처음 작성했던 코드입니다!
    위의 조건식(for,if)에 따라 array에서 큰 기존의 result보다 큰값이 나올 때 마다 큰값이 result의 max로 들어오는 식을 작성했고 그에 따라 count를 증가 시켜 위치를 찾으려고했다
  • 여기서 나타난 오류는 다음과 같습니다.

  • 배열에 값이 들어오지 않았습니다...
    (1)을 보면 알 수 있듯이 배열에(2),(3)에서 정의한 max와count를 넣어 뒀기 때문에 자연스럽게 배열에 들어 갈 줄 알았습니다. 이를 해결하기 위해 코드 2로 수정했습니다!

- 코드2

using System;

public class Solution {
    public int[] solution(int[] array) {

        int max = 0;
        int count = 0;  
        int[] result = new int[2]{max,count};
        
        for(int i = 0; i < array.Length; i++){
            if(array[i] > result[0]){           //(1)
                result[0] = array[i];           //(2)
                result[1]++;                    //(3)
            }
        }return result;
    }
}
  • (1)에서 max대신 result[0]이라고 명시해 줬습니다. max 를 거쳐 result로 값을 넣어주는 과정을 바로 result에 넣어 줄까? 라는 생각으로 시도 한것이 제대로 들어가는 결과까지 이어졌습니다!!
    int max와 int count는 초기 값을 정해주기만하고 실제 값은 해당 경로를 바로 지정해 입력하는 방식입니다!
  • 마찬가지로 (2),(3) 도 배열의 위치를 지정해줬습니다. 하지만

  • 가장 큰 수는 잘 찾았지만 위치를 제대로 찾지 못했습니다...... 에휴...
  • 문제는 빨간밑줄에 있었습니다. 
    • 가장 큰 수를 찾을때만 count가 증가하므로 작은 수는 카운트를 하지 않고 지나가버려 순수하게 가장 큰 수로 바뀌는 과정만 카운트가 되었습니다! 그래서 다시 아래와 같은 코드로 바꿔줬습니다.

- 코드3

using System;

public class Solution {
    public int[] solution(int[] array) {

        int max = array[0];                     //(1)
        int count = -1;  			//(2)
        int[] result = new int[2]{max,count};	
        int mineNum = 0;			//(3)
        
        for(int i = 0; i < array.Length; i++){
            if(array[i] > result[0]){
                result[0] = array[i];
                result[1]++;
                result[1] += mineNum;           //(4)
                mineNum = 0;			//(5)
            }
            else{
                mineNum++;			//(6)
            }
        }return result;
    }
}
  • 우선 작은 수를 카운트 하지만 큰 수가 나오기 전까지는 count에 담기면 안된다고 생각했습니다.
    그래서 if조건에 걸리지 않는다면 (6)에서 처럼 mineNum이 증가하게 만들었고 이 값을 (3)에 저장해 뒀습니다.
  • 다음 if문을 통과하는 과정에서 result이 +1 되고 그 동안 쌓인 mineNum을 (4)에서 추가로 더 해주고 (5)에서 초기화 해줬습니다.
  • 여기서 발생하는 문제들로는 (1)은 원래 0이였지만 그렇게 된다면 배열의 0과 1의 비교로시작하는 것이 아닌 max의 0과 배열의 0번째 값을 비교하기 때문에 쓸모 없는 과정을 줄이기 위해 위와 같이 바꿔주었습니다. 
  • (2)는 배열이 1부터 시작하는 것이아닌 0부터 시작하는 특징으로 인해 count의 시작을 -1로 바꿨습니다  


이상 포스팅을 마치려고합니다!

어렵지 않은 문제지만 사소한 문제들에 부딧치면 오랜시간을 사용했습니다. 사실 위의 max와 count의 값도 지정하지 않고 값을 바로 배열에 넣어 시작할 수 있지만 조금이라도 객체지향적인 요소를 넣고 싶어 사용했습니다!

Comments