Language
-
C 재귀호출 (하노이탑)Language/C 2023. 7. 30. 22:57
탑을 다른 탑으로 옮기는 하노이탑이다. 규칙은 제일 위에 있는 원판을 움직여야하며 한번에 한개씩 이동이 가능하고, 크기가 작은 원판은 큰 원판위로 가지 못한다. 옮기는 과정들을 생략하고 전체적으로 봤을때 원판이 n개가 있으면 가장 큰 원판을 제외하고 그 위의 n-1개의 원판을 옮긴 후, 가장 큰 원판을 목적지에 옮기고, 다시 n-1개의 원판을 목적지에 크기순으로 놓으면 된다. 간단한가 하면서도 코드로 짜면서 생각을 하니 좀 어지러웠다. #include void hanoi(int n, char start, char work, char end){ if(n == 1){ printf("%d을 %c에서 %c로 옮김", n, start, end); } else{ hanoi(n-1, start, end, work);..
-
백준 10809번 : 알파벳 찾기Language/C 2021. 6. 10. 19:36
많이 어려웠고 아직까지 해결을 못하였다. 단어를 입력받고 입력받은 단어의 각 알파벳에 대해, 단어에 포함되는 경우 처음 등장하는 index값을 출력하고, 포함되지 않을 경우 -1을 출력하는 문제인데, 필자의 경우 중복된 알파벳이 나올경우 마지막에 등장하는 알파벳의 index값이 출력된다. 일단 여기까지 짠 코드이다. #define _CRT_SECURE_NO_WARNINGS #include #include int main(void) { char S[100]; int a[26]; scanf("%s", S); //-1로 초기화 for (int i = 0; i < 26; i++) { a[i] = -1; } //출력까지 완료 but 중복된 알파벳이 나올경우 마지막 위치의 index값이 출력됨. for (int j..
-
백준 2562번 : 최댓값 (포인터 풀이)Language/C 2021. 6. 10. 17:14
앞서 배열을 사용하여 풀이해 본 적 있는 문제이다. 아주 간단하니 코드를 보고 이해해보자, 모르겠다면 배열로 먼저 코드를 짜 보고 포인터로 바꿔보면 좋다. #include int main(void){ int arr[9]; int* p = arr; int max = 0, maxnum = 0; for (int i = 0; i < 9; i++) { scanf_s("%d", (p + i)); if (max < *(p + i)) { max = *(p + i); maxnum = i+1; } } printf("%d\n", max); printf("%d\n", maxnum); } 문제는 풀었지만 필자가 매일 보면서 이해가 안 돼 궁금한 부분이 있었으니 한번 적어보겠다. 위의 코드에서는 for문 안에 scanf과 if문..
-
5주차 문자열과 문자열 처리함수 과제Language/C 2021. 6. 1. 22:51
단어를 입력하고 입력한 단어에서 사용된 알파벳 + 알파벳의 개수를 출력해주면 된다. 모르겠다. int a~z, A~Z = 0 ; 으로 주고 if문과 for문을 사용해서 입력한 문자열을 하나씩 읽어 해당 알파벳의 수를 1씩 증가 시키는 방법으로 푼다면 물론 쉽겠지만 쓰이지 않은 문장들도 (a = 0 과 같이) 출력이 되고, 당연히 이건 정답은 아니다. 한참을 생각하다가 인터넷이 검색해보았다. "문자열 빈도 수" 라고 검색하니 대충 비슷한 문제가 나왔다. 풀이 방법은 ASCII를 사용해서 문제를 푸는 것이다. 대충 이런 방식이다. ASCII에서는 문자에 해당하는 숫자가 있다. ( a = 97, z = 122, A = 65, Z = 90 과 같이 ) 문자열을 입력받았을때, 문자에 해당하는 숫자를 인덱스로 사용..
-
백준 1152번 : 단어의 개수Language/C 2021. 6. 1. 21:51
띄어쓰기(공백)를 기준으로 나누어 단어의 갯수를 세어주는 코드를 짜보라는 문제이다. 주의해야할 점은 문자열을 입력받을때 문자열의 맨 앞, 맨 뒤에 공백이 있을 수 있다는 것이다. 맨 앞, 맨 뒤의 공백을 없애거나 무시해주면서 띄어쓰기(공백)의 개수를 세어주는 코드를 짜보자. 일단 맨 앞, 맨 뒤가 공백일 경우를 생각해봤다. 문제에서 보면 공백이 연속해서 나오는 경우는 없다고 했다. 그러므로 앞이 공백이라면(arr[0]) 공백을 무시하고 2번째(arr[1])부터 읽으면 된다. 그리고 맨 뒤가 공백일 경우도 있으니 맨 뒤(arr[n-1])도 무시하고 읽어주면 된다. 이렇게 맨 앞, 맨 뒤가 공백일 경우는 해결해주었다. 다음으로 문자열 자체가 공백일 경우(입력받은게 없을 경우)를 생각했다. 입력받은게 없다면 ..
-
백준 2675번: 문자열 반복Language/C 2021. 5. 23. 16:24
하나씩 생각해서 코딩을 짜보자. 1. 몇 번을 수행할지 입력을 받고 - scanf / for 2. 입력받은 문자열을 각 문자당 몇번 출력할지를 받고 - scanf 3. 문자열을 입력받으면 된다 - scanf / gets #include #include int main(void) { int a, b; char arr[20]; scanf("%d", &a); for (int i = 0; i < a; i++) { scanf("%d", &b); scanf("%s", arr); for (int i = 0; i < strlen(arr); i++) { for (int t = 0; t < b; t++) { printf("%c", arr[i]); } } printf("\n"); } } 이렇게 코드를 짜주었다. VS2019..
-
백준 2566번: 최댓값Language/C 2021. 5. 15. 02:38
https://hi-bald-person.tistory.com/49 백준 2562번: 최댓값 문제를 보자면 자연수를 입력하고, 그중 최댓값과 최댓값이 몇 번째로 입력받은 수인지를 출력해줘야 한다. 자연수를 9개 입력해줘야 하기 때문에 배열을 사용할 것이고, 배열에 들어간 수들을 hi-bald-person.tistory.com 앞선 최댓값 문제가 1차원 배열이었고, 이번 문제는 2차원 배열의 문제이다. 1차원 배열 문제풀이와 별 다를 것이 없긴 하다. 쉽게 코드를 짤 수 있었다. 1차원에서 2차원으로 바뀌었다 해도 풀이법은 비슷하니 직접 한번 해보자.
-
백준 2577번: 숫자의 개수Language/C 2021. 5. 15. 02:17
문제를 풀기는 했으나 어려웠다. 필자가 어려웠다 생각한 부분은 숫자가 각각 몇 번 쓰였는지를 출력해주는 부분인데, 해당 부분은 다른 분들의 풀이를 참조했다. (실상 문제 포인트가 이것인 것 같다.) 배열을 두 개 사용해줘서 한 곳은 scanf로 입력한 값을 저장하고 다른 한 곳은 입력받은 값의 곱의 숫자의 개수를 세주는 데 사용하였다. 주요 포인트를 설명하자면 arr[mul % 10]++이다. 입력받은 세 수를 곱한 값을 mul에 저장해주고, mul을 10으로 나눈 나머지 값에 해당하는 arr 배열의 익 덱스 값을 1씩 증가시켜주는 것이다.