쭈쌤
쭈쌤 Hello World

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

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R] 프로그램 흐름제어(2)-반복문≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

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

주어진 조건을 충족하는 동안 {}안의 구문을 반복적으로 수행하는 형태를 반복문이라고 합니다.

#01. while문

  • 주어진 조건이 참을 충족하는 동안 수행되는 문법
  • 초기식, 조건식, 증감식의 요소를 충족해야 성립된다.
1
2
3
4
5
초기식
while (조건식) {
    ... 반복적으로 수행될 구문 ...
    증감식
}

1) 1부터 10까지 반복하기

1
2
3
4
5
6
x <- 1                      # 초기식 -> 반복에 사용될 조건값을 지정한다.
while (x <= 10) {           # 조건식 -> x가 10보다 작거나 같은 동안 반복수행
    k <- sprintf("x=%d", x) # 반복이 진행되는 동안 수행할 명령
    print(k)
    x <- x + 1              # 증감식 -> 조건에 사용되는 값을 변경
}
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
[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"

2) 구구단 7단 출력하기

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
7
8
9
[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"

3) 반복이 진행되는 동안 결과의 누적

1부터 10까지의 총 합 구하기

1
2
3
4
5
6
7
8
9
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
2
3
4
5
6
7
8
9
10
[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"

4) 값의 변화단계 조절하기

0부터 100전(=99)까지 10씩 증가

1
2
3
4
5
6
a <- 0                            # 초기식
while (a < 100) {                 # 조건식
    k <- sprintf( "a=%d", a )
    print(k)
    a <- a + 10                   # 증감식
}
▶ 출력결과
1
2
3
4
5
6
7
8
9
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씩 감소

1
2
3
4
5
6
b <- 10
while (b > 0) {
    k <- sprintf( "b=%d", b )
    print(k)
    b <- b - 2
}
▶ 출력결과
1
2
3
4
5
[1] "b=10"
[1] "b=8"
[1] "b=6"
[1] "b=4"
[1] "b=2"

#02. For문

시작값과 종료값을 지정한다.

증가량은 생략할 경우 1로 지정된다.

1
2
3
for (변수 in seq(시작값, 종료값 [, 증가량])) {
    ...
}

1) 1부터 10까지 반복하기

1
2
3
4
for (x in seq(1, 10)) {
    k <- sprintf("x=%d", x)
    print(k)
}
▶ 출력결과
1
2
3
4
5
6
7
8
9
10
[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"

2) 구구단 7단 출력하기

1부터 9까지 1씩 증가하면서 수행함

1
2
3
4
5
for (y in seq(1, 9)) {
    z <- 7 * y     # 반복이 진행되는 동안 수행할 명령
    str <- sprintf("7 x %d = %d", y, z)
    print(str)
}
▶ 출력결과
1
2
3
4
5
6
7
8
9
[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"

3) 반복이 진행되는 동안 결과의 누적

1부터 10까지의 총 합 구하기

반복이 시작되기 전에 값이 누적될 변수를 미리 준비해 놓는다.

1
2
3
4
5
6
7
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
2
3
4
5
6
7
8
9
10
[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"

4) 값의 변화 단계 조절하기

1
2
3
for (변수 in seq(시작값, 종료값, 증가량)) {
    ...
}

0부터 99까지 10씩 증가하는 범위 안에서의 반복 수행

1
2
3
4
for (a in seq(0, 99, 10)) {
    k <- sprintf( "a=%d", a )
    print(k)
}
▶ 출력결과
1
2
3
4
5
6
7
8
9
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부터 1까지 2씩 감소하는 범위 안에서의 반복 수행

1
2
3
4
for (b in seq(10, 1, -2)) {
    k <- sprintf( "b=%d", b )
    print(k)
}
▶ 출력결과
1
2
3
4
5
[1] "b=10"
[1] "b=8"
[1] "b=6"
[1] "b=4"
[1] "b=2"

5) 백터와 함께 사용하기

백터는 1부터 시작되는 일련번호(=인덱스)를 부여받기 때문에 반복문의 특성을 활용하면 각 원소에 손쉽게 접근할 수 있다.

백터의 길이만큼 반복하기

1
2
3
4
5
foo <- c(10, 20, 30)      # 백터 정의하기
len <- length(foo)        # 백터의 길이 조회(여기서는 3)
for (x in seq(1, len)) {  # 1부터 백터의 길이만큼 반복
    print( foo[x] )
}
▶ 출력결과
1
2
3
[1] 10
[1] 20
[1] 30

백터 자체에 대한 반복

백터 자체를 반복문에 지정할 경우 x에 백터의 모든 원소가 순차적으로 대입된다.

1
2
3
4
bar <- c(10, 20, 30)
for (x in bar) {
    print(x)
}
▶ 출력결과
1
2
3
[1] 10
[1] 20
[1] 30

6) 리스트와 함께 사용하기

리스트의 각 원소에 순차적으로 접근할 수 있다.

1
2
3
4
5
6
x <- list(name='hello', age=19, height=175, weight=85)

# 리스트 원소의 값들만 추출한다.
for (i in x) {
    print(i)
}
▶ 출력결과
1
2
3
4
[1] "hello"
[1] 19
[1] 175
[1] 85

7) 반복문 활용 예시

성적표에 대한 총점과 평균 구하기

1
2
3
4
5
6
7
8
9
10
11
12
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
[1] "총점: 407점, 평균: 81.40점"

#03. 반복문 안에서의 흐름 제어

반복을 몇 번 수행해야 하는지 판단할 수 없는 경우 무한루프 형태로 지정하고 특정 조건이 충족되는지에 따라 반복의 중단 여부를 결정한다.

반복문의 흐름제어 기능을 갖는 키워드

  • next: 조건식으로 강제 이동
  • break: 현재 반복문을 강제로 종료하고 블록을 빠져 나간다.

1) while문을 사용한 무한루프 패턴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
y <- 0
while (TRUE) {       # 무조건 반복. 종료되지 않는다 (무한루프)
    y <- y + 1

    if (y %% 2 == 0) {
        next        # 조건식으로 강제 이동
    }

    if (y > 10) {
        break       # 반복문을 강제로 종료
    }

    print(sprintf("Hello World (%d)", y))
}
▶ 출력결과
1
2
3
4
5
[1] "Hello World (1)"
[1] "Hello World (3)"
[1] "Hello World (5)"
[1] "Hello World (7)"
[1] "Hello World (9)"

2) repeat문

반복의 조건이나 범위를 설정하지 않고 무조건 무한루프로 진행되는 반복문.

반드시 특정 상황이 발생했을 때 break를 적용하여 중지시켜야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
y <- 0
repeat {            # 무조건 반복. 종료되지 않는다 (무한루프)
    y <- y + 1

    if (y %% 2 == 0) {
        next        # 조건식으로 강제 이동
    }

    if (y > 10) {
        break       # 반복문을 강제로 종료
    }

    print(sprintf("Hello World (%d)", y))
}
▶ 출력결과
1
2
3
4
5
[1] "Hello World (1)"
[1] "Hello World (3)"
[1] "Hello World (5)"
[1] "Hello World (7)"
[1] "Hello World (9)"
Rating:

크리에이티브 커먼즈 라이선스 ITPAPER(호쌤,쭈쌤)에 의해 작성된 ≪[R] 프로그램 흐름제어(2)-반복문≫은(는) 크리에이티브 커먼즈 저작자표시-비영리-동일조건변경허락 4.0 국제 라이선스에 따라 이용할 수 있습니다.
이 라이선스의 범위 이외의 이용허락을 얻기 위해서는 leekh4232@gmail.com으로 문의하십시오.

comments powered by Disqus