Search

LV02 기본기 복습(마스킹, 다중카운팅, 인덱스, 함수)

비트배열로 마스킹 하기

1과 0이 들어있는 배열
단순하게 색칠해서 나타낼 수 있음
내가 원하는 값만 뽑아내기 위해, 필요 없는 값을 필터에 거르는 작업을 뜻함

마스킹 예시

#include <iostream> int main() { int mask1[4][4] = { {0,0,0,1},{1,1,0,1},{1,0,0,1},{1,1,1,1} }; int mask2[4][4] = { {1,1,1,1},{1,0,1,1},{1,0,0,0},{1,0,0,0} }; // 합친 배열 선언하기 int arr[4][4]; // 배열 합치기 for (size_t i = 0; i < 4; i++) { for (size_t j = 0; j < 4; j++) { // 논리 연산자 OR을 사용하여 배열을 합친다 // OR 연산자는 둘 중 하나라도 1이면 결과를 1로 출력한다 arr[i][j] = mask1[i][j] || mask2[i][j]; } } for (size_t i = 0; i < 4; i++) { for (size_t j = 0; j < 4; j++) { if(arr[i][j] == 0) { // 값이 0인 부분만 출력한다 == 비어있는 부분만 출력한다 std::cout << "(" << i << "," << j << ")"; } } } return 0; }
C++
복사

다중 카운트

입력받은 숫자가 배열에 몇개 있는지 count 하는 방법
int main() { int arr[5] = { 1, 5, 1, 5, 3 }; int input[3] = { 1, 2, 3 }; for (size_t y = 0; y < 3; y++) { int count = 0; for (size_t x = 0; x < 5; x++) { if (arr[x] == input[y]) { count++; } } std::cout << input[y] << ":" << count; } return 0; }
C++
복사

다중 flag

문자 3개를 입력받고, 입력받은 문자들이 arr배열에 각각 존재하는지 확인하는 방법
int main() { int arr[5] = { 1, 5, 1, 5, 3 }; int input[3] = { 1, 2, 3 }; for (size_t y = 0; y < 3; y++) { int flag = 0; for (size_t x = 0; x < 5; x++) { if (arr[x] == input[y]) { flag = 1; break; } } if (flag == 1) { std::cout << "존재 O"; } else { std::cout << "존재 X"; } } return 0; }
C++
복사
다중 플래그 대신 함수를 만들어 문제를 해결하면 조금 더 간결하면서 가독성 좋게 해결이 가능하다.
다중 플래그 :
2중 for문으로 구현되어 있기 때문에 가독성이 좋지 않다.
구현 하는 입장에서 더 구현하기 어렵다.
isExist 함수 사용:
main함수에서는 1중 for문만 체크하고 있디 때문에 가독성도 좋고
코딩하기도 편하다.
#include <iostream> int arr[5] = { 1, 5, 1, 5, 3 }; int input[3] = { 1, 2, 3 }; int isExist(int data) { for (size_t x = 0; x < 5; x++) { if (arr[x] == data) { return 1; } } return 0; } int main() { for (size_t y = 0; y < 3; y++) { int flag = isExist(input[y]); if (flag == 1) { std::cout << "존재 O"; } else { std::cout << "존재 X"; } } return 0; }
C++
복사
앞으로 문제풀이를 할때는 최대한 함수로 나눌수 있다면 함수를 활용해 문제를 풀어주어라.

Base 인데스와 Offset의 개념

base index는 기준 index라는 말이고 offset 기준 index로부터 얼만큼 떨어져있는지를 나타낸다.
base index [b] 내가 찾고자하는 값은 d다 → offset 2칸이다.
base index [c] 내가 찾고자하는 값은 i 다 → offset 6칸이다.
base index [g] 내가 찾고자하는 값은 d 다 → offset -3칸이다.
마찬가지로 2차원 배열 일때도 가능한 말이다.
base index (1, 1) → x축으로 +1, y축으로 +2 떨어진 값을 출력해라 : 8 출력(offset x:1, y:2)

getsum() 함수 만들기

index 1개를 입력받고 연속된 4개의 배열의 값들의 합을 출력해보자.
예를 들어 1을 입력받으면 3 + 5 + 1 + 7 = 16을 출력
int getSum(int target)함수를 이용해서 문제를 해결해보자
#include <iostream> int vect[9] = {4,3,5,1,7,5,6,8,2 }; int getSum(int target) { int sum = 0; for (int i = target; i < target + 4; i++) { sum += vect[i]; } return sum; } int main() { int idx = 0; std::cin >> idx; int ret = getSum(idx); std::cout << ret << std::endl; return 0; }
JavaScript
복사

두배열이 완전히 똑같은지 확인하는 방법

1중for문을 돌려서 flag기법으로 단순하게 비교해도 좋지만
flag를 함수로 만들어서 사용해줘야 한다.
이제는 코드가 복잡해지고 점점 길어지고 로직도 많아지기 때문에 디버깅과
가독성을 편하게 가지고 가려면 함수로 묶어주는 습관을 꼭!!! 길러줘야한다.
#include <iostream> bool IsSame(char* strA, char* strB) { for (int i = 0; i < 256; i++) { if (strA[i] != strB[i]) // 하나라도 다르면 굳이 더이상 뒷부분을 체크할필요가 없다. { return false; } } return true; } int main() { char strA[256] = "ABCD"; char strB[256] = "ABCE"; bool chekck = IsSame(strA, strB); if (chekck) { std::cout << "Same" << std::endl; } else { std::cout << "Different" << std::endl; } return 0; }
JavaScript
복사

연습문제

문제 1번
아래의 2차배열을 하드코딩 해 주세요.
문자 1개를 입력받고
y, x축의 offset 값을 입력받습니다.
입력받은 문자 위치에서 offset만큼 떨어져 있는 곳의 문자를 출력 함수를 구현 하세요.
만약 T 2 1를 입력받았다면,
T에서 y축으로 + 2 , x축으로 + 1만큼 떨어진
알파벳인 E를 출력하시면 됩니다.

입력 예제

T 2 1

출력 결과

E

문제 2번
숫자배열을 하드코딩 해주세요.
그리고 matching 되는 3x3 비트배열을 입력 받으세요.
해당 배열을 masking 함수에 전달인자로 전달한 후
masking 처리 후 나온 숫자들의 합을 반환 하는 함수를 구현하세요.
그리고 그 반환값을 출력하세요.

입력 예제

1 0 1
0 1 1
1 0 0

출력 결과

16

문제 3번
아래 배열을 하드코딩 하고, 숫자 2개를 입력받습니다.
5
9
4
6
1
5
8
9
첫번째 숫자는 기준점 index 이고,
두번째 숫자는 찾을 Target 숫자 값입니다.
기준점 index로 부터 오른쪽으로 Target 숫자를 찾습니다.
가장 가까운 거리에 있는 Target을 찾아, 그 Offset값을 출력 해 주세요
Offset : 기준점에서 얼만큼 떨어져 있는지를 나타내는 값
예로들어 3과 8을 입력받았다면
3번 index에서부터 오른쪽으로 숫자 8이 어디있는지 찾아야합니다.
가장 가까운 8은 세 번째 떨어진 곳에 존재하므로,
Offset값은 3 입니다.

입력 예제

1 6

출력 결과

2
문제 4번
아래 배열을 하드코딩 해 주세요
그리고 숫자 3개를 배열에다가 입력받아주세요
3
5
9
4
2
1
5
1
5
isExist함수를 이용해서 각각 입력받은 숫자가
하드코딩한 배열안에 존재하는지 출력 해 주세요

입력 예제

3 7 1

출력 결과

3:존재
7:미발견
1:존재
문제 5번
아래 두 mask 배열을 합쳐주세요.
그리고 비어있는 곳의 좌표를 출력하세요.

출력 결과

(2,1)
(2,2)
문제 6번
위 두 배열을 하드코딩 해주세요.
숫자 1개를 입력하고
masking 처리된 곳 중 입력 받은 숫자가 존재하는지 안하는지를 출력 해주세요.
ex)
5를 입력 하면 존재하기 때문에 "5 존재"
1을 입력 하면 없기 때문에 "1 없음"

입력 예제

1

출력 결과

1 없음
문제 7번
아래와 같이 1차 배열을 하드코딩 해 주세요.
그리고 문자 4개를 target 이라는 배열에 입력 받으세요
입력받은 문자 중 총 몇 개의 알파벳이 vect배열 안에 존재하는지 출력하는 함수를 만들어 주세요.
그리고 그 결과를 출력해주세요.
예를들어,
A B Y Z를 입력 하면, B와 Z가 존재하기 때문에 답은 2 입니다.
예를들어,
T K G F를 입력하시면, 숫자 3이 출력 됩니다.

입력 예제

A B Y Z

출력 결과

2
문제 8번
아래의 2차배열을 하드코딩으로 입력해주세요.
숫자 3개를 target 배열에 입력받아 주세요.
각각 vect에 몇개가 있는지 counting 하고, 이중 가장 빈도수가 높은 숫자를 출력 하세요.
ex)
2 3 4
2는 4개, 3은 1개, 4는 2개가 있으므로
2 를 출력 하시면 됩니다.

입력 예제

2 3 4

출력 결과

2
문제 9번
합격자 발표가 났습니다.
합격자 명단인 아래의 배열을 하드코딩 해 주세요.
이제, 존재여부를 찾을 숫자 4개를 univer 배열에 입력 받으세요.
입력받은 숫자들이 존재하면 OK, 없으면 NO를 예제와 같이 출력 해 주세요.
(isExist 함수를 써서 풀어 주세요)

입력 예제

1 3
5 9

출력 결과

OK OK
NO NO
문제 10번
아래의 배열을 하드코딩 해 주세요.
getSum 함수를 위와 같이 정의 해 주세요.
startIndex를 입력 받고 getSum 함수를 이용해서
숫자 다섯개의 합을 출력 해 주세요.

입력 예제

1

출력 결과

14
문제 11번
두명의 이름을 입력 받으세요.
두명의 이름이 완전히 같으면 "동명" 다르면 "남남" 으로 출력 해주세요.
(isSame 함수를 이용)

입력 예제

jason
jason

출력 결과

동명
문제 12번 hp, attackpoint 2개의 정보를 가진 Warrior, Magicion, Archer 클래스를 설계해주세요. 그리고 각각의 객체를 main 함수 안에서 할당해주세요. Warrior, Magicion, Archer 3개의 객체 원본에 접근 할수 있는 주소를 저장할수 있는 3개의 private 멤버변수를 가질수 있는 Party클래스를 설계 해주시고 Party 객체를 만드신 후 public 멤버함수를 통해서 각각의 warrior, archer, magincion 객체의 주소를 인자로 넘겨 멤버변수에 저장할수 있는 객체를 생성해주세요. party 객체를 통해서 3직업의 공격력과 hp를 출력해주세요. 출력 예시
Warrior : HP (100) Att(20) Archer : HP (100) Att(30) Magicion : HP (100) Att(10)

복습문제

문제 1번
아래에 그림처럼 vect배열을 하드코딩 하고, 비트배열을 입력 받으세요.
마스킹 한 후 나오는 값을 7로 바꾸어 출력 해주세요

입력 예제

0 1 1 0 1 1 0

출력 결과

0770770
문제 2번
금고 비밀번호는 3 7 4 9 입니다.
그리고 네 자리 비밀번호를 input 배열에 입력받고,
완전히 동일한 비밀번호인지 isSame 함수를 이용해서 풀어주세요.
동일하면 "pass", 그렇지 않으면 "fail" 로 출력 해주세요.

입력 예제

3 7 4 9

출력 결과

pass
문제 3번
다이어트를 시작하기 위해 칼로리별로 과일이 몇 개 있는지 counting하려고 합니다.
먼저 levelTable 배열을 하드코딩 해 주세요
levelTable에서
lev0(단계0)은 10 <= x <= 20 사이의 칼로리를,
lev1(단계1)은 30 <= x <= 60 사이의 칼로리를,
lev2(단계2)는 100 <= x <= 150 사이의 칼로리를,
lev3(단계3)은 200 <= x <= 300 사이의 칼로리를 뜻합니다.
이제 과일 6개의 칼로리를 입력 받으세요. (숫자 6개 입력)
단계0부터 단계3까지 각 단계마다
과일이 몇개 있는지 Counting 후 출력 해 주세요.

입력 예제

15 15 15 40 100 105

출력 결과

lev0:3
lev1:1
lev2:2
lev3:0
문제 4번
map 배열을 하드코딩하고,
pix 배열에 숫자 4개를 입력받으세요
pix배열에 있는 색상값들이 map에 존재하는 컬러인지 확인해주는 함수를 작성 해주세요.
만약 pix배열에
1 10
55 -5
값이 입력되었다면, 아래 그림같이 배열에 값이 채워집니다.
pix 배열에 있는 컬러가 map에 결과를 반환값으로 받아서
결과에 따라 있다면 Y를, 없다면 N을 출력하면 됩니다.
ex)

입력 예제

1 10
55 -5

출력 결과

N N
Y Y
문제 5번
arr배열에 숫자 6개를 입력 받습니다.
masking 처리 후 남은값들 중에서
min값을 찾고 min값의 index를 반환하는 함수를 만들어 주세요.
그리고 결과를 출력 하세요.

입력 예제

3 5 4 2 5 1

출력 결과

arr[0]=3
문제 6번
masking 처리 후, 3부터 5사이의 숫자가 존재하는지 출력 하는 함수를 만들어 주세요.
(3 <= x <= 5)
ex)
존재하면 "발견"
존재하지 않으면 "미발견"

입력 예제

1 1 1
1 0 0
1 0 0

출력 결과

발견
문제 7번
3
5
4
2
위 배열을 하드코딩하고,
네 자리 비트배열을 입력 받으세요.
마스킹 처리 후, 남은 숫자들의 합을 구해주는 함수를 만들어 주세요.
해당 결과를 받아서 출력하면 됩니다.
예를들어
0 1 0 1 을 입력했다면, 다음과 같이 그릴 수 있습니다.

입력 예제

0 1 0 1

출력 결과

7
문제 8번
문자 1개를 입력 받으세요.
해당 알파벳이 'M'(2,2)로 부터 얼만큼 떨어져있는지 offset값을 출력 하는 함수를 만들어 주세요.
(offset : y,x 기준)
예를들어
N은 0,1 만큼 떨어져있고,
H는 -1,0 만큼 떨어져있습니다.

입력 예제

F

출력 결과

-1,-2 (y, x)
문제 9번
계산기 클래스를 만들고 객체(변수)를 한개 생성하세요.
계산기 클래스에는 두수의 덧셈, 뻇셈, 나눗셈, 나머지, 곱셈을 계산하는 멤버함수를 구현 해주세요.
계산 결과의 반환값을 출력해주세요.

입력 예제

2 3

출력 결과

덧셈 : 5
뺄셈 : -1
곱셈 : 6
나눗셈 : 0
나머지 : 0