본문 바로가기

Algorithm/Implementation

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

반응형

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

 

1952번: 달팽이2

M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다. 위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미

www.acmicpc.net

구현문제였습니다.

 

 

📕 풀이방법

📔 입력 및 초기화

 1행 1열부터 시작한다는 의미로 curR = 1, curC = 1로 저장합니다. 이 후 지나온 길을 다시가지 않기 위해 2차원 배열 ck를 선언합니다. 

 

📔 풀이과정

 그리기가 끝나는 시점은 방향을 바꾼 후 그 방향으로 갔을 때에도 이미 그린 선인 경우입니다.

 1. 현재방향 dir에 대해 curR, curC를 갱신합니다.

 

 2. 벽에 부딪히거나 이미 그린 선이라면 갱신했던 curR, curC를 무르고 방향을 바꿔준 후 정답을 출력할 변수 cnt++해줍니다.

 

 3. 방향을 바꿨는데도 이미 그린 선이라면 break해줍니다.

 

📔 정답출력

 cnt를 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n, m, dir, cnt, curR = 1, curC = 1;
int ck[101][101];
//우,하,좌,상
int dr[] = {0,1,0,-1};
int dc[] = {1,0,-1,0};
int main(){
    cin >> n >> m;
    ck[1][1] = 1;
    while(1){
        curR += dr[dir];
        curC += dc[dir];
        if(1 > curR || curR > n || 1 > curC || curC > m || ck[curR][curC]){
            curR -= dr[dir];
            curC -= dc[dir];
            dir = (dir + 1) % 4;
            if(ck[curR + dr[dir]][curC + dc[dir]]) break;
            cnt++;
        }
        ck[curR][curC] = 1;
    }
    cout << cnt;
}