알고리즘 스터디 7월 5주차 문제1 (Ladder 1)

문제#

  • 링크로 대체

풀이 및 주저리..

처음으로 풀어본 D4의 문제였다. D3 까지와는 다르게 문제가 길어지고 테스트케이스를 눈으로하거나 생각으로 검증할 수 없을 만큼 방대하게 주어진다. 그러다보니 문제를 제대로만 풀면 높은 확률로 맞출 수 있지만.. 로직을 못찾는 순간 힘든 작업이 된다. 처음에는 문제를 읽고 위에서 차례로 내려오는 코드를 생각했었다. 하지만 조금만 더 생각해보면 반대로 오는 순간 한번으로 정답을 찾을 수 있다는 것을 알게 되었고 역진행으로 코드를 짜보았다. 그리고 여기서 지금 내가 많은 문제점을 갖고 있다는 것을 알게 되었다.

먼저, 근래에 풀고 있는 대부분의 문제를 비슷하게 풀고 있다는 것이다. 범위를 체크하고 거기에 해당하는 반복을 돌리면서 모든걸 해결하려고 하니 코드가 엄청나게 길어지게 되었다. 싸피 수업을 듣는 다른 사람들의 코드를 보고 느낀점이 상당히 많았고 너무 내 스타일(이게 외워서 치는거랑 비슷한 것 같다) 를 고수하지 않고 이걸 어떻게하면 좀 더 깔끔하게 풀 수 있을까를 고민해봐야겠다.

참고로 밑에 solve가 반 친구가 푼 방법 위에가 내가 푼 방법이다. 차이가 상당하고 내 코드는 풀다보면 헷갈릴 수 있는 확률이 높다.

코드

package com.ssafy.algo.day0728;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution_1210 {
	static int[] dx = { 0, 0, -1 }, dy = { -1, 1, 0 };
	static final int SIZE = 100;
	static int[][] map;

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		for (int k = 1; k <= 10; k++) {
			int t = Integer.parseInt(br.readLine());
			map = new int[SIZE][SIZE];
			int x = 0;
			int y = 0;
			for (int i = 0; i < SIZE; i++) {
				StringTokenizer stk = new StringTokenizer(br.readLine());
				for (int j = 0; j < SIZE; j++) {
					map[i][j] = Integer.parseInt(stk.nextToken());
					if (map[i][j] == 2) {
						x = i;
						y = j;
					}
				}
			}
			while (x > 0) {
				// 범위 안에 들어왔다.
				// r = 0 왼 오 위
				for (int r = 0; r < 3; r++) {
					if (x + dx[r] >= 0 && x + dx[r] < SIZE && y + dy[r] >= 0 && y + dy[r] < SIZE && map[x + dx[r]][y + dy[r]] == 1) {
						if (r == 0 || r == 1) {
							while (x + dx[r] >= 0 && x + dx[r] < SIZE && y + dy[r] >= 0 && y + dy[r] < SIZE && map[x + dx[r]][y + dy[r]] == 1) {
								x += dx[r];
								y += dy[r];
							}
							// 무조건 한칸 올리는 처리를 위해 r 을 2로 만들어주려는 부분
							r = 1;
						}else {
							x += dx[r];
							y += dy[r];
						}
					}
				}

			}
//			y = solve(y);

			System.out.println("#" + k + " " + y);
		}
		
		

	}
	
    private static int solve(int y) {
        int top = 99;
        while(top-- != 0) {
            if(y-1 >= 0 && map[top][y-1] == 1)
                while(y-1 >= 0 && map[top][y-1] == 1) y--;     
            else if(y + 1 <100 && map[top][y+1] == 1)
                while(y + 1 <100 && map[top][y+1] == 1)  y++;
        }
        return y;
    }
}

기억에 남길 것!

  • 외워서 알고리즘을 풀지말자
  • 끝이 보이지 않는 반복은 while
© 2020 JunhoBaik, Built with Gatsby