본문 바로가기

코딩테스트

[프로그래머스] 바탕화면 정리 python, java

문제 설명

이렇게 바탕화면이 있을 때 최소한의 이동거리를 갖는 한 번의 드래그의 시작점, 끝점 구하기

wallpaper = [".#...", "..#..", "...#."]

가 위의 그림을 나타낸다.

이렇게 최소한의 이동거리로 한번의 드래그가 가능하므로 결과값은 [0,1,3,4] 가 나와야 한다. 

드래그의 시작점이 (luxluy), 끝점이 (rdxrdy)라면 정수 배열 [luxluyrdxrdy]를 return하면 된다.

문제 풀이 : python

시작점 = (최소의 y좌표, 최소의 x좌표)

끝점 = (최대의 y좌표, 최대의 x좌표) 라고 우선 생각했다.

그래서 처음 짰던 코드는 배열을 순회하면서 파일이 있는 좌푯값들을 다른 배열에 저장해 최대,최소값을 찾는 것이었다. 생각해보니 굳이 다른 배열에 저장해서 마지막에 최대,최소를 찾기 않아도 순회하면서 충분히 찾을 수 있다고 생각했다.

def solution(wallpaper):
    y_len = len(wallpaper)
    x_len = len(wallpaper[0])
    
    min_x = x_len; min_y = y_len; max_x = 0; max_y = 0
    
    for i in range(y_len):
        for j in range(x_len):
            if wallpaper[i][j] == '#':
                if i < min_y:
                    min_y = i
                if j < min_x:
                    min_x = j
                if i > max_y:
                    max_y = i
                if j > max_x:
                    max_x = j
    result = [min_y,min_x,max_y+1,max_x+1]
    return result

wallpaper의 세로 길이, 가로 길이를 먼저 구하고, 가로와 세로의 최대 최소값들을 담을 변수들을 선언해준다.

wallpaper를 순회하면서 최대,최소 인덱스 값들을 구한다.

위의 그림 예시를 보면 가로, 세로의 최대 인덱스를 가진 파일들도 드래그 당해야 하기 때문에 끝점의 좌표를 +1 씩 해주었다.

문제 풀이 : java

같은 코드 자바로 바꿔보기.... 확실히 귀찮고 뭔가 쓸게 많은 java

class Solution {
    public int[] solution(String[] wallpaper) {
        int y_len = wallpaper.length;
        int x_len = wallpaper[0].length();
        
        int min_x = x_len;
        int min_y = y_len;
        int max_x = 0;
        int max_y = 0;
        
        for (int i=0; i<y_len;i++) {
            for (int j=0; j<x_len; j++) {
                if (wallpaper[i].charAt(j) =='#') {
                    if (i<min_y)
                        min_y = i;
                    if (j<min_x)
                        min_x = j;
                    if (i>max_y)
                        max_y = i;
                    if (j>max_x)
                        max_x = j;
                }
            }
        }
        int[] answer = {min_y, min_x, max_y+1, max_x+1};
        return answer;
    }
}

java 메소드 정리

  • .length : 배열의 길이를 알고자 할 때 사용
  • .length() : 문자열의 길이
  • .charAt(index) : 문자열에서 index번째 위치한 문자를 반환할 때 사용

python을 계속 쓰다 보니 java 변수 선언 자꾸 건너뛰게 된다 주의하자 !

다른 사람들의 풀이

def solution(wall):
    a, b = [], []
    for i in range(len(wall)):
        for j in range(len(wall[i])):
            if wall[i][j] == "#":
                a.append(i)
                b.append(j)
    return [min(a), min(b), max(a) + 1, max(b) + 1]

나도 처음에 이렇게 풀었는데 뭔가 제대로 안풀었나 보다 ??

'코딩테스트' 카테고리의 다른 글

[프로그래머스] 카드 뭉치  (0) 2024.05.22
[이코테] Chap04 구현  (0) 2024.04.09
[이코테] 그리디 알고리즘  (0) 2024.04.08
[Python] 공원 산책  (0) 2024.03.12
[Python] 가장 가까운 같은 글자  (0) 2024.03.07