- Today
- Yesterday
- Total
메이쁘
(JAVA) 백준 1913번 : 달팽이 -- [구현] 본문
https://www.acmicpc.net/problem/1913
코테에서 알지만 시간 상 풀지 못했었기 때문에
열받아서 관련 문제를 찾아 풀었습니다.
두 가지 방법으로 했는데요.
1) direction(방향) 변수를 별도로 두고, 벽에 닿거나 이미 지나온경우(값이 할당되어있는 경우) 해당 변수값을 변경시켜 방향을 바꿔가며 이동한는 방법
2) (0,0) 부터 시작해서 하좌상우 순서대로 특정 길이만큼 for문으로 이동하는 방법
1) 로 했는데 효율성이 낮아서 2)로 풀었는데, 결과적으로는 System.out.println()으로 출력하는 방법 대신 StringBuilder를 활용해서 String 하나를 만들고 출력하는 방법으로 해야 시간과 메모리가 엄청 줄어들더라구요!
즉, 1)과 2) 전부 활용 가능한데, 확장성 생각하면 1)이 좋을 듯 합니다.
2) 의 방법은 간단하고 가독성은 높습니다.
단, 시작방향이 고정되있다는 점과 시작방향과 지점이 바뀌면 해당 로직이 무용지물이 되는 단점이 있습니답..
알고리즘
1) direction 변수를 활용한 방법
- 0, 0 지점부터 while문을 시작한다. 단, 시작 값은 length * length값.
- 벽에 부딪히거나 이미 지나왔다 -> direction - 1 감소(0이면 3으로 리셋) (0, 1, 2, 3 은 순서대로 우, 하, 좌, 상)
- 방향을 전부 바꿔도 갈 곳이 없다 -> 다 그린 것으로 간주하고, 값을 넣었던 int 2차원배열 리턴
- 이동할 때 해당 지점에 값 --
간단하죠?
2) for를 활용한 방법
- n / 2, n / 2 지점부터 시작한다. 단, 시작 값은 1(한가운데 지점부터 시작. length는 홀수라는 전제가 있음)
- 시작 지점을 먼저 그리고, 다음 지점부터 while문 시작한다. (다음 지점은 아래방향)
- 별도로 이동할 수 있는 카운트 변수를 생성해 해당 변수값만큼 특정 방향으로 이동합니다.
- 위, 오른쪽, 아래, 왼쪽 순서대로 이동하며 위, 오른쪽 까지 이동한 후 이동할 수 있는 카운트 + 1을 합니다. 또, 아래, 왼쪽까지 이동한 후 이동할 수 있는 카운드 + 1을 합니다.
직접 코드를 보시면 더 쉽게 이해하실 수 있습니다.
주석처리된 함수가 1번 방법이고,
현재 실행 가능한 함수가 2번 방법입니다.
감사합니다.
소스코드
'Algorithm > Baekjoon' 카테고리의 다른 글
(JAVA) 백준 11967번 : 불켜기 -- [BFS] (2) | 2021.09.29 |
---|---|
(JAVA) 백준 2533번 : 사회망 서비스(SNS) -- [DP, DFS] (0) | 2021.09.23 |
(JAVA) 백준 1781번 : 컵라면 -- [그리디] (0) | 2021.09.10 |
(JAVA) 백준 1484번 : 다이어트 -- [투포인터] (0) | 2021.08.06 |
(JAVA) 백준 1806번 : 부분합 -- [투포인터] (0) | 2021.08.06 |