1. R을 이용하여 다음을 계산하여라. (3점)

(a) $2^{-5}+2^{3}$

2^(-5) + 2^2
[1] 4.03125

(b) $\sqrt{33}$

sqrt(33)
[1] 5.744563

(c) $\sum_{k=1}^{100} \frac{1}{k^2+2k+1}$

k = c(1:100)
sum(1/(k^2+2*k+1))
[1] 0.6350819

2. 다음을 잘 읽고 물음에 답하라. (2점)

(a) 아래와 같은 수열을 생성하라.

$$x=(-10,-9.5,-9.0,...,9.0,9.5,10)$$

(b) 생성된 수열에 대하여 아래를 만족하는 $y$를 계산하라.

$$y=\begin{cases} x & |x|>5 \\ 0 & |x| \leq 2 \\ 5 & o.w. \end{cases}$$

(a)

x <- c(seq(-10,10,0.5))
x
 [1] -10.0  -9.5  -9.0  -8.5  -8.0  -7.5  -7.0  -6.5  -6.0  -5.5  -5.0  -4.5
[13]  -4.0  -3.5  -3.0  -2.5  -2.0  -1.5  -1.0  -0.5   0.0   0.5   1.0   1.5
[25]   2.0   2.5   3.0   3.5   4.0   4.5   5.0   5.5   6.0   6.5   7.0   7.5
[37]   8.0   8.5   9.0   9.5  10.0

(b)

ifelse(abs(x)>5,x, ifelse(abs(x)<=2,0,5))
 [1] -10.0  -9.5  -9.0  -8.5  -8.0  -7.5  -7.0  -6.5  -6.0  -5.5   5.0   5.0
[13]   5.0   5.0   5.0   5.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0   0.0
[25]   0.0   5.0   5.0   5.0   5.0   5.0   5.0   5.5   6.0   6.5   7.0   7.5
[37]   8.0   8.5   9.0   9.5  10.0

3. $x=(-10,-9,-8,\dots,8,9,10)$에 대하여 $h(g(f(x)))$의 계산결과를 구하는 코드를 작성하라. (10점)

단, $f(x)$,$g(x)$, $h(x)$의 정의는 각각 아래와 같다.

  • $f(x)=2x+3 $
  • $g(x)=\frac{e^x}{1+e^x}$
  • $h(x)=max(x,0)$
library(tidyverse)
Warning message:
“package ‘tidyverse’ was built under R version 4.0.3”
── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──

 ggplot2 3.3.5      purrr   0.3.4
 tibble  3.1.6      dplyr   1.0.7
 tidyr   1.1.4      stringr 1.4.0
 readr   2.1.1      forcats 0.5.1

Warning message:
“package ‘ggplot2’ was built under R version 4.0.5”
Warning message:
“package ‘tibble’ was built under R version 4.0.5”
Warning message:
“package ‘tidyr’ was built under R version 4.0.5”
Warning message:
“package ‘readr’ was built under R version 4.0.5”
Warning message:
“package ‘purrr’ was built under R version 4.0.3”
Warning message:
“package ‘dplyr’ was built under R version 4.0.5”
Warning message:
“package ‘stringr’ was built under R version 4.0.5”
Warning message:
“package ‘forcats’ was built under R version 4.0.3”
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
 dplyr::filter() masks stats::filter()
 dplyr::lag()    masks stats::lag()

x = c()

f <- function(x) 2*x + 3
g <- function(x) exp(x)/(1+exp(x))
h <- function(x) ifelse(x>0,x,0)

for (i in -10:10){
    x = f(i) %>% g %>% h
    print(x)
}
[1] 4.139938e-08
[1] 3.059022e-07
[1] 2.260324e-06
[1] 1.670142e-05
[1] 0.0001233946
[1] 0.0009110512
[1] 0.006692851
[1] 0.04742587
[1] 0.2689414
[1] 0.7310586
[1] 0.9525741
[1] 0.9933071
[1] 0.9990889
[1] 0.9998766
[1] 0.9999833
[1] 0.9999977
[1] 0.9999997
[1] 1
[1] 1
[1] 1
[1] 1
f = function(x) 2*x +3 
g = function(x) exp(x) / (1+exp(x)) 
h = function(x) ifelse(x>0,x,0)  
-10:10 %>% f %>% g %>% h
 [1] 4.139938e-08 3.059022e-07 2.260324e-06 1.670142e-05 1.233946e-04
 [6] 9.110512e-04 6.692851e-03 4.742587e-02 2.689414e-01 7.310586e-01
[11] 9.525741e-01 9.933071e-01 9.990889e-01 9.998766e-01 9.999833e-01
[16] 9.999977e-01 9.999997e-01 1.000000e+00 1.000000e+00 1.000000e+00
[21] 1.000000e+00

4. 아래중 옳은것은? (O / X 로 답안지를 쓰고 답의 근거가 되는 코드를 작성할것) (10점)

(a) $1= \frac{1}{2}+\frac{1}{4} +\frac{1}{8} \dots $

f = function(N){
    a<-c()
    a[1]=0.5
    for(n in 2:N) a[n]=a[n-1]*0.5
    sum(a)
}

for(k in 5:20)
    print (c(f(k)))
[1] 0.96875
[1] 0.984375
[1] 0.9921875
[1] 0.9960938
[1] 0.9980469
[1] 0.9990234
[1] 0.9995117
[1] 0.9997559
[1] 0.9998779
[1] 0.999939
[1] 0.9999695
[1] 0.9999847
[1] 0.9999924
[1] 0.9999962
[1] 0.9999981
[1] 0.999999

(b) $e^x= 1+x+x^2+x^3+\dots $

g = function(x, N){
    a<-c()
    a[1] = x
    for(n in 2:N) a[n]=a[n-1]*x
    sum(a)+1
}

x=2
for (k in 5:20)
    print (c(exp(x)-g(x,k)))
[1] -55.61094
[1] -119.6109
[1] -247.6109
[1] -503.6109
[1] -1015.611
[1] -2039.611
[1] -4087.611
[1] -8183.611
[1] -16375.61
[1] -32759.61
[1] -65527.61
[1] -131063.6
[1] -262135.6
[1] -524279.6
[1] -1048568
[1] -2097144

5. 다음을 읽고 물음에 답하라. (10점)

다음은 어느 회사의 연봉에 대한 규정이다.

(가) 입사 첫째 해 연봉은 $a$원이고, 입사 19년째 해까지의 연봉은 해마다 직전 연봉에서 8%씩 인상된다.

(나) 입사 20년째 해부터의 연봉은 입사 19년째 해 연봉의 75%로 한다.

이 회사에 입사한 사람이 28년동안 근무하여 받는 연봉의 총합은?

sal <- c()
sal[1] <- 1
for(i in 2:19){
    sal[i] = sal[i-1]*1.08
}
sal
 [1] 1.000000 1.080000 1.166400 1.259712 1.360489 1.469328 1.586874 1.713824
 [9] 1.850930 1.999005 2.158925 2.331639 2.518170 2.719624 2.937194 3.172169
[17] 3.425943 3.700018 3.996019
for (i in 20:28){
    sal[i] = sal[19]*0.75
}
sal
 [1] 1.000000 1.080000 1.166400 1.259712 1.360489 1.469328 1.586874 1.713824
 [9] 1.850930 1.999005 2.158925 2.331639 2.518170 2.719624 2.937194 3.172169
[17] 3.425943 3.700018 3.996019 2.997015 2.997015 2.997015 2.997015 2.997015
[25] 2.997015 2.997015 2.997015 2.997015
sum(sal)
[1] 68.41939

6. 다음 문장을 읽고 참거짓을 판단하시오. (10점)

(a) _a는 변수이름으로 가능하다.

_a <- 2
a

F
Error in parse(text = x, srcfile = src): <text>:1:1: 예상하지 못한 입력입니다.
1: _
    ^
Traceback:

False

(b) 벡터의 원소는 수치형(numeric)만 가능하다.

c <- c('A', 'B')
print (x=c)
class(x=c)
[1] "A" "B"
[1] "character"

False

(c) 논리형(logical)변수는 수치형 변수로 변환할 수 없다.

d <- c(F, T)
print(x=d)
class(x=d)

d = as.numeric(d)
d
class(x=d)
[1] FALSE  TRUE
[1] "logical"
[1] 0 1
[1] "numeric"

True

(d) R에서 {}는 ()로 바꿀 수 있다.

False

7. 100개의 라커 (15점)

복도에 100개의 라커가 있다. 복도를 어떤 남자가 100개의 라커 문을 전부 연다. 그리고 나서 짝수 번호의 라커를 전부 닫는다. 그 다음에는 번호가 3의 배수인 라커를 순서대로 찾아다니며 열려 있으면 닫고, 닫혀 있으면 연다. 그 다음에는 번호가 4의 배수인 라커를 순서대로 찾아다니며 열려있으면 닫고, 닫혀있으면 연다. 이후에 5의 배수, 6의 배수 .. 인 라커를 순서대로 찾아다니며 행동을 반복한다. 이런식으로 복도를 100번 지나가면 열린 라커의 문은 몇개가 되겠는가?

x = rep(FALSE, 100)
g <- function(x,a){
        n=length(x)
        x[(1:n) %% a == 0] <- x[(1:n) %% a == 0] %>% f
        x
}
x=f(x)
for (i in 2:100){
    x=g(x,i)
}
Warning message in 2:N:
“수치형 표현식(numerical expression)은 100개의 구성요소들을 가지고 있기 때문에 오로지 첫번째 것만을 사용합니다.”
Error in a[n] <- a[n - 1] * 0.5: replacement has length zero
Traceback:

1. f(x)
x
  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [25] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [37] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [61] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [73] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [85] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
 [97] FALSE FALSE FALSE FALSE
sum(x)
[1] 0

8. 무궁화 꽃이 피었습니다. (25점)

총 456명의 참가자가 '무궁화 꽃이 피었습니다' 게임에 참가한다. 기본적인 게임의 규칙은 아래와 같다.

  • 술래는 총 10회간 벽을 보고 '무궁화 꽃이 피었습니다' 를 외친다.

  • 참가자는 술래가 있는 곳 까지 이동해야 살 수 있다.

  • 술래는 벽을 보고 '무궁화 꽃이 피었습니다'를 외치다가 구호가 끝남과 동시에 뒤를 돌아본다. 이때 움직이는 사람은 죽는다

따라서 참가자는 술래가 벽을 보고 '무궁화 꽃이 피었습니다'를 외치는 동안만 이동할 수 있다. 욕심을 부려 더 이동하고자 하면 죽을 수 있다. 반대로 죽는 것을 지나치게 두려워한 나머지 매턴마다 조금씩만 이동한다면 10회의 제한횟수 내에 술래에게 도달하지 못하여 죽는다.

게임환경과 관련된 세부적인 설정은 아래와 같다.

  • 술래와 참가자의 거리는 35이다.

  • 술래는 처음 벽을 보고 $x$초간 무궁화 꽃이 피었습니다를 외친다.

  • 모든 참가자는 1초에 거리1이상 움직일 수 없다고 가정한다. (예를들어 2.4초 동안은 최대 2.4의 거리를 이동할 수 있다. 반면 이동을 원치않으면 0의 거리만큼 움직이므로 0~2.4사이의 거리를 움직일 수 있다)

술래와 참가자에 대한 설정값은 아래와 같다.

술래에 대한 설정값

  • 처음에는 술래가 10초간 무궁화 꽃이 피었습니다를 외친다.

  • 그 다음에는 술래가 9.5초간 무궁화 꽃이 피었습니다를 외친다.

  • 그 다음에도 0.5초씩 구호를 외치는 시간을 줄인다. 이것을 10회 반복한다.

참가자에 대한 설정값

  • 처음에는 참가자가 "본인의번호/100"을 계산하여 나온 숫자만큼 움직인다. 즉 10번 참가자는 0.1의 거리를 움직이고 456번 참가자는 4.56의 거리를 움직인다.

  • 그 다음은 처음에 본인이 이동했던 거리에 1씩 더하여 움직인다. 즉 10번 참가자는 1.1의 거리를 움직이고 456번 참가자는 5.56의 거리를 움직인다.

- 예시1

300번 참가자의 경우 아래와 같이 이동하므로

1회 2회 3회 4회 5회 6회
술래의 외침시간 10 9.5 9.0 8.5 8.0 7.5
참가자의 이동폭 3 4 5 6 7 7.5
참가자의 총 이동거리 3 7 12 18 25 32.5

생존할 수 없다. (6회에서 32.5까지 이동후 사망)

- 예시2

350번 참가자의 경우 아래와 같이 이동하므로

1회 2회 3회 4회 5회 6회
술래의 외침시간 10 9.5 9.0 8.5 8.0 7.5
참가자의 이동폭 3.5 4.5 5.5 6.5 7.5 7.5
참가자의 총 이동거리 3.5 8 13.5 20 27.5 35

생존 할 수 있다. (6회에서 정확하게 7.5초간 이동하고 살아남는다)

- 예시3

400번 참가자의 경우 아래와 같이 이동하므로

1회 2회 3회 4회 5회 6회
술래의 외침시간 10 9.5 9.0 8.5 8.0 7.5
참가자의 이동폭 4 5 6 7 8 5
참가자의 총 이동거리 4 9 15 22 30 35

생존 할 수 있다. (6회에서 5초간만 이동하면 35만큼 이동하므로 살아남는다)

(a) 1번, 67번, 218번, 456번 참가자의 생존여부를 확인하는 함수를 작성하라.

술래

t = c(seq(10,by=-0.5,length.out=10))
t
 [1] 10.0  9.5  9.0  8.5  8.0  7.5  7.0  6.5  6.0  5.5

참가자

$x= \frac{n}{100}+\frac{n}{100}+1+\frac{n}{100}+2+\dots+\frac{n}{100}+9 $

참가자가 생존하기 위해서는 1) 술래의 외침시간 < 이동폭 2) 10회 동안 이동거리 >= 35

num=350
steps = num/100 + 0:9
steps
 [1]  3.5  4.5  5.5  6.5  7.5  8.5  9.5 10.5 11.5 12.5
t >= steps
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
sum(steps[t>=steps])
[1] 27.5
t[t<steps][1]
[1] 7.5
sum(steps[t>=steps]) + t[t<steps][1] >= 35
[1] TRUE
t = c(seq(10,by=-0.5,length.out=10))

surv <- c()

num = 67
steps = num/100 + 0:9
x1 <- sum(steps[t>=steps]) + t[t<steps][1] >= 35

num = 218
steps = num/100 + 0:9
x2 <- sum(steps[t>=steps]) + t[t<steps][1] >= 35

num = 456
steps = num/100 + 0:9
x3 <- sum(steps[t>=steps]) + t[t<steps][1] >= 35

surv <- c(x1, x2, x3)
surv
[1] FALSE  TRUE FALSE

(b) 전체 생존자중 몇명이 살아남는지 계산하라.

t = c(seq(10,by=-0.5,length.out=10))
surv <- c()
for (num in 1:456){
    steps = num/100 + 0:9
    surv[num] <- sum(steps[t>=steps]) + t[t<steps][1] >= 35
}
sum(surv)
[1] 85

9. 다음을 잘 읽고 시각화 하라. (15점)

다음은 인터넷에서 어떠한 자료를 다운받아 매트릭스로 저장하는 코드이다.

df=read.csv("https://raw.githubusercontent.com/guebin/2021IR/master/_notebooks/round2.csv")
mat=as.matrix(df)

매트릭스는 mat이라는 변수에 저장되어 있다.

(a) mat의 첫번째 열을 $x$, 두번째열을 $y$로 생각하고 plot함수를 통하여 아래와 같은 산점도를 그려라.

df=read.csv("https://raw.githubusercontent.com/guebin/2021IR/master/_notebooks/round2.csv")
mat=as.matrix(df)
plot(mat[,1],mat[,2])

(b) 매트릭스의 첫번째 행(first row)를 출력하는 코드를 작성하라.

- 힌트: 출력결과는 (12,313)이 나와야 한다.

X <- mat[1,]
X
  x   y 
 12 313 

(c) (b)의 결과에 아래의 연산을 수행하는 코드를 작성하라.

$$ \begin{bmatrix} 0 & -1 \\ -1 & 0 \end{bmatrix} \begin{bmatrix} 12 \\ 313 \end{bmatrix} $$
Y = rbind(c(0,-1),c(-1,0))
Y
     [,1] [,2]
[1,]  0   -1  
[2,] -1    0  
Y %*% X
     [,1]
[1,] -313
[2,]  -12
f = function(X){
    dim(X)=c(2,1)
    X
}
rbind(c(0,-1),c(-1,0)) %*% f(mat[1,])
     [,1]
[1,] -313
[2,]  -12

(d) (b)-(c) 과정을 mat의 모등행에 반복하여 새로운 매트릭스를 만들어라.

- 힌트: 아래의 과정을 따른다.

  • (i) mat와 동일한 dim을 가진 mat2를 만든다.
  • (ii) mat의 첫번째 행에 (b)-(c)의 과정을 적용하여 길이가 2인 벡터를 얻는다.
  • (iii) (ii)의 과정에서 얻은 벡터를 새로운 매트릭스의 첫번째 행에 넣는다.
  • (iv) mat의 두번째 행에 대하여 (ii)-(iii)의 과정을 반복한다. 이후 세번째, 네번째 행에 대하여 (ii)-(iii)의 과정을 반복한다.
g = function(X){
    dim(X)=c(1,2)
    X
}
mat2 = mat
dim(mat2)
[1] 5513    2
mat2 = mat*0
for (i in 1:5513) mat2[i,] = rbind(c(0,-1),c(-1,0)) %*% f(mat[i,]) %>% g

(e) (d)의 결과로 생성되 매트릭스의 첫번째 열을 x, 두번째 열을 y로 하고 산점도를 그려라. (점의 색은 붉은색으로 하라)

- 힌트: 아래와 같은 그림이 나와야 한다.

plot(mat2[,1],mat2[,2], col='red')