KB IT’s Your Life 4기 - Java 알고리즘 7일차


SWEA 1210 사다리 문제

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

public class Solution {
    static int[] dx = { 0, 0, -1 };
    static int[] dy = { -1, 1, 0 };
    static int[][] arr;
    //사다리 아래서 위로
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        int targetX = 0, targetY = 0;//최종목적지 좌표(값이 2)->출발지좌표

        for (int test_case = 1; test_case <= 10; test_case++) {
            int T = Integer.parseInt(br.readLine());//테케번호 1,2,3,4..10
            arr = new int[100][100];
            for (int i = 0; i < 100; i++) {//행번호 Y좌표
                st = new StringTokenizer(br.readLine());
                for (int j = 0; j < 100; j++) {//열번호 X좌표
                    arr[i][j] = Integer.parseInt(st.nextToken());//가로로 채움
                    if (arr[i][j] == 2) {//목적지 값을 만나면 좌표저장
                        targetX = i;
                        targetY = j;
                    }
                }
            }
            int result = sadari(targetX, targetY);//목적지부터 거꾸로 검색
            System.out.println("#" + T + " " + result);
        }
    }

    public static int sadari(int x, int y) {//x:행, y:열
        int ans = 0;
        while (true) {
            if (x == 0) { //시작위치는 행번호가 0 
                ans = y;
                break;
            }
            for (int i = 0; i < 3; i++) {
                int nx = x + dx[i]; //{ 0, 0, -1 }; 행( ,  , 상) 
                int ny = y + dy[i]; //{ -1, 1, 0 }; 열(좌, 우,  )
                if (inRange(nx, ny) && arr[nx][ny] == 1) {
                    //지나온 길 표시
                    arr[x][y] = 4;//지나온길을 확인할 용도.안해도됨
                    x = nx;//다음 방문할 행 좌표로 설정
                    y = ny;//다음 방문할 열 좌표로 설정
                }
            }
        }

        return ans;
    }

    public static boolean inRange(int x, int y) {
        return x >= 0 && y >= 0 && x < 100 && y < 100;
    }

}

image

image

  • 핵심 문장
  for (int i = 0; i < 3; i++) {
                int nx = x + dx[i]; //{ 0, 0, -1 }; 행( ,  , 상) 
                int ny = y + dy[i]; //{ -1, 1, 0 }; 열(좌, 우,  )
                if (inRange(nx, ny) && arr[nx][ny] == 1) {
                    //지나온 길 표시
                    arr[x][y] = 4;//지나온길을 확인할 용도.안해도됨
                    x = nx;//다음 방문할 행 좌표로 설정
                    y = ny;//다음 방문할 열 좌표로 설정
                }
            }

투 포인터

  • 연속된 수들의 합
package b2018;

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

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int N = Integer.parseInt(st.nextToken());

		int count = 1;
		int start_index = 1;
		int end_index = 1;
		int sum = 1;

		while (end_index != N) {
			if (sum == N) {
				count++;
				end_index++;
				sum = sum + end_index;
			} else if (sum < N) {
				end_index++;
				sum = sum + end_index;
			} else if (sum > N) {
				sum = sum - start_index;
				start_index++;
			}
		}
		
		System.out.println(count);
		
	}
}

스택과 큐