달력

52024  이전 다음

  • 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

달팽이 배열과 주소 연산

문제: 달팽이 배열을 만들어서 출력하는 프로그램을 짜라.

 

 

여러 가지 방식이 있겠으나, 본인은 '배열을 1차원화 하여 그 주소를 2차원 배열처럼 접근'해서 풀었습니다.

얼핏보면 1차원 배열을 출력만 2차원 스럽게 한 것이 아니냐는 오해를 받을 수도 있는데,

아닙니다. 1차원 배열이든 2차원 배열이든 똑같이 연속된 주소값입니다.

따라서 본인이 만든 배열의 주소포인터로 2차원 배열로 선언하면 그 것이 곧 2차원 배열인 것이다.

(궤변이라고 생각하면 추천을 눌러라!)

 

 

우선 아래 코드를 보면..

본인은 1차원 배열을 할당하였다.

중요한 건. Scanf로 입력받는 달팽이 크기 length에 따라..

훗날 (in the future! 하나 알았다고 계속 써먹는구나!)…

즉, go up이나 go down 시에 1차원 내에서 이동하는 칸 수가 정해진다 (즉, length 만큼 이동한다).

변수 goright는 오른쪽으로 이동하려고 대기탈 때..이동하는 동선에 포함된 총 원소 개수다.

따라서…7*7배열에서..

1차 오른쪽 이동 동선에는 7개의 원소(0번지~6번지)가 있고,

2차 오른쪽 이동 동선에는 6개의 원소 (7번지~12번지)가 있다.

이 때 왜 13번지가 빠지냐 하면..1차 오른쪽 이동후, 1차 하향이동(코드 주석에 'go down'이라는 부분)하면서…

6번지+7->13번지에 값이 쓰여졌기 때문이다…아래 코드를 보면..

 

 

 

그래서 2차 오른 쪽 이동시에는 goright--로 인해 이동 동선의 원소의 개수 (즉, 값을 채워넣는 행위 횟수)가 1 줄어든다.

그렇다면 오른쪽 이동이 1차인지, 2차인지는 어떻게 판별할까?

바로 if(Dircnt>5)이다. 이 Dircnt라는 변수가 각 방향 이동시에 ++ 되어, 지금이 몇 차례 이동인지가 판별된다.

허나 오른쪽 이동외에는, 나머지 방향 (go down, go left, go up) 이동은..2차 시에 전부 2씩 줄어든다.

(아래 코드 참조)

 

 

그래서 각 방향의 이동코드에 첫 부분에.. godown=godown-2; 와 같은 식을 적는 것이당. 당당당!

 

 

아래 go up 부분도 마찬가지다.

뭐 go right 부분만 알면 나머지 세 개는 거의 똑같다.

첫 부분의 if문에서..goto labelA 요거는… goup의 원소갯수가 1일 때.

즉, 위로 올라갈려는데, 자기 말고는 더 이상 올라갈려는 게 없을 때를 말한다.

이 때는 모든 대입이 끝난 상태이므로, 출력 레이블로 탈출한다.

 

 

아래 출력레이블은 일반적인 출력용 반복문이다.

단지 특이사항이라고 하면, 주소 접근이다.

 

 

이상으로 달팽이 배열과 주소 연산에 대한 문제를 풀어보았습니다.

추천 눌러주시고~ 좋은 하루 보내세요~~~

Posted by C언어 보이
|

반복문을 사용하여 이차원 배열의 값을 회전시키는 문제 입니다.

문제 : 4*4배열을 선언하여 아래처럼 값을 회전시켜라.

 

 

위 배열을 icount[4][4]로 하여 값을 대입합니다.

밑에 newcount[4][4] 배열은 훗날 (int the future!ㅋ), icount를 회전시킨 값을 넣습니다.

그리고 그 아래 메인에서 반복문이 2개가 보이네요…

첫 번 째 반복문은 icout 배열의 초기상태를 출력하는 용도입니다.

그 아래 반복문은, 회전시킬지 말지를 입력받는 것입니다.

즉, change함수를 부르는 조건입니다.

 

 

인제 문제의 핵심인 change 함수를 보기로 할까요?

말까요?

봅시다! change함수는 한 번 호출될 때 마다 icount 배열의 값이 90도씩 회전하여 대입시키는 데요.

그 구조를 크게 요약하면..icount[i][j]값을 icount[i][j]에 입력하는 것이 아닙니다. 그렇게 되면...값이 덮어써져 버려요.

그래서 그와 같은 icount 배열은 쓰는 용도, newcount 배열은 값을 불러오는 용도가 되는 것이죵. 그럼 더 자세히 봅시다..

우선 위의 첫번 째 반복문..그 안에 있는 반복문 실행식이 핵찜! 입니다.

Icount[j][3-i]. 요 식을 자알~생각해 보세요. 긴 설명은 의미가 없을 것 같네요.

 

그 아래 반복문은 출력 및, newcount 업데이트용 반복문 입니다.

업데이트용? 다음 번 change함수 실행(윗 반복문)에서 값의 대입을 위한 것 입니다.

 

이상으로 배열값의 이동 : 반복문, 이차원 배열에 대하여 알아보았습니다.

추천, 링크 많이 많이 눌러주세요~ㅋ

Posted by C언어 보이
|

문제: 재귀함수를 이용하여 2의 n승을 구하는 프로그램을 작성하라

풀이: 1. 탈출조건 및 실행식은 재귀함수 앞에 적어준다.

2. 'count==num'때는 이미 2의 count(==num)승을 하고 난 이후이므로, 탈출조건을 실행식 앞에 쓴다.

이상으로 2의 n승 구하기, 재귀함수에 대해서 알아보았다.

Posted by C언어 보이
|

문제 : 정수 n을 입력받고 2의 k승<=n을 만족하는 k의 최대값을 구하기

풀이 : 제곱승의 표현은, 숫자=숫자*2를 반복할 때 마다 k를 증가하여 표현. 반복문을 탈출할 때의 k값이 승수 값이 된다.

 

이상으로 승수 구하기 프로그램, 반복문에 대하여 알아보았다.

Posted by C언어 보이
|

문제 : 초를 입력받아 시, 분, 초로 구하라.

핵심 : '정수/정수 = 몫 + 나머지는 항상 0 '인 성질을 이용한다.

Posted by C언어 보이
|

문제 : 10개의 소수를 출력하는 프로그램을 작성하라

핵심 : 1. 실행조건식 div<num&&num%div!=0 : 특정 숫자 num 1 num 사이의 숫자로 나누어 번도 나누어 지지 않을 .

2. 검사식 div==(num-1) : 실행조건 'num%div!=0' 번도 위배한 적이 없을 이와 같이 나타난다. 이는 소수를 의미.

3. 2 까지 소수 구하는 식을 count 써서 9만큼 반복한다. 2 특수한 경우로서 앞에 준다.

 

 

 

이상으로 소수 출력 프로그램, % 연산자에 대해서 알아보았다.

Posted by C언어 보이
|

문제 . 3500원으로 세 가지 물건을 사기. 수량은 마음데로이나 모든 종류를 사기. 500,700,400원 짜리 임.

 

핵심: 세 물건을 x,y,z로 놓고.

  1. 조건식은 500*x+700*y+400*z==3500
  2. 이제 위를 만족하는 x,y,z를 구한다
    1. 모든 경우의 수를 조회하여, 조건식을 만족할 때에만 출력하면 된다
    2. 삼중포문을 이용한다. X에 대한 포문, y,z…
Posted by C언어 보이
|

문제 : 두 개의 정수를 입력받아 최대 공약수를 구하기

핵심 : 1. 나머지 연산자로 공약수 구하기 : 조건은, (num1%gong==0&& num1%gong==0)

2. 약수(gong)을 증가시키면서 조건을 만족하는 것 중에 최후의 수를 GCM(최대공약수)에 대입. GCM 출력.

Posted by C언어 보이
|

문제 : 임의의 두 정수 사이에 있는 구구단을 출력하라. 가령 5,2 -> 2단에서 5단까지 출력.

핵심 : 1. 한 단에 대한 구구단 출력함수를 만들고 반복호출한다.

2. 반복호출할 조건을 잘 설정한다. 즉, 대소비교를 통해 작은 수를 구구단 출력함수의 인자로 전달, 반복문에서 그 작은 수를 ++ 시킴.

 

이상으로 구구단 출력 프로그램을 작성하였음.

Posted by C언어 보이
|

 

문제 : 10진수->16진수 진수변환 프로그램 작성하라.

핵심은 출력서식을 16진수로 바꾸면 된다.

Posted by C언어 보이
|