[R] 프로그램 흐름제어 (2) - 반복문

[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점"
호쌤(이광호)'s Picture

About 호쌤(이광호)

메가스터디IT아카데미에서 Java, Spring, Python, Frontend 등을 강의하는 IT 전문 강사이자 프리렌서 개발자 입니다.
https://www.youtube.com/@hossam-codingclub

Seoul, Korea http://www.hossam.kr