이번에는 CodeUp에서 파이썬으로 풀었던 기초 100제 문제 중 가장 기억에 남았던 문제를 C언어로 풀어보았습니다.
크게 반복문, 조건문, 연산, 배열에 대해 정리하였습니다.
Memorable CodeUp
첫 번째 문제로 기초 100제의 1079번 문제입니다.
입력이 반복되며 문자 'q'가 입력될 때까지 문자를 출력하는 문제입니다.
이 문제는 입력을 한 번은 무조건 받아야 하는 문제여서 반복문 중 do while반복문을 사용하여 푼 문제입니다. 반복 코드를 무조건 한번 실행하는 형식으로 기억에 남던 문제입니다.
문제의 풀이는 아래와 같습니다. 문자의 자료형인 char 변수를 선언하고 do while반복문을 활용하는 방식입니다. 여기서 scanf() 함수 뒤에 getchar() 함수가 이용되었는데 getchar은 문자형 입력에서 enter가 줄 바꿈(\n) 문자로 인식되기에 줄 바꿈 문자의 입력 버퍼를 비워줄 때 사용합니다.
Visual Studio에서 입력 버퍼를 비우는 방법으로 fflush(stdin)도 사용할 수 있습니다.
두 번째 문제는 1082번 문제입니다.
이 문제는 16진수로 입력하고, 출력하는 문제로서 우리가 흔히 아는 10진수와 다른 16진수(hexadecimal)로 사용하기 위해 서식 지정자 %x로 표현하였습니다.
이어서 1085번 문제입니다.
이 문제는 연산과 형변환을 통해 계산하는 문제로 자동 형변환 대신 자료형을 지정하여 계산하는 방식으로 풀었습니다. 소수점을 지정하기 위해 서식 지정자 부분에 %. 표현 소수점으로 지정하였습니다.
1087문제입니다.
언제까지 반복할 것인지 입력을 받아 반복문을 통해 sum변수에 값을 누적시키는 방식의 문제였습니다. 여기서 while반복문 조건에 true를 사용하기 위해 stdbool을 사용하였습니다.
1091번 문제입니다.
수열문제로 시작 값부터 규칙에 따라 증가하여 원하는 위치의 값을 출력하는 문제였습니다. 반복문을 통해 원하는 값까지 반복하며 시작 값에 규칙을 누적하여 시작 값의 변수에 결국 원하는 값이 들어가도록 풀어볼 수 있었습니다.
1092번 문제입니다.
동시에 출발하여 만나는 날이 겹치는 경우를 찾는 문제로 논리 연산자와 나머지 연산을 이용하여 날짜가 증가할 때마다 조건을 확인하여 조건이 맞을 때까지 반복하는 방법으로 풀어봤습니다.
다른 방법으로는 무한반복에 if조건문을 사용하여 조건이 만족하면 반복문을 빠져나가도록 하는 방법이 있을 것입니다.
1093문제입니다.
이번에는 배열 문제입니다. C언어에서는 배열을 사용할 때 초기화하는 방식으로 사용하여야 되며 초기화의 방식은 지정한 크기보다 덜 값을 지정하면 남은 값은 0으로 채워지고 크기보다 1 작게 지정하면 지정한 크기에 값이 들어가집니다.
마지막은 비워두어 값을 저장하는 이유는 널(NULL) 문자'\0'가 올 수 있기 때문입니다. 문자의 경우긴 하지만 쓰레기 값이 나올 수 있기에 하나 더 배열 크기를 크게 하여 지정하였습니다.
위의 문제를 풀 때 입력을 변수로 받아 변수의 숫자에 맞는 배열에 숫자를 저장하는 방법도 있었지만, 저는 배열에 순서대로 입력한 것을 차례대로 꺼내어 비교하여 숫자를 출력하도록 만들었습니다.
1096번 문제입니다.
이번 문제는 2차 배열입니다. 2차 배열의 초기화는 1차 배열과 같으며, 이 문제는 간단하게 입력받은 행과 열에 대해 값을 1로 바꾸는 문제로 풀었습니다.
1098번 문제입니다.
2차원 배열 문제로 배열의 크기가 할당되지 않고, 입력받은 만큼 할당하는 방식이기에 동적 할당을 사용하였습니다.
동적 할당을 사용하기 위해서는 stdlib헤더 파일을 이용하여 malloc() 함수로 동적 할당이 이루어져야 합니다. 2차 배열이기에 이중 포인터를 사용하여 열(row)에 대한 것을 먼저 메모리에 접근하도록 하고, for반복문을 통해 하나의 열에 대해 행(column)을 만드는 방식을 이용하여 동적 할당을 하였습니다.
여기서 잘못 코딩한 부분이 있는데 배열의 할당이라는 주석 바로 위의 sizeof(int*)을 sizeof(int)로 변경해야 합니다. 열은 열의 메모리 주소가 들어가야 하기에 int*와 같이 포인터의 크기를 구하는 것이고, 행은 주소 값이 아닌 값이 들어갈 것이니 int로 해주어야 하는 것이 맞습니다.
할당받은 배열에 값을 채우는 방식으로 진행하였고, 조건과 비교하여 각자 가로, 세로의 방향의 값을 1로 바꾸는 작업을 진행하였습니다. 그 후, 값을 모두 사용하였기에 할당받은 동적 배열을 해제해주어 메모리의 사용을 해제하여야 하는데 free(공간)를 통해 할당받은 공간 메모리를 해제합니다.
아래의 코드를 함수를 만들어 사용하면 가독성이 좋은 코드가 될 것으로 생각됩니다.
마지막으로 기억에 남는 1099번 문제입니다.
이번 문제는 특정 형태의 배열을 입력받아 조건에 맞춰 값을 변형시키는 문제입니다.
이 문제는 무한반복을 이용하여 조건에 맞춰 값을 변경하고, 반복을 종료시키도록 할 수 있지만, 중첩 반복문에서 빠져나올 때 사용하면 편리한 goto문을 사용하기 위해 중첩 반복문을 사용하는 방식으로 문제를 풀어보았습니다.
아래 코드처럼 특정 조건이 될 때 goto문을 사용하여 반복문을 빠져나가는 형식으로 만들었습니다.
코드에 오류가 있었고, 부족한 부분이 많이 있었지만 봐주셔서 감사합니다.
더욱 노력하여 완벽하게 간결한 코드가 되도록 하겠습니다!🙇♂️
'TeamH4C_ProjectH4C > 프로그래밍 언어' 카테고리의 다른 글
[TeamH4C_C언어] 포인터를 활용한 문제 (0) | 2021.03.06 |
---|---|
[TeamH4C_C언어] 포인터의 활용 (0) | 2021.03.06 |
[TeamH4C_C언어] 반복의 loop (2) | 2021.02.21 |
[TeamH4C_C언어] 언어의 계산 (0) | 2021.02.21 |
[TeamH4C_C언어] 자료형들의 사용 (0) | 2021.02.21 |