백준 2048(EASY)문제를 풀다가
아.. 이거 반복문 하나로도 할 수 있을 것 같은데 한 번 더 돌려야 되나... 라고 생각했던 적이 있다..ㅎ.ㅎ
그래서 반복문에서 조건식을 변형 시키는 것을 알아 보았다!
우선, 내가 문제를 풀며 하고 싶었던 코딩은 아래와 같다!
if (dir == 0) // UP :: 올라가야 하는 상황일 때의 for문
for (int i = 0; i < N; i++)
else if (dir == 1) // DOWN :: 내려가야 하는 상황일 때의 for문
for (int i = N - 1; i >= 0; i--)
이걸 두번으로 나누지 말고 하나의 반복문으로 만들 수는 없을까!?
있다!!!!!!
우선 결과를 보여주자면 이렇게 만들면 된다.
if (dir == 0) { row = N - 1; d = -1; }else if (dir == 1) { row = 0; d = 1; }for (int i = row, k = 0; k < N; k++, i += d)위 코드를 설명하자면,for문의 초기식, 조건식, 증감식에서 변수를 하나만 이용하지 않고 두개를 이용하는 것이다!<초기식>i=row, k=0k는 N번 만큼 진행해야 하기 때문에 임의로 만들어준 변수이다!row는 dir에 따라 0 이 될 수도, N-1 이 될 수도 있기 때문에 두개의 반복문을 만들지 않아도 되게 해준다.<조건식>k < N반복문을 N번 돌릴 수 있게 해준다.<증감식>k++, i += dk는 k++ 하면서 0부터 N-1까지 총 N번 반복문을 진행하게 한다.i는 dir에 따라 -1 이 될 수도, 1 이 될 수도 있기 때문에 두 개의 dir에 따라 row와 d가 변경되어 조건에 따른 다른 반복문을 가능하게 해준다.이와 같이 코드를 변경하면 코드의 반복되는 라인 수를 효율적으로 줄일 수 있다!!!^ㅁ^출력하면 아래와 같다.<출력 결과>
다른 예시로 아래 코드를 보자!int main(){for (int i = 0, j = 1; i < 10; i++, j=i*2) // i는 1씩 증가, j는 i*2{printf("i: %d, j: %d\n", i, j);}return 0;}
위 코드는 i를 0부터 1씩 증가시키며 10번 반복하는 동시에, j를 1부터 i*2하며 10번 반복하는 반복문이다.
이를 출력하면 아래와 같은 결과가 나타난다!
<출력 결과>
'C&C++' 카테고리의 다른 글
[C/C++] 이분탐색으로 LIS 구하는 방법 (0) | 2019.02.24 |
---|---|
[C/C++] scanf와 scanf_s (0) | 2018.10.31 |