(C++) 백준 1952번 - 달팽이2

코딩너구리·2025년 10월 8일

코딩 문제 풀이

목록 보기
22/266
post-thumbnail

https://www.acmicpc.net/problem/1952

문제

> M줄N칸의 표에 달팽이 모양으로 선을 그린다.
> 표의 왼쪽 최상단 부터 오른쪽으로 그리며 벽에 닿거나 더 이동할 수 없으면 시계방향으로 꺾어 그린다.
> 표가 전부 채워질때 까지 꺾인 횟수를 구해라.

접근

0,0에서 시작해서 처음에 열의 인덱스가 증가하고 꽉채면 행의 인덱스가 증가하는걸 반복할때 마다 각각의 최대값을 1씩 낮추며 반복하는데 최대값이 줄어들때, 즉, 방향이 꺾일때 cnt값을 증가시켜준다.

문제해결

> M이 1이면 진행되지않고, Mx1이면 꼭 1번 꺾이고 2xN이면 2번꺾인다. 그리고 Mx2면 3번꺾인다.
해당 경우를 제외하고는 4번 꺾이는 규칙을 알 수 있다.
> 한번 진행할 때마다 위, 아래, 좌, 우 한칸씩 줄어들기 때문에 전체 크기를 -2씩 해준다.

코드

#include <iostream>
using namespace std;

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int M, N; //M이 행, N이 열
	cin >> M >> N;
	int cnt = 0;

	while (1)
	{
		if (M == 1) break;
		if (N == 1)
		{
			cnt += 1;
			break;
		}
		if (M == 2) 
		{
			cnt += 2;
			break;
		}
		if (N == 2)
		{
			cnt += 3;
			break;
		}

		else
		{
			cnt += 4;
			M -= 2;
			N -= 2;
		}
	}
	cout << cnt << '\n';
}

후기

규칙을 찾는게 좀 복잡했고 예외 처리도 여러 케이스를 따지느라 꽤 어려웠다.

0개의 댓글