방향을 표현하기 위한 코딩 방법(Direct 기법)
스타듀밸리 같은 2D 게임에서 낫질을 할 때 기준점 주변의 8칸을 하고, 물뿌리개를 할 때 앞에 3칸을 택하는 것처럼 로직을 각각 정해두고 사용할 수 있다.
젤다의 전설같은 3D 게임도 사실 2차원 평면도에 따라 로직을 구성한 것이다.
#include <iostream>
int main() {
int arr[3][3] = {
1,2,3,
4,5,6,
7,8,9
};
// 기준점을 (0,0) 으로 뒀을 때 좌표값의 배열
int direct[4][2] = {
-1, 0, // 상
1, 0, // 하
0, -1, // 좌
0, 1 // 우
};
int y = 1;
int x = 1;
// 입력받을 경우
// int x, y;
// std::cin >> y >> x;
int sum = 0;
// 4X2 배열 direct 에서
for (size_t i = 0; i < 4; i++)
{
int newY = y + direct[i][0];
int newX = x + direct[i][1];
// ex) newX = 기존의 좌표값에 direct 배열의 x 좌표값을 더한다.
// ex) newY = 1 + direct[0][0] (=-1) => 0
// ex) newX = 1 + direct[0][1] (=0) -> 1
// ex) newY, newX = 0, 1
// ex) arr[0][1] = 2
if (newX >= 0 && newX <= 2 && newY >= 0 && newY <= 2)
{
sum += arr[newY][newX];
}
}
std::cout << sum;
return 0;
}
C++
복사
// Level 19. 문제1
#include <iostream>
int main() {
int arr[3][3] = {
3, 5, 4,
1, 1, 2,
1, 3, 9
};
int y, x;
std::cin >> y >> x;
int direct[4][2] = {
-1, 0,
1, 0,
0, -1,
0, 1
};
int sum = 0;
for (size_t i = 0; i < 4; i++)
{
int newY = y + direct[i][1];
int newX = x + direct[i][0];
if (newX >= 0 && newX <= 2 && newY >= 0 && newY <= 2) {
sum += arr[newY][newX];
}
}
std::cout << sum;
return 0;
}
C++
복사
2중 포인터 변수
int num = 10; // 변수 선언
int* ptr_num = # // 포인터 선언
int** pptr_num = &ptr_num; // 포인터의 포인터 선언
#include <iostream>
// 포인터 변수 = 주소값(주소 타입)을 저장하는 변수 타입
// int* P = &a; (a의 주소값을 포인터 변수의 값으로 가진다)
// int 변수 = 정수형 숫자를 저장하는 변수 타입
// char 변수 = 문자형 글자를 저장하는 변수 타입
// 2중 포인터 변수
// (int a = 100) == (int* P = &a) == (int** PP = &P) == (&P = 0X17)
int main() {
int a = 100;
int* p = &a;
int** pp = &p;
*(*pp) = 200;
// 결국 a의 값이 변한다.
return 0;
}
C++
복사
구조체, 클래스를 이용한 배열
// 구조체, 클래스를 이용한 배열
struct ABC
{
int a;
int b;
};
int main()
{
ABC arr[3];
arr[0].a = 100;
arr[0].b = 200;
std::cin >> arr[0].a >> arr[0].b;
std::cout << arr[0].a << arr[0].b;
return 0;
}
C++
복사
패턴찾기 → 2중 for문에서 패턴찾기
#include <iostream>
// 패턴찾기 -> 2중 For문에서 패턴찾기
int map[5][5] = {
1, 3, 5, 1, 5,
3, 7, 9, 5, 8,
4,5,3,9,7,
2,7,6,1,9,
1,6,2,3,8
};
int pattern[2][2] = {
3, 5,
7, 9
};
int isPattern(int dy, int dx) {
for (size_t y = 0; y < 2; y++)
{
for (size_t x = 0; x < 2; x++)
{
if (map[dy + y][dx + x] != pattern[y][x]) {
return 0;
}
}
}
return 1;
}
int main() {
for (size_t y = 0; y < 4; y++)
{
for (size_t x = 0; x < 4; x++)
{
int result = isPattern(y, x);
if (result == 1) {
std::cout << "존재";
}
else {
std::cout << "노존재";
}
}
}
return 0;
}
C++
복사
#include <iostream>
char map[3][4] = {
{'A', 'B', 'G', 'K'},
{'T', 'T', 'A', 'B'},
{'A', 'C', 'C', 'D'}
};
char pattern[2][2];
char isPattern(char y, char x) {
for (size_t y = 0; y < 2; y++)
{
for (size_t x = 0; x < 2; x++)
{
if (map[y][x] != pattern[y][x]) {
return 0;
}
}
}
return 1;
}
char main() {
for (size_t i = 0; i < 2; i++)
{
std::cin >> pattern[i][0];
std::cin >> pattern[i][1];
}
for (size_t i = 0; i < 2; i++)
{
for (size_t j = 0; j < 3; j++)
{
int result = isPattern(i, j);
if (result == 1) {
std::cout << "발견\n";
}
else {
std::cout << "미발견\n";
}
}
}
return 0;
}
C++
복사
연습문제
문제 1번
위 3x3 배열을 하드코딩 해주세요.
그리고 좌표 하나를 입력 받아주세요.(y, x)
입력받은 좌표에서 바로 윗칸, 아랫칸, 왼쪽칸, 오른쪽칸의 합을
Direct 방식을 이용한 함수를 만들어 주세요.
그리고 그 결과를 출력 해주세요.
ex1) 1 1 입력시 (y, x)
이므로 5+1+2+3 = 11 출력
ex2) 0 1 입력시 (y, x)
유효한 칸은 세칸이므로 3+1+4 = 8 출력
입력 예제
1 1
출력 결과
11
문제 2번
Data 구조체를 만들고 구조체 변수 a, b를 만들어 주세요.
숫자 6개를 a.x , a.y , a.z , b.x , b.y , b.z 에 각각 입력 받고,
a.x + b.x
a.y + b.y
a.z + b.z 값을 출력 해주세요.
ex)
입력:
1 2 3
4 5 6
출력:
5
7
9
입력 예제
1 2 3
4 5 6
출력 결과
5
7
9
문제 3번
왼쪽과 같은 형태의 구조체를 정의해주세요.
그리고 구조체 변수 bob, tom을 만들고, 문장 4개를 구조체 변수에 입력 받아주세요.
sanghi, bulgogi, chicken, dove
만약 네 문장을 아래와 같이 입력 받았다면, 아래와 같이 채워주세요.
이제 각각 몇글자인지 출력하면 됩니다.
입력 예제
sanghi
bulgogi
chicken
dove
출력 결과
bob.burger1=6
bob.burger2=7
tom.burger1=7
tom.burger2=4
문제 4번
t와 Q는 더블포인터 입니다.
위 상태를 구현하고
변수 G에다가 숫자 1개를 입력 받으세요.
그리고 **t, *K의 값을 출력 해주세요.
입력 예제
5
출력 결과
5 5
문제 5번
네쌍의 좌표를 input 배열에 입력 받아주세요.
그리고 vect배열 4x3에 배열을 만들고 0으로 초기화 해 주세요.
vect배열에서 input 배열에 든 좌표에 해당하는 곳을 찾아 그 좌표에 숫자 5를 넣어주세요.
그리고 그 결과를 출력 해주세요.
[HINT]
vect[0][1] = 5;
vect[1][0] = 5;
vect[3][0] = 5;
vect[3][1] = 5;
입력 예제
0 1
1 0
3 0
3 1
출력 결과
0 5 0
5 0 0
0 0 0
5 5 0
문제 6번
위와 같이 구조체 기차에 사람들이 타고 있습니다.
win에는 나이가
name에는 이름이 적어져 있습니다.
tom은 첫사랑을 찾기 위해 이 기차를 탔습니다. (구조체 배열 기차 입니다)
tom의 첫사랑 이름과 나이를 입력받고, 몇번 index에 있는지 찾아서 출력해주세요.
[힌트1] 구조체변수 하드코딩 하기
#include<iostream>
using namespace std;
struct Node
{
int x, y;
};
int main()
{
Node a = { 3, 4 };
Node b = { 5, 6 };
cout << a.x << " " << a.y << endl;
cout << b.x << " " << b.y << endl;
}
C++
복사
[힌트2] 구조체배열 하드코딩하기
#include<iostream>
using namespace std;
struct Train
{
int win;
char name[8];
};
int main()
{
Train t[3] = { {35, "ABC"}, {100, "BBQ"}, {15, "KFC"} };
cout << t[0].name;
}
C++
복사
[힌트3] 문장은 비교가 되지 않습니다.
char a[10] = "BBQ";
char b[20] = "ABC";
if (a == b) //error!
for문을 돌려 한 글자씩 비교를 해주어야 합니다.
함수를 만들어 비교를 하면 됩니다.
입력 예제
summer
20
출력 결과
5
문제 7번
map 배열을 하드코딩 해주세요.
그리고 sum(y,x) 함수를 만들어 주세요.
이 함수는 특정좌표(y,x)에서
왼쪽위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래의 합을 return 해주는 함수입니다.
이 sum함수를 이용해서 가장 큰 값이 나오는 좌표를 출력하세요.
(direct 기법을 사용해주세요, 입력값은 없습니다.)
출력 결과
3 2
문제 8번
4x5 char 배열을 준비해주세요.
값을 '_' 문자로 꽉 채워주세요.
폭탄을 투하할 좌표 두곳을 입력 받아주세요.(y,x)
만약 폭탄이 (1,1)에 투하되면 8방향으로 폭탄이 터집니다.
따라서
그리고 다시 (3,3)에 투하 되면 8방향으로 폭탄이 터집니다.
따라서
폭탄 2개가 투하 되었을때 그 현장을 출력 해주세요.
(Direct 기법을 사용해서 코딩해주세요)
입력 예제
1 1
3 3
출력 결과
# # # _ _
# _ # _ _
# # # # #
_ _ # _ #
문제 9번
4x4 image배열이 있습니다.
먼저 4x4 image배열에 숫자를 입력 받아주세요.
image 배열의 특정 좌표를 지목하면,
2x3 사이즈의 합을 return 해주는 rectSum 함수를 만들어 주세요
예를들어 rectSum(0,0)을 호출하면 1+5+5+4+2+1 = 18 이 return 됩니다.
위 예제에서는 (2,0)이 최대 합 입니다.
이 함수를 활용하여 2x3 사이즈의 합의 최대값이 나오는 좌표를 찾아주세요.
(direct를 쓰는 문제가 아닙니다)
입력 예제
1 5 5 4
4 2 1 1
3 9 3 2
4 5 9 1
출력 결과
(2,0)
날짜를 다루는 Date 클래스를 작성하고자한다. Date를 이용하는 main()과 실행 결과는 다음과 같다. 클래스 Date를 작성하여 아래 프로그램에 추가하라.
int main()
{
Date birth(2014, 3, 20);
Date independenceDay("1945/8/15");
independenceDay.show();
cout << birth.getYear() << ',' << birth.getMonth() << ',' << birth.getDay() << endl;
return 0;
}
JavaScript
복사
JavaScript
복사
복습문제
문제 1번
※ main 함수에서 a, b를 출력 해주세요.
입력 예제
4 2 5 3 8
출력 결과
a=8
b=2
문제 2번
5x4 배열에 0 또는 1로 구성된 숫자들을 입력받아주세요.
입력받은 배열에 있는 숫자 1은 세포를 뜻합니다.
세포 1주변에 아무것도 없으면 세포들이 안정된 상태입니다.
즉, 8방향 모두 아무런 숫자가 없어야 합니다.
아래 예제를 참고하여,
입력받은 세포상태가 "안정된 상태"인지 "불안정한 상태"인지 출력 하세요.
입력 예제
0 0 0 0
1 0 0 0
0 0 1 0
0 0 0 0
1 0 0 1
출력 결과
안정된 상태
문제 3번
1~16 사이의 숫자 4개를 입력 받고 배열에 채워주세요.
총 16칸짜리인 4x4 배열을 만들어 주세요.
4x4 배열에 아래와 같이 번호를 매긴다고 했을때
입력받은 숫자 4개에 해당하는 번호에 값을 1부터 순차적으로 채워준 후 출력 해주세요.
아래 예제를 참고하여 소스코드를 작성해주세요.
입력 예제
3 10 11 15
출력 결과
0 0 1 0
0 0 0 0
0 2 3 0
0 0 4 0
문제 4번
가로 또는 세로를 색칠하는 프로그램을 짜야 합니다.
4x4 배열 하나를 준비 해 주세요.
만약
G 3이라고 입력 받으면 가로 3번줄이 색칠 됩니다.
S 2를 입력 받으면 세로 2번줄이 색칠 됩니다.
이러한 규칙으로 3개의 명령어를 입력 받고 결과를 출력 하세요.
ex)
입력:
G 3
S 2
S 0
출력:
입력 예제
G 3
S 2
S 0
출력 결과
1 0 1 0
1 0 1 0
1 0 1 0
1 1 1 1
문제 5번
왼쪽 그림과 같은
sketchbook 구조체를 정의
하고,
구조체 변수 1개
를 만들어 주세요.
이미지에 들어갈 내용을 구조체 변수안 image char배열에 입력받고,
어떤 무늬로 구성되어 있는지 알파벳 순서대로 출력하세요.
(입력되는 문자는 모두 대문자입니다)
ex)
[입력] [출력]
ATK AGKT
AAA
TTG
입력 예제
BBB
BCD
DZZ
출력 결과
BCDZ
Level19.5 비밀 위치 찾기 [난이도 : 4]
3x4 map배열은 위와 같이 하드코딩 하고,
2x2 pattern배열을 입력 받아주세요.
그리고 map배열에 pattern라는 패턴 배열이 존재하는지 확인하고
몇개인지 출력 하면 됩니다.
pattern을 체크 하는 함수를 이용하여 구현해주세요.
만약, pattern이 존재하고 1개가 발견되었다면 "발견(1개)" 출력
만약, pattern이 없다면 "미발견" 출력
입력 예제
AB
CD
출력 결과
발견(1개)
문제 6번
3x4 map배열은 위와 같이 하드코딩 하고,
2x2 pattern배열을 입력 받아주세요.
그리고 map배열에 pattern라는 패턴 배열이 존재하는지 확인하고
몇개인지 출력 하면 됩니다.
꼭 함수를 이용하여 구현해주세요.
만약, pattern이 존재하고 1개가 발견되었다면 "발견(1개)" 출력
만약, pattern이 없다면 "미발견" 출력
입력 예제
AB
CD
출력 결과
발견(1개)
문제 7번
2x2 size의 bitarray 배열을 입력 받고, map 배열을 하드코딩 하세요.
bitarray를 map의 (0,0)에 masking하면 나오는 값은
이고 합은 11입니다.
bitarray를 map에다 masking 후
합을 구해주세요.
합을 구하는 기능은 함수로 구현해주세요.
해당 함수를 이용해 가장 큰 값이 나오는 좌표를 출력 하세요.
입력 예제
1 1
1 0
출력 결과
(0,1)
문제 8번
은행에서 사용하는 프로그램을 작성하기 위해, 은행 계좌 하나를 표현하는 클래스 Account가 필요하다. 계좌 정보는 계좌의 주인, 계좌 번호, 잔액을 나타내는 3 멤버 변수로 이루어진다. main() 함수의 실행 결과가 다음과 같도록 Account 클래스를 작성하라.
int main()
{
Account a("kitae", 1, 5000);
a.deposit(50000);
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
int money = a.withdraw(20000);
cout << a.getOwner() << "의 잔액은 " << a.inquiry() << endl;
return 0;
}
JavaScript
복사
문제 9번
CoffeeMachine 클래스를 만들어보자. main() 함수와 실행 결과가 다음과 같도록 CoffeMachine 클래스를 작성하라. 에스프레소 한 잔에는 커피와 물이 각각 1씩 소비되고, 아메리카노의 경우 커피는 1, 물은 2가 소비되고, 설탕 커피는 커피 1, 물 2, 설탕 1이 소비된다. CoffeeMachine 클래스에는 어떤 멤버 변수와 어떤 멤버 함수가 필요한지 잘 판단하여 작성하라.
int main()
{
CoffeeMachine java(5, 10, 3);
java.drinkEspresso();
java.show();
java.drinkAmericano();
java.show();
java.drinkSugerCoffee();
java.show();
java.fill();
java.show();
return 0;
}
JavaScript
복사