ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [코드 트리] Trail 1 : 프로그래밍 기초 | Ch 7 : 1차원 배열
    카테고리 없음 2026. 5. 23. 17:39

    Trail1 프로그래밍 기초의 7챕터의 1차원 배열에 대해 공부했습니다.

     

    배열은 갭체크에서도 부족한 부분이라고 뜨는 만큼 제가 가장 어려워하는 부분입니다.

    고정된 크기를 가지고, 그 크기를 자유자재로 줄이고 늘리고 하기 힘들며 뭔가 편리하게 사용하기 조금 힘든?
    그런 부분이 있습니다.

    또 배열보다는 리스트나 벡터를 자주 사용했어서..

    그래서 이번 공부 시간은 되게 오래 걸렸습니다.

    문제를 풀다가도 배열 범위 바깥을 자주 나가서, 런타임 에러가 뜨기도 하고..

    왜인지 모르겠지만 함수를 똑같이 썼는데 발생하는 에러가 있기도하고... 이게 참 어려웠습니다.

     

    1차원 배열의 목차입니다.

    생각보다 Count 배열 챕터가 되게 신기했습니다.

    그리고 배열 만들기 챕터는 되게 어려웠습니다...

     

    Coun 배열 챕터는 배열의 인덱스 위치의 실제 값을 다른 배열의 인덱스 값으로 해서 카운팅을 하는 부분이 되게 신기했습니다.

    이렇게도 배열을 쓸 수 있구나.. 2차원 배열처럼 사용하는 느낌?
    되게 신기한 시간이었습니다.

     

    배열 만들기 챕터가 어려웠던 이유는 이게 굳이 배열을 안 만들어도 되는 문제가 배열을 사용해서 해결하려고 하니..

    먼가 더 어렵게 느껴졌습니다.

    그리고 또 그렇게 작성할 배열의 크기라던가 로직을 돌리는 범위 등.. 

    이런 부분들에 대해서 정확하게 작성을 해야 에러나, 오류가 발생하지 않았습니다..

    아직 고정된 크기를 얼마만큼 할당해야 하는지에 대해서 조금 미숙한 것 같습니다.

     

    해당 문제는 n명의 학생들의 4가지의 시험 점수의 평균이 60점 이상인지 아닌지를 체크하는 문제였습니다.

    문제를 풀다보니, 이게 입력이 n번 들어오길래 반복문 내에서 한 사람씩 평균을 체크하도록 작성했습니다.

     

     

    해당 문제는 배열 만들기 챕터의 문제입니다.

    이 문제를 조금 오래 작성했었는데, arr 배열의 크기를 대체 어떻게 잡아야할지 고민되었습니다.

    이게 첫 선언을 n개의 배열을 만들도록 작성을 했는데,

    정작 arr에 들어가는 값들은 n개가 안되었습니다.

    따라서 나중에 foreach 문을 통해 모두 출력할 때 필요 없는 값들이 출력되면서 문제 해결이 안되었습니다.

     

    이게 정말 들어가야하는 값들의 개수를 딱 맞춰서 arr 배열을 선언하고 싶었는데,

    그렇게 하려니 for문을 하나 만들어서 개수를 세어야 하더라구요..

    그래서 이리저리 알아보다가 개수를 세긴하는데, arr 배열에 값을 할당하면서 세도록 작성하였습니다.

    이러면 배열의 크기가 딱 안맞는거 아닌가? 하는 생각이 들텐데

    이걸 c#에서 사용가능한 slice 방식을 이용했습니다.

     

    배열 개념에 있던 부분인데, c#에서는 arr[0..2] 이런 식으로 시작 인덱스 부터 끝 인덱스까지 길이만큼 새로운

    배열을 생성해서 할당할 수 있었습니다.

    그래서 count 변수를 이용해서 개수를 세고, 그만큼 arr를 잘라서 다시 arr에 할당하도록 작성하면서

    arr가 딱 자기한테 맞는 크기를 가지게 되었습니다.

     

    이 문제를 풀고 해설을 보았는데, 이게... 그냥 큰 배열을 쓰더라구요.

    크기를 100정도 잡아두고 그 배열에 값을 다 넣은 뒤에 반복문을 돌때 cnt 체크해둔 횟수만큼만 반복문이 호출되게

    그렇게 해서 실제 0~cnt 까지의 arr[i] 값을 출력하도록...

    굳이 배열의 크기를 다시 조정하지 않고 그냥 출력해야하는 부분만 출력하도록 작성되어 있어서..

    너무 고민했나? 라는 생각이 들기도 했습니다.

     

    아무래도 문제다 보니까 배열이 꼭 자기 크기만큼만 가져야 할 필요도 없고, 또 다른 이유가 있겠죠?
    그래서 이 문제 이후로는 너무 크기를 맞추려고 하지는 않았던 것 같습니다.

    크기를 재할당하고 모든 값을 복사하고 그렇게 하는 것도 자원을 꽤 먹는 것 같아서

    그냥 큰 크기를 사용하는 것도 나쁘지 않은 방법이라는 생각이 들었습니다.

     

    해당 문제는 Count 배열 챕터의 문제입니다.

    이 챕터에서 신기했던 부분이 위 이미지에서 countArr[arr[i] / 10] += 1 부분입니다.

    배열에서 값을 증가시키는 위치를 또 다른 배열의 값으로 해결합니다.

    이렇게 하니까 코드 자체가 간결해지고 작성하기도 꽤 쉬웠습니다.

     

    위 이미지에서는 arr[i]의 십의 자리 숫자의 개수를 세는 문제였습니다.

    그래서 arr[i] / 10 이라는 수식을 이용해서 십의 자리수를 찾고 그 값을 countArr의 인덱스로 할당해서 

    십의 자리 수가 1 ~ 9 인 값들의 개수를 세어나갈 수 있었습니다.

     

    탐색 챕터 중에서 가장 어려웠던 문제입니다.

    a 수열과 b 수열을 주고, b 수열이 a 수열의 연속부분수열인지 확인하는 문제였습니다.

    저는 이걸 개수를 세는 방식으로 작성을 하고자 했어서, a 수열의 현재 값과 b 수열의 현재 값이 같은 경우

    cnt 값을 증가시키고, 만약 cnt 값이 b 수열의 전체 개수 이상인 경우 현재 값을 유지하도록, 

    마지막으로 다른 값인데 b 수열의 전체 개수 미만인 경우에는 cnt 값을 초기화하도록 했습니다.

     

    이 부분을 작성하면서 반복문 범위가 헷갈리더라구요, 변수 j 시작 위치를 idx 값으로 주어서, 

    체크를 진행했던 b 수열의 앞부분은 넘기고 그 뒤를 검사하도록 작성했습니다.

     

    해결을 하고 해설을 보니 반복문 j 값을 변경하는 방법이 아니라,

    arr [ i + j ] != arr [ i ] 형태로 검사할 값을 계속 변경하도록 작성했더라구요.

    반복은 비슷한 느낌인 것 같은데, bool 형 값을 이용해서 저와 다르게 수를 세는게 아니라, 

    연속부분수열 검사가 모두 끝났음에도 bool 값이 참인 경우 그리고 거짓인 경우,

    각각 상황에 맞춰서 값을 출력하도록 작성이 되어 있었습니다.

    그래서 저도 괜히 좀 어렵게 한게 아닌가.. cnt 수를 세는 것도 좀 얼만큼 세야하는지...

    막 그런것도 생각해야했고 하다보니 많이 어렵게 풀어낸 것 같습니다..

     

     

    min/max 챕터 문제입니다.

    이 문제를 풀고 해설을 보고 되게 생각에 차이가 크다고 느꼈던 문제인데,

    이 문제는 내림차순을 했을 때 첫번째, 두번째 값을 출력하는 문제였습니다.

     

    저는 당연히 내림차 정렬을 진행했고, 정렬을 끝낸 후 처음 값과 두번째 값을 출력했습니다.

    그런데 해설은 완전히 다르더라구요.

     

    해설은 내림차 정렬? 그거 안해도 된다. 그냥 찾을 값 두개를 만들고 첫 값과 두번째 값을 내가 비교할 값에 비교하면서 그냥 쭉 찾아라... 이렇게 이야기했습니다.

     

    내림차 문제니까, 당연하게 내림차 정렬을 하고 찾았던거에 반해 그냥 반복문 한번 지나가면서 값 두개를 비교하면서 그냥 두 개의 값을 찾아서 한번에 출력하도록... 되게 간단하게? 문제를 풀어낸다는 생각이 들었습니다.

     

    이렇게 하면 당연히 정렬에 관한 시간이 사라지고 반복문을 한번 도는 동안 값을 다 찾기 때문에 더 효율적인 코드라는 생각이 들기도 했습니다. 

    매번 해설을 보면서 느끼지만 저와 생각하는 부분이 많이 다른 것을 알 수 있습니다.

    저는 되게 어렵게 생각한 문제에 대해서 그냥 이렇게 하면 되는 문제 라고 이야기하는 것 같습니다.

    아마도 저의 공부가 아직 많이 모자라고 다양하게 코드를 작성해보지 못한 경험의 차이가 있지 않을까 생각이 들기도 합니다.

     

    되게 좋은 공부가 된 것 같습니다.

    배열을 공부하면서 오랜 시간이 걸렸습니다.

    아직도 잘 모르겠는 부분도 있고, 잘 풀었나? 하는 부분도 있는데, 앞으로 다른 문제를 풀면서 배열을 많이 사용해보고

    그러면서 더 늘어가지 않을까 싶습니다.

Designed by Tistory.