포인터를 이용한 중복검사와 정렬 심화학습 |
이번에 제시된 과제를 리뷰하다가 포스트로 남기고 싶은점이 있어서 글을 쓰게 되었습니다. 정렬이나 중복검사 등 꾸준히 다뤄왔던 개념이었지만, 메모리조건으로 배열변수 생성에 제한을 둔다던가 포인터 사용을 강제하는 조건으로 같은 문제를 해결할때 익숙하지 않은 부분이 있게 되었습니다.
과제에 제시된 문제중 가장 고민을 했던 문제를 먼저 해결해보고 그 뒤에 문제 조건을 좀 더 심화하여 풀어보겠습니다.
문제 1. 두 배열을 포인터를 이용해 큰값과 작은값으로 분리하라 |
문제설명
두개의 배열에 정수를 입력받은 뒤에 각 배열의 원소의 개수를 계산합니다. 그 값을 n(배열A의 개수)과 m(배열B의 개수)이라 하겠습니다. 두 배열의 원소들중 큰 값들은 A배열로, 작은 값들은 B배열로 이동합니다.
그리고 큰 값이 저장된 A배열은 내림차순으로 , 작은 값이 저장된 B배열은 오름차순으로 저장합니다.
그리고 배열을 출력하는 문제입니다.
입력예시
10 50 70 0 ==> 배열 A (원소의 개수 3개)
20 100 0 ==> 배열 B (원소의 개수 2개)
이 들어오게 된다면 5개의 원소중 가장 큰 값 3개는 100 70 50 이고, 작은 값은 10,20 입니다
출력예시
100 70 50
10 20
풀이 및 접근 방법
처음 이 문제를 풀이했을때는 조건을 상세하게 인지하지 못해서 잘못된 방향으로 풀이했습니다. 배열A와 배열B를 각각내림차순으로 정렬한 뒤에 , 개수에 맞추어서 A와 B중 더 큰 값을 출력하고 출력한 배열은 인덱스를 한칸 이동하고 , 이 과정을 반복해서 해결했습니다. 이 방식으로는 출력값은 문제와 동일하게 풀이할 수 있지만
위의 조건을 만족하지 못하기때문에 틀린 풀이라고 할수있습니다.
그래서 접근방식을 바꾸어서 다시 풀이했습니다. 전체적인 알고리즘을 설명하기 위해 그림으로 보여드리겠습니다.
먼저 입력을 받고, 각 배열의 A_index와 B_index를 카운팅까지 해줍니다.
그 후에 내림차순 정렬을 각각 배열A,B에 실행합니다. ( 내림차순 정렬 코드는 코드부분에서 확인하세요 )
이전에 배열A에 2번째 원소의 값 10과 배열 B의 원소들충 최댓값 100을 비교해서 A<B이므로 교환합니다.
1번째 인덱스와 0번째 인덱스에 대해서는 B배열의 값들보다 더 크므로 변화가 없습니다.
이렇게 만들어 준 뒤 최종적으로는 문제조건에 맞게 A배열은 내림차순으로, B배열은 오름차순으로 정렬해주면 됩니다.
코드 실행결과입니다.
풀이코드
과제로 제시된 문제이므로 풀이코드를 간단하게 압축해서 작성하겠습니다.
포인터를 활용한 내림차순과 오름차순 정렬은 버블정렬을 활용했습니다.
문제2. 정수를 입력받아서 중복으로 등장한 수를 뺀 나머지 수들만 내림차순으로 정렬하라 |
이 문제는 1차 과제를 해결한 뒤에 , 과제에서 중점적으로 쓰인 개념들을 종합한 문제입니다. 중복을 걸러내서 정렬하라는게 핵심인 문제입니다.
문제는 굉장히 단순합니다
문제설명
입력에서 3과 2가 두번씩 중복돼서 출현했기때문에 3,2를 제외한 나머지 정수들만 가지고 내림차순을 진행합니다.
추가조건은 , 배열은 num배열 한번만 사용해야하며, 처음 배열 선언 이외에는 배열표기 [ ] 가 사용이 제한됩니다.
배열을 추가로 생성해서 문제를 해결할시에는 오답처리됩니다.
'지난 학기들의 기록 > C 기초' 카테고리의 다른 글
[C실습] 문자열 유형 분석 2 - 포인터배열을 사용한 strtok구현하기(문자열에서 단어 분리하기) (0) | 2020.10.06 |
---|---|
[C실습] 문자열 유형 분석 1 - 문자열에서 숫자 분리하기 (0) | 2020.10.05 |
[C실습] 파일 입출력 예제 - 특정 문자열 검색하기 (2) | 2020.08.27 |
[C실습] 동적할당 예제 - realloc함수를 쓰지않고 배열의 크기 바꾸기 (0) | 2020.08.22 |
[C실습] 동적할당예제 - 2차원 배열 활용 (0) | 2020.08.21 |
댓글