(8주차) 10월28일
볼링공문제풀이, 자료형, 매트릭스 만드는 방법
- 강의영상
- 볼링공문제 (2019 SW마에스트로 입학 테스트)
- 풀이7
- 풀이8
- 풀이 6,7,8
- 데이터형
- mode가 서로 다른 원소로 이루어진 벡터가 있다면, 이 벡터의 mode는 무엇일까?
- 행렬
- 배열 (array)
- 숙제
-
(1/6) 볼링공 문제풀이 (1)
-
(2/6) 볼링공 문제풀이 (2)
-
(3/6) 자료형
-
(4/6) 형변환
-
(5/6) 벡터, 매트릭스(1)
-
(6/6) 매트릭스 (2)
A,B 두 사람이 볼링을 치고 있습니다. 두 사람은 서로 무게가 다른 볼링공을 고르려고 합니다. 볼링공은 총 N개가 있으며 각 볼링공마다 무게가 적혀 있고, 공의 번호는 1번부터 순서대로 부여됩니다. 또한 같은 무게의 공이 여러개 있을 수 있지만, 서로 다른 공으로 간주합니다. 볼링공의 무게는 1부터 M까지의 자연수 형태로 존재합니다.
예를들어 N이 5이고, M이 3이며 각각의 무게가 차례대로 1,3,2,3,2일 때 각 공의 번호가 차례대로 1번부터 5번까지 부여됩니다. 이때 두 사람이 고를 수 있는 볼링공 번호의 조합을 구하면 다음과 같습니다.
(1번,2번), (1번,3번), (1번,4번), (1번,5번), (2번,3번), (2번,5번), (3번,4번), (4번,5번)
결과적으로 두 사람이 공을 고르는 경우의 수는 8가지입니다. N개의 공의 무게가 각각 주어질 때, 두 사람이 볼링공을 고르는 경우의 수를 구하는 프로그램을 작성하세요.
- 입력예시
입력
5 3
1 3 2 3 2
출력
8
$N$개의 볼링공의 무게를 각각 $x_1,\dots,x_N$ 이라고 하자. (단, $x_1,\dots, x_N$은 $\{1,\dots, M\}$사의 자연수의 값을 가지며 서로 같은 값을 가질 수 있다)
예시 $(a_1,\dots, a_5)=(1,3,2,3,2)$ 일 경우 가능한 조합의 집합은 아래와 같다. $(a_1,a_2), (a_1,a_3), (a_1,a_4), (a_1,a_5), (a_2,a_3), (a_2,a_5), (a_3,a_4), (a_4,a_5)$
a<-c(1,3,2,3,2)
a1<-a
a2<-a
dim(a1)<-c(5,1)
dim(a2)<-c(1,5)
a1
a2
a1 %*% a2
- %*% 연산자: 매트릭스의 곱셈을 가능하게 해준다. (중요함)
A = a1 %*% a2
A
upper.tri(A)
- upper.tri(): 그렇게 중요하진 않음
A[upper.tri(A)]
- 매트릭스 인덱싱: 중요함
A[upper.tri(A)] %in% c(4,9)
- %in%연산자: 중요함
sum(!(A[upper.tri(A)] %in% c(4,9)))
--
보총학습 %in% 연산자
a_ = c(1,2,3,4,4,4,5,6,7,8,9,9,9)
a_ %in% c(4,5,9) # _a의 모든원소를 조사하여, 그 원소가 4 혹은 9 이면 True, 아니면 False
a<-c(1,3,2,3,2)
A=outer(a,a)
A
sum(!(A[upper.tri(A)] %in% c(4,9) ))
sum(!(outer(a,a)[upper.tri(outer(a,a))] %in% a**2 ))
-
풀이6: 데이터프레임 활용 $\to$ 사용하기 쉽고 확장성이 좋음
-
풀이7,8: 코드가 간결함 / 에러가 발생할 수 있음
-
R에서 데이터를 구성하는 세가지 기본형
-
수치형(numeric): 정수, 실수, 지수등을 나타내며 실수가 기본형
a=345
mode(a)
a=34.4455
mode(a)
-
논리형(logical): 논리적 참과 거짓을 나타낸다.
a=T
mode(a)
a=TRUE
mode(a)
a=F
mode(a)
a=FALSE
mode(a)
-
문자형
a='asdf'
mode(a)
a='TRUE'
mode(a)
a='1'
mode(a)
-
참고: storgae.mode()
a=pi
a
mode(a)
storage.mode(a)
a=1:2
a
storage.mode(a)
a="331"
mode(a)
-
이것을 수치형으로 바꾸고 싶다.
mode(a)
결과가 "character"이 아니라 "numeric"으로 나오면 좋겠다.
mode(a)<-"numeric"
mode(a)
a
a="331"
mode(a)
a
as.numeric(a)
a=as.numeric(a)
a
a=F
as.numeric(a)
a=1
as.logical(a)
a=0
as.logical(a)
-
그런데 0,1 이외의 숫자를 바꾸면 어떻게 되는가?
a= -1
as.logical(a)
a= 2
as.logical(a)
a= 2.222
as.logical(a)
a='asdfasdfasdf'
a=as.numeric(a)
mode(a)
a='asdfasdfasdf'
a=as.logical(a)
mode(a)
-
예시1
a<-c(1,T,'1')
a
mode(a)
-
예시2
a<-c(1,T)
a
mode(a)
-
결국 mode가 서로 다른 원소로 이루어진 벡터는 없다.
-
서로 다른 기본형을 가지는 원소로 벡터를 만들게 된다면 한가지 형으로 자동 형 변환이 된다.
-
행렬도 벡터와 같이 동일한 형의 원소로 구성된다.
-
행렬의 속성
A=cbind(c(1,2,3,4),c(4,5,6,7),c(2,3,4,1))
A
length(A)
mode(A)
dim(A)
dimnames(A)
-
지금은 이름이 없지만 아래와 같이 이름이 있는 경우도 있다.
x=c(1,2,3,4)
y=c(2,2,3,4)
z=c(3,2,3,4)
A=cbind(x,y,z)
A
a=T
mode(a)<-"character"
dimnames(A)
A=rbind(x,y,z)
A
dimnames(A)
-
예제1
matrix(1:12,ncol=2)
-
예제2
matrix(1:12,ncol=3)
-
예제3
matrix(1:12,nrow=1)
-
예제4
matrix(1:12,nrow=2)
-
예제5
matrix(1:12,ncol=2,byrow=T)
-
예제6
matrix(1:12)
-
예제1
rbind(1:6,rep(c(1,2),3))
-
예제2
rbind(1:5,5:1,1:3)
-
예제3
rbind(1:4,4:1,1:2)
-
예제4
rbind("row1"=1:4,"row2"=4:1,"row3"=1:2)
-
예제1
cbind(1:5,5:1,1:3)
-
예제2
cbind("col1"=1:6,"col2"=6:1,"col3"=1:3)
-
예시1
mat= 1:6
dim(mat)
dim(mat)<-c(2,3)
dim(mat)
mat
-
참고: 동일한 문법논리를 사용해서 이미 만들어진 매트릭스를 벡터로 바꾸는 것도 가능하다.
dim(mat)<- NULL
dim(mat)
mat
-
예시1
array(1:12,dim=c(6,2))
-
예시2
array(1:12,dim=c(3,4))
-
예시3
array(1:2,dim=c(3,4))
-
예시4 (이건 매트릭스가 아니다!)
array(1:2,dim=c(3,4,2))
-
예시5 (이건 매트릭스가 아니다!)
array(1:2,dim=6)
-
배열은 동일한 형의 원소를 p개의 차원으로 구성한 데이터 객체이다.
-
행렬은 2차원배열의 일종이다. $p=2$
-
배열을 선언하는 예시
array(1:2,dim=c(3,4,2))
아래와 같은 메트릭스를 만들고
$A=\begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8& 9 \end{bmatrix}$
$B=\begin{bmatrix} -1 & -2 & -3 \\ -4 & -5 & -6 \\ -7 & -8 & -10 \end{bmatrix}$
$A+B$를 계산하라.
A=asdf
B=asdf
A+B