본문 바로가기

백준

3208)배고픈 애벌레

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


처음 이 문제를 접했을 때 시계 방향으로 배열을 순회해야 한다고 생각했다.



그래서 배열을 시계방향으로 순회하며 안쪽으로 파고드는 함수를 만들었다.


그리고 방향이 바뀌는 지점에서 수를 세도록 재귀 함수를 만들었다.


내가 기대한대로 재귀 함수가 동작하지 않았는데 재귀 함수에 대한 이해가 부족한 듯하다.


친구에게서 보다 쉽고 신박한 풀이를 듣게되어 복습겸 글로 남긴다.


애벌레가 배열을 시계방향으로 순회할 때 그려지는 경로에 규칙이 숨어있다.



배열의 크기가 주어질 때 C(열 길이)가 R(행 길이)보다 큰 경우를 생각해보자.


R<C일 때 노란색으로 칠한 가로 선의 갯수가 R과 같다. 


이는 R<C인 배열에 예외없이 적용된다.


세로 선의 갯수는 가로 선의 갯수보다 하나 더 작다.


선의 총 갯수 - 1은 방향을 꺾은 수와 같으므로 R<C일 때 


방향을 꺾은 수 = 가로 선의 갯수 + 세로 선의 갯수 - 1이다.


정리하면 2*(R-1)이다.



R>C일 때 노란색으로 칠한 세로 선의 갯수가 C와 같다.


R<C인 경우와 비교했을 때 한 번 더 그어지기 때문에 세로 선의 갯수는 가로 선의 갯수와 같다.


방향을 꺾은 수 = 가로 선의 갯수 + 세로 선의 갯수 - 1이다.


정리하면 2*(C-1)+1이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
 
int main() {
    int R, C;
 
    cin >> R >> C;
    if (R > C) {
        cout << (C - 1* 2 + 1<<endl;
    }
    else {
        cout << (R - 1* 2<<endl;
    }
 
    return 0;
}
cs



 


'백준' 카테고리의 다른 글

1012)유기농 배추2(DFS)  (0) 2019.03.16
1009)분산처리  (0) 2019.03.16
1373)2진수 8진수  (0) 2019.03.11
1158)조세퍼스 문제  (0) 2019.03.04
10824)네 수  (0) 2019.03.03