본문 바로가기
프로그램/C언어 1000제

C언어 194제] NPC Lv2. 달팽이2

by 건티 2024. 11. 30.
728x90

출처 : 반크_백제역사 유적지구와 이스탐블 역사지구

 

문제]

M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다.

   
     
     
     
     


     
위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미 그려진 칸에 닿아서 더 이상 이동할 수 없게 되면, 시계방향으로 선을 꺾어서 그려나간다.

 

위의 표는 선을 그려 나간 모양을 나타낸 것이다. 선이 꺾어진 부분은 대각선으로 나타내었다. 표의 모든 칸이 채워질 때까지, 선을 몇 번 꺾게 될까?

입력
첫째 줄에 M과 N이 빈 칸을 사이에 두고 주어진다. (2 ≤ M, N ≤ 100)

출력
첫째 줄에 표의 모든 칸이 채워질 때까지 선이 꺾어지는 횟수를 출력한다.

예제 입력 1 
5 3
예제 출력 1 
5

출처 : 백준_1952번

 

 

참고풀이]

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
   int r, c;//행열 변수
   int i;//반복변수
   int cn,cnt;//선이 꺽어지는 횟수를 구하는 변수
   int sw;//증감변수
   //M, N을 입력받는다.(M:행, N:열)
   int M, N;
   scanf("%d%d", &M, &N);
   if ((M >= 2 && M <= 100) && (N >= 2 && N <= 100))
   {
      r = 1, c = 0;
      sw = 1;//진행방향 변수
      cnt = 0;
      while (1)
      {
         //열부분
         for (cn=0,i = 1; i <= N; i++)
         {
            c += sw;
            cn++;
            if (M!=1 && cn == N) cnt++;
         }
         if (N < 1) break;
         --M;

         //행부분
         for (cn=0,i = 1; i <= M; i++)
         {
            r += sw;
            cn++;
            if (N!=1 && cn == M) cnt++;
         }
         if (M < 1) break;
         --N;

         //방향바꾸기
         sw *= -1;
      }
      printf("%d", cnt);
   }
   return 0;
}

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 여름

 

반응형

댓글