Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자바의 정석 기초편 ch1
- 자바의 정석 기초편 ch4
- 자바의 정석 기초편 ch14
- 스프링 고급 - 스프링 aop
- 스프링 mvc2 - 타임리프
- 스프링 mvc1 - 서블릿
- 자바의 정석 기초편 ch13
- 자바의 정석 기초편 ch9
- jpa 활용2 - api 개발 고급
- 스프링 db1 - 스프링과 문제 해결
- 자바의 정석 기초편 ch3
- 자바의 정석 기초편 ch5
- 스프링 mvc1 - 스프링 mvc
- 코드로 시작하는 자바 첫걸음
- 자바의 정석 기초편 ch11
- 스프링 입문(무료)
- 2024 정보처리기사 시나공 필기
- 타임리프 - 기본기능
- 자바의 정석 기초편 ch8
- 자바의 정석 기초편 ch7
- @Aspect
- 자바의 정석 기초편 ch2
- 자바의 정석 기초편 ch12
- 게시글 목록 api
- 자바의 정석 기초편 ch6
- jpa - 객체지향 쿼리 언어
- 2024 정보처리기사 수제비 실기
- 스프링 mvc2 - 로그인 처리
- 스프링 db2 - 데이터 접근 기술
- 스프링 mvc2 - 검증
Archives
- Today
- Total
나구리의 개발공부기록
Chapter 02 - C언어(기출 문제_3) 본문
2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비)/실기 6강 - 프로그래밍 언어 활용
Chapter 02 - C언어(기출 문제_3)
소소한나구리 2024. 6. 15. 22:002024년도 수제비 정보처리기사 실기책(6판) 내용 정리
16. C코드의 출력 결과 작성
#include <stdio.h>
int main(){
int a[4] = {0, 2, 4, 8};
int b[3];
int* pl;
int i, j;
int sum = 0;
for (i = 1; i < 4; i++) {
pl = a + i;
b[i-1] = *pl - a[i-1];
sum = sum + a[i] + b[i-1]
}
printf("%d", sum);
return 0;
}
풀이
#include <stdio.h>
int main(){
int a[4] = {0, 2, 4, 8};
int b[3];
int* pl;
int i, j;
int sum = 0;
// 1 ~ 3까지 반복
for (i = 1; i < 4; i++) {
// 1. pl = &a[0] + 1
// 4. pl = &a[0] + 2
// 7. pl = &a[0] + 3
pl = a + i;
// 2. b[0] = 2 - a[0], b[0] = 2
// 5. b[1] = 4 - a[1], b[1] = 2
// 8. b[2] = 8 - a[2], b[2] = 4
b[i-1] = *pl - a[i-1];
// 3. 4 = 0 + 2 + 2, sum = 4
// 6. 10 = 4 + 4 + 2, sum = 10
// 9. 22 = 10 + 8 + 4, sum =22
sum = sum + a[i] + b[i-1]
}
printf("%d", sum); // 22 출력
return 0;
}
17. C코드의 출력 결과 작성 ★★★★★ very hard라기보단 짜증나는 문제(되게 오래걸림;;)
- 한번 중간에 틀리면 매우매우 돌이키기가 까다롭기때문에 (4중반복문) 처음부터 접근을 잘하고, 구해진 연산결과를 모두 적어두는것이 문제를 해결할 때 도움이 됨
- 4번 풀고, 3번 오답, 1번 정답 -> 실제 문제를 푼 시간만 9시간 소요;;
- 6-87 페이지............
- p.s. 개고생해서 풀었는데 알고봤더지 지뢰찾기 알고리즘이였다는..^^
#include <stdio.h>
int calc(int w, int h, int j, int i) {
if (i>=0 && i<h && j>=0 && j<w)
return 1;
return 0;
}
int main() {
int field[4][4] = {{0,1,0,1}, {0,0,0,1},
{1,1,1,0}, {0,1,1,1}};
int mines[4][4] = {{0,0,0,0}, {0,0,0,0},
{0,0,0,0}, {0,0,0,0}};
int w = 4, h = 4;
int i, j ,k ,i;
for (l=0; l<h; ;++){
for (k=0; k<w; k++){
if(field[l][k] == 0)
continue;
for (i=l-1;i<=l+1;i++){
for (j=k-1; j<=k+1; j++){
if(calc(w, h, j, i) == 1 {
mines[i][j] += 1;
}
}
}
}
}
for(l=0; l<h; ;++){
for(k=0; k<w; k++){
printf("%d", mines[l][k]);
}
printf("\n");
}
return 0;
}
풀이
#include <stdio.h>
int calc(int w, int h, int j, int i) {
if (i>=0 && i<h && j>=0 && j<w)
return 1;
return 0;
}
int main() {
// 2차원 배열
int field[4][4] = {{0,1,0,1}, {0,0,0,1},
{1,1,1,0}, {0,1,1,1}};
int mines[4][4] = {{0,0,0,0}, {0,0,0,0},
{0,0,0,0}, {0,0,0,0}};
int w = 4, h = 4;
int i, j ,k ,ㅣ;
for (l=0; l<h; ;++){ // 0 ~ 4미만까지 4번 반복
// 1. l = 0
// 17. l = 1
// 23. l = 2
// 38. l = 3
for (k=0; k<w; k++){ // 0 ~ 4미만까지 4번 반복
// 2. k = 0 ~ 3, 반복문 진행
// 18. k = 0 ~ 3, 반복문 진행
// 24. k = 0 ~ 3
// 39. k = 0 ~ 3
if(field[l][k] == 0) // filed에서 꺼낸 값이 0이면 처음으로 돌아가기
continue;
// 3. [0][0]는 0, continue -> k++
// 4. [0][1]는 1, 다음 코드 진행
// 12. [0][2]는 0, continue -> k++
// 13. [0][3]은 1, 다음 코드 진행
// 19. [1][0~2]는 0, [1][3]만 다음코드 진행
// 25. [2][0] == 1, 다음코드 진행
// 29. [2][1] == 1, 다음코드 진행
// 33. [2][2] == 1, 다음코드 진행
// 37. [2][3] == 0, continue,
// 40. [3][0] == 0, continue,
// 41. [3][1] == 1, 다음코드 진행
// 45. [3][2] == 2, 다음코드 진행
// 48. [3][3] == 1, 다음코드 진행
for (i=l-1;i<=l+1;i++){
// 5. i=-1; -1<=1; -1++,3회반복, 1회, i가 -1이므로 다음코드는 실행 해도 변화가 없음
// 6. i=0; 2회차, 다음코드 진행
// 9. i=1; field [0][1] 끝
// 14. -1 ~ 1까지 3회반복, i가 0,1일때만 if문 조건에 해당됨
// 20. 0 ~ 2까지 3회반복, 모두 if문 조건에 해당
// 26. 1 ~ 3까지 3회반복, 모두 if문 조건에 해당
// 30. 1 ~ 3까지 3회반복, 모두 if문 조건에 해당
// 34. 1 ~ 3까지 3회반복, 모두 if문 조건에 해당
// 42. 2 ~ 4까지 3회반복, i가 2,3일때만 if문 조건에 해당됨
// 45. 2 ~ 4까지 3회반복, i가 2,3일때만 if문 조건에 해당됨
// 49. 2 ~ 4까지 3회반복, i가 2,3일때만 if문 조건에 해당됨
for (j=k-1; j<=k+1; j++){
// 7. i가 0, j가 0~2까지 3회 반복, 모두 if문 조건에 해당 -> 3번 calc 함수 연산결과 반환
// 10. i가 1, j가 0~2까지 3회 반복, 모두 if문 조건에 해당 -> 3번 calc 함수 연산결과 반환
// 15. i가 0~1, j는 2~4 3회반복, j가 2,3일때만 if문 조건에 해당 -> 총 4번 calc 함수 호출
// 21. i가 0~2, j는 2~4 3회반복, j가 2,3일때만 if문 -> 총 6번 calc 함수 호출
// 27. i가 1~3, j는 -1~1, j가 0,1일때만 if문 조건에 해당 -> 총 6번 calc 함수 호출
// 31. i가 1~3, j는 0~2, 모두 if문 조건에 해당 -> 총 9번 calc 함수 호출
// 35. i가 1~3, j는 1~3, 모두 if문 조건에 해당 -> 총 9번 calc 함수 호출
// 43. i가 2~3, j는 0~2, 모두 if문 조건에 해당 -> 총 6번 calc 함수 호출
// 46. i가 2~3, j는 1~3, 모두 if문 조건에 해당 -> 총 6번 calc 함수 호출
// 50. i가 2~3, j는 2~3, j가 2,3일때만 if문 조건에 해당 -> 총 4번 calc 함수 호출
// i,j가 0보다 작은수거나, w,h와 같거나 크면 0을 반환 -> 반복문을 몇개는 건너뛸 수 있음
if(calc(w, h, j, i) == 1) { // calc 함수의 결과가 1이면, 아래 코드 실행
mines[i][j] += 1;
// 8. [0][0],[0][1],[0][1]의 값에 각 1씩 증가
// 11. [1][0],[1][1],[1][1]의 값에 각 1씩 증가
// 16. [0][2],[0][3],[1][2],[1][3]의 값에 각 1씩 증가
// 22. [0][2],[0][3],[1][2],[1][3],[2][2],[2][3]의 값에 각 1씩 증가
// 28. [1][0],[1][1],[2][0],[2][1],[3][0],[3][1]의 값에 각 1씩 증가
// 32. [1][0],[1][1],[1][2],[2][0],[2][1],[2][2],[3][0],[3][1],[3][2]의 값에 각 1씩 증가
// 36. [1][1],[1][2],[1][3],[2][1],[2][2],[2][3],[3][1],[3][2],[3][3]의 값에 각 1씩 증가
// 44. [2][0],[2][1],[2][2],[3][0],[3][1],[3][2]의 값에 각 1씩 증가
// 47. [2][1],[2][2],[2][3],[3][1],[3][2],[3][3]의 값에 각 1씩 증가
// 51. [2][2],[2][3],[3][2],[3][3]의 값에 1씩 증가
}
}
}
}
}
// mines의 값을 하나씩 꺼내서 출력하는 2중 반복문
for(l=0; l<h; ;++){
for(k=0; k<w; k++){
printf("%d", mines[l][k]);
}
printf("\n"); // 2중 반복문이 끝날때마다(4번마다) 개행문자 적용
}
return 0;
}
// 22번까지의 실행 결과
// 1132
// 1132
// 0011
// 0000
// 36번까지의 실행 결과
// 1132
// 3453
// 2332
// 2321
// 최종결과
// 1132
// 3453
// 3564
// 3553
18. C코드의 출력 결과 작성
#include <stdio.h>
int main() {
int i, j, k, s;
int el=0;
for (i=6; i<=30; i++) {
s=0;
k=i/2;
for(j=1; j<=k; j++){
if(i%j==0){
s=s+j;
}
}
if(s==i){
el++;
}
}
printf("%d", el);
return 0;
}
풀이
#include <stdio.h>
int main() {
int i, j, k, s;
int el=0;
// 6 ~ 30까지 반복 -> 25번
for (i=6; i<=30; i++) {
s=0;
// 6. s를 0으로 초기화
// 11. s를 0으로 초기화
// 16. s=0;
// 21. s=0;
// 26. s=0;
// 31. 초기화 실행
// ... 반복문이 끝날때마다 s=0으로 초기화됨, 설명 중략
k=i/2; // i와 2를 나눈 몫을 k에 저장
// 1. 6/2, k=3
// 7. 7/2, k=3
// 12. 8/2, k=4
// 17. 9/2, k=4
// 22. 10/2, k=5
// 27. 11/2, k=5
// 32. 12/6, k=6
// 짝수,홀수 한번씩 k의 값이 1증가됨, 해당 루틴을 가지고 계산
for(j=1; j<=k; j++){ // 1부터 k까지 2차 반복문 실행
// 2. 1 ~ 3까지 반복문 실행
// 8. 1 ~ 3까지 반복
// 13. 1 ~ 4까지 반복
// 18. 1 ~ 4까지 반복
// 23. 1 ~ 5까지 반복
// 28. 1 ~ 5까지 반복
// 33. 1 ~ 6까지 반복
// i값이 2번 증가할때마다 k의 값은 1번증가, 해당 루틴을 가지고 계산
if(i%j==0){ // i를 j로 나눈 나머지가 0일 경우에만 코드를 실행
// 3. 6%1, 6%2, 6%3은 모두 나머지가 0임
// 9. 7%1 == 0, 그외는 나머지가 전부 남음으로 pass
// 14. 8%1, 8%2, 8%4 == 0, 그외는 패스
// 19. 9%1, 9%3 == 0, 그외는 패스
// 24. 10%1, 10%2, 10%5 ==0, 그외는 패스(약수면 0임을 확인)
// 29. 11의 약수 == 1,
// 34. 12의 약수 == 1,2,3,4,6 k==6
// 36. 13의 약수 == 1, -> 계산 생략
// 37. 14의 약수 == 1,2,7 k==7
// 38. 15의 약수, 계산생략
// 39. 16의 약수 == 1,2,4,8 k==8
// 40. 17의 약수, 계산생략
// 41. 18의 약수 == 1,2,3,6,9 k==9, 19의 약수 == 1,
// 42. 20의 약수 == 1,2,4,5,10 k==10, 21 pass
// 43. 22의 약수 == 1,2,11 k==11, 23 pass
// 44. 24의 약수 == 1,2,3,4,6,8,12 k==12, 25 pass
// 45. 26의 약수 == 1,2,13 k==13, 27 pass
// 46. 28의 약수 == 1,2,4,7,14 k==14, 29 pass
// 30. 30의 약수 == 1,2,3,5,6,10,15 k==15
s=s+j; // s값을 j와 +하여 누적연산
// 4. 0+1 -> 1+2 -> 3+3, s == 6, s와 i가 같음 el값 증가
// 10. 0+1 -> s == 1
// 15. 0+1 -> 1+2 -> 3+4, s == 7
// 20. 0+1 -> 1+3, s == 4
// 25. 1 -> 1+2 -> 3+5, s == 8 (약수들을 더하는 것임을 확인)
// 30. s == 1
// 35. 1+2+3+4+6, s == 16
// 약수들의 합이 같아 i와 같은것만 작성
// 47. 1+2+4+7+14 s == 28, s와 i가 같음 el값 증가
}
}
if(s==i){ // s와 i가 같으면 el의 수를 증가시켜서 카운트를 셈
el++;
// 5. el == 1
// 49. el == 2
}
}
printf("%d", el); // 2가 출력됨
return 0;
}
19. C코드의 출력 결과 작성
문제 및 풀이
#include <stdio.h>
int main() {
char a[] = "Art"; // char타입 배열에 A, r, t, '\0' 저장
char* p = NULL; // 포인터 변수 선언
int i = 0; // 정수타입 변수 선언
p = a; // 포인터 변수 p에 a의 주소(== &a[0])을 저장(배열a의 0번째 인덱스의 주소)
printf("%s\n", a); // 배열의 변수를 문자열로 출력하면 널값 전까지 출력됨
// Art
// 포인터 변수 p에 저장된 주소값이 a의 배열 주소값과 동일하므로 *p는 a[0]와 같은 뜻임
printf("%c\n", *p); // *p == p[0] == a[0], a[0]의 값을 출력
// A
printf("%c\n", *a); // *a == *(&a[0]), *과&이 상쇄됨, a[0]의 값을 추력
// A
printf("%s\n", p); // p에 저장된값 == &a[0]의 주소 -> a배열의 값들을 널값 전까지 전체 출력
// Art
for(i=0; a[i]!='\0'; i++) // a[i]의 값이 널값이 아닐때까지 반복문 실행, 배열의 값 꺼내는 반복문
printf("%c", a[i]); // 'A', 'r', 't'가 꺼내짐 -> Art
return 0;
}
// Art
// A
// A
// Art
// Art
20. C코드의 출력 결과 작성
문제 및 풀이
#include <stdio.h>
int main() {
char* a = "qwer"; // 문자열 qwer의 주소를 포인터 변수 a에 저장
char* b = "qwety"; // 문자열 qwety의 주소를 포인터 변수 b에 저장
int i, j;
// qwer 문자열의 주소를 가진 a의 주소의 값을 하나씩 꺼냄
for(i=0; a[i]!='\0'; i++){
// q, w, e, r 하나씩 꺼냄
// qwety 문자열의 주소를 가진 b의 주소의 값을 하나씩 꺼냄
for(j=0; b[j]!='\0'; j++){
// q, w, e, t, y 하나씩 꺼냄
if(a[i]==b[j]) // a[i]의 값과 b[j]의 값이 같으면 출력(같은 문자 출력)
// a의 문자 하나와 b의 문자 전체를 비교
printf("%c", a[i]); //'q', 'w', 'e' 문자 출력
}
}
}
// qwe
'2024정보처리기사 준비 정리(필기 - 시나공, 실기 - 수제비) > 실기 6강 - 프로그래밍 언어 활용' 카테고리의 다른 글
Chapter 02 - C언어(기출 문제_5) (1) | 2024.06.16 |
---|---|
Chapter 02 - C언어(기출 문제_4) (1) | 2024.06.16 |
Chapter 02 - C언어(기출 문제_2) (1) | 2024.06.13 |
Chapter 02 - C언어(기출 문제_1) (1) | 2024.06.03 |
Chapter 02 - C언어(포인터) (1) | 2024.05.27 |