[R] 프로그램 흐름제어 (2) - 반복문
주어진 조건을 충족하는 동안 {}
안의 구문을 반복적으로 수행하는 형태를 반복문이라고 합니다.
#01. while문
주어진 조건이 참을 충족하는 동안 수행되는 문법
1) 구문 형식
초기식, 조건식, 증감식의 요소를 충족해야 성립된다.
초기식
while (조건식) {
... 반복적으로 수행될 구문 ...
증감식
}
2) 예제 패턴
1부터 10까지 반복하기
x <- 1 # 초기식 -> 반복에 사용될 조건값을 지정한다.
while (x <= 10) { # 조건식 -> x가 10보다 작거나 같은 동안 반복수행
k <- sprintf("x=%d", x) # 반복이 진행되는 동안 수행할 명령
print(k)
x <- x + 1 # 증감식 -> 조건에 사용되는 값을 변경
}
💻 출력결과
[1] "x=1"
[1] "x=2"
[1] "x=3"
[1] "x=4"
[1] "x=5"
[1] "x=6"
[1] "x=7"
[1] "x=8"
[1] "x=9"
[1] "x=10"
구구단 7단 출력하기
y <- 1 # 초기식
while (y < 10) { # 조건식 -> 10보다 작다이므로 10은 포함되지 않음.
z <- 7 * y # 반복이 진행되는 동안 수행할 명령
str <- sprintf("7 x %d = %d", y, z)
print(str)
y <- y + 1 # 증감식 -> y가 1씩 증가함
}
💻 출력결과
[1] "7 x 1 = 7"
[1] "7 x 2 = 14"
[1] "7 x 3 = 21"
[1] "7 x 4 = 28"
[1] "7 x 5 = 35"
[1] "7 x 6 = 42"
[1] "7 x 7 = 49"
[1] "7 x 8 = 56"
[1] "7 x 9 = 63"
1부터 10까지의 총 합 구하기
반복이 진행되는 동안 결과의 누적 합산해야 한다.
합산을 위해 반복이 시작되기 전에 값이 누적될 변수를 미리 준비해 놓는다.
x <- 1 # 초기식
sum <- 0 # 총 합을 누적해서 저장할 변수
while (x <= 10) { # 조건식 -> x가 10보다 작거나 같은 동안 반복수행
sum <- sum + x
k <- sprintf("x=%d, sum=%d", x, sum)
print(k)
x <- x + 1 # 증감식 -> 조건에 사용되는 값을 변경
}
💻 출력결과
[1] "x=1, sum=1"
[1] "x=2, sum=3"
[1] "x=3, sum=6"
[1] "x=4, sum=10"
[1] "x=5, sum=15"
[1] "x=6, sum=21"
[1] "x=7, sum=28"
[1] "x=8, sum=36"
[1] "x=9, sum=45"
[1] "x=10, sum=55"
값의 변화량 조절 - 0부터 100전(=99)까지 10씩 증가
a <- 0 # 초기식
while (a < 100) { # 조건식
k <- sprintf( "a=%d", a )
print(k)
a <- a + 10 # 증감식
}
💻 출력결과
[1] "a=0"
[1] "a=10"
[1] "a=20"
[1] "a=30"
[1] "a=40"
[1] "a=50"
[1] "a=60"
[1] "a=70"
[1] "a=80"
[1] "a=90"
값의 변화량 조절 - 10부터 0전(=1)까지 2씩 감소
b <- 10
while (b > 0) {
k <- sprintf( "b=%d", b )
print(k)
b <- b - 2
}
💻 출력결과
[1] "b=10"
[1] "b=8"
[1] "b=6"
[1] "b=4"
[1] "b=2"
#02. For문
초기식, 증감식, 조건식에 해당하는 부분을 한 행에 모두 명시하는 형태.
반복문보다 반복 범위의 파악이 용이하기 때문에 사용 비중이 높다.
1) 구문 형식
- 시작값과 종료값을 지정한다.
- 증가량은 생략할 경우 1로 지정된다.
for (변수 in seq(시작값, 종료값 [, 증가량])) {
...
}
2) 예제 패턴
1부터 10까지 반복하기
for (x in seq(1, 10)) {
k <- sprintf("x=%d", x)
print(k)
}
💻 출력결과
[1] "x=1"
[1] "x=2"
[1] "x=3"
[1] "x=4"
[1] "x=5"
[1] "x=6"
[1] "x=7"
[1] "x=8"
[1] "x=9"
[1] "x=10"
구구단 7단 출력하기
for (y in seq(1, 9)) {
z <- 7 * y # 반복이 진행되는 동안 수행할 명령
str <- sprintf("7 x %d = %d", y, z)
print(str)
}
💻 출력결과
[1] "7 x 1 = 7"
[1] "7 x 2 = 14"
[1] "7 x 3 = 21"
[1] "7 x 4 = 28"
[1] "7 x 5 = 35"
[1] "7 x 6 = 42"
[1] "7 x 7 = 49"
[1] "7 x 8 = 56"
[1] "7 x 9 = 63"
1부터 10까지의 총 합 구하기
반복이 시작되기 전에 값이 누적될 변수를 미리 준비해 놓는다.
sum <- 0 # 총 합을 누적해서 저장할 변수
for (x in seq(1, 10)) { # 조건식 -> x가 1부터 10까지 1씩 증가하면서 수행
sum <- sum + x
k <- sprintf("x=%d, sum=%d", x, sum)
print(k)
}
💻 출력결과
[1] "x=1, sum=1"
[1] "x=2, sum=3"
[1] "x=3, sum=6"
[1] "x=4, sum=10"
[1] "x=5, sum=15"
[1] "x=6, sum=21"
[1] "x=7, sum=28"
[1] "x=8, sum=36"
[1] "x=9, sum=45"
[1] "x=10, sum=55"
값의 변화량 조절 - 0부터 99까지 10씩 증가하는 범위 안에서의 반복 수행
for (변수 in seq(시작값, 종료값, 증가량)) {
...
}
for (a in seq(0, 99, 10)) {
k <- sprintf( "a=%d", a )
print(k)
}
💻 출력결과
[1] "a=0"
[1] "a=10"
[1] "a=20"
[1] "a=30"
[1] "a=40"
[1] "a=50"
[1] "a=60"
[1] "a=70"
[1] "a=80"
[1] "a=90"
값의 변화량 조절 - ㅍ10부터 1까지 2씩 감소하는 범위 안에서의 반복 수행
for (b in seq(10, 1, -2)) {
k <- sprintf( "b=%d", b )
print(k)
}
💻 출력결과
[1] "b=10"
[1] "b=8"
[1] "b=6"
[1] "b=4"
[1] "b=2"
백터의 길이만큼 반복하기
백터는 1부터 시작되는 일련번호(=인덱스)를 부여받기 때문에 반복문의 특성을 활용하면 각 원소에 손쉽게 접근할 수 있다.
foo <- c(10, 20, 30) # 백터 정의하기
len <- length(foo) # 백터의 길이 조회(여기서는 3)
for (x in seq(1, len)) { # 1부터 백터의 길이만큼 반복
print( foo[x] )
}
💻 출력결과
[1] 10
[1] 20
[1] 30
백터 자체에 대한 반복
백터 자체를 반복문에 지정할 경우 x에 백터의 모든 원소가 순차적으로 대입된다.
bar <- c(10, 20, 30)
for (x in bar) {
print(x)
}
💻 출력결과
[1] 10
[1] 20
[1] 30
리스트와 함께 사용하기
리스트의 각 원소에 순차적으로 접근할 수 있다.
x <- list(name='hello', age=19, height=175, weight=85)
# 리스트 원소의 값들만 추출한다.
for (i in x) {
print(i)
}
💻 출력결과
[1] "hello"
[1] 19
[1] 175
[1] 85
#03. 반복문 활용 예시
1) 성적표에 대한 총점과 평균 구하기
어느 학생의 시험 점수가 100, 82, 98, 76, 51 이라고 할 때 이 학생의 총점과 평균 점수를 구하시오.
grade <- c(100, 82, 98, 76, 51) # 어느 학생의 성적표
total <- 0 # 총점을 저장할 변수
for (p in grade) {
total <- total + p
}
# 평균은 총 합에서 원소의 수를 나눈다.
avg <- total / length(grade)
tpl <- "총점: %d점, 평균: %0.2f점"
print(sprintf(tpl, total, avg))
💻 출력결과
[1] "총점: 407점, 평균: 81.40점"