컴공생의 발자취

[ 99클럽 코테 스터디 21일차 TIL ] 프로그래머스(공원 산책) 본문

💡 코테/99클럽

[ 99클럽 코테 스터디 21일차 TIL ] 프로그래머스(공원 산책)

MNY 2024. 4. 18. 22:25
728x90
반응형
💡 오늘의 학습 키워드

- 프로그래머스
    * 공원 산책 : 미들러 문제(Level 1)

 

오늘의 회고

문제1  : [공원 산책]

  • 어떤 문제가 있었고, 나는 어떤 시도를 했는지

1차원 String 배열에서 시작점과 이동할 방향, 크기가 주어진다. 마지막으로 위치한 좌표(y, x)를 리턴하는 문제이다.

단, 아래의 경우는 해당 명령을 무시하고 다음 명령을 수행한다.

  • 주어진 방향으로 이동할 때 공원을 벗어나는지 확인
  • 주어진 방향으로 이동 중 장애물을 만나는지 확인

일단, 입력된 명령만큼 반복문을 돌며

동서남북을 판별하고, 공원을 벗어나는지 / 장애물을 만나는지 확인한다.

그렇게 로직자체는 어렵지 않았다. 문제는 배열의 범위를 벗어난게 문제였다.

 

배열의 범위를 자꾸 벗어나고 해서 GPT야.. 도와줘ㅠ

아래의 코드 부분이 배열의 범위를 벗어나게 했나보다.

변경하고 나서는 잘 됐다.

for (int i = 0; i < num; i++) // 변경 전
for (String route : routes) // 변경 후

 

그러고 문제를 읽으면서 시작점이 0,0이 아니라는 걸 알았다.

'S'가 입력된 곳이 시작점이었다. 이것까지 수정해주고 통과할 수 있었다.

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 어떻게 해결했는지
class Solution {
    public int[] solution(String[] park, String[] routes) {
        int x = 0;
        int y = 0;
        int x_size = park[0].length();
        int y_size = park.length;

        // 시작 위치를 찾음
        for (int i = 0; i < y_size; i++) {
            for (int j = 0; j < x_size; j++) {
                if (park[i].charAt(j) == 'S') {
                    x = j;
                    y = i;
                    break;
                }
            }
        }

        // 이동
        for (String route : routes) {
            String[] moveArr = route.split(" ");
            int move = Integer.parseInt(moveArr[1]);
            int obstacle = 0;

            if (moveArr[0].equals("E")) { // 동쪽
                x += move;
                if (x >= x_size || x < 0) {
                    x -= move;
                    continue;
                }
                for (int j = 0; j < move; j++) {
                    if (park[y].charAt(x - j) == 'X') {
                        obstacle = 1;
                        break;
                    }
                }
                if (obstacle == 1) {
                    x -= move;
                    continue;
                }
            } else if (moveArr[0].equals("W")) { // 서쪽
                x -= move;
                if (x >= x_size || x < 0) {
                    x += move;
                    continue;
                }
                for (int j = 0; j < move; j++) {
                    if (park[y].charAt(x + j) == 'X') {
                        obstacle = 1;
                        break;
                    }
                }
                if (obstacle == 1) {
                    x += move;
                    continue;
                }
            } else if (moveArr[0].equals("S")) { // 남쪽
                y += move;
                if (y >= y_size || y < 0) {
                    y -= move;
                    continue;
                }
                for (int j = 0; j < move; j++) {
                    if (park[y - j].charAt(x) == 'X') {
                        obstacle = 1;
                        break;
                    }
                }
                if (obstacle == 1) {
                    y -= move;
                    continue;
                }
            } else { // 북쪽
                y -= move;
                if (y >= y_size || y < 0) {
                    y += move;
                    continue;
                }
                for (int j = 0; j < move; j++) {
                    if (park[y + j].charAt(x) == 'X') {
                        obstacle = 1;
                        break;
                    }
                }
                if (obstacle == 1) {
                    y += move;
                    continue;
                }
            }
        }

        int[] answer = {y, x};
        return answer;
    }
}

 

  • 무엇을 새롭게 알았는지

코드가 너무 길게 나온 것 같다. 그리고 어쩐지 문제를 풀었다 싶었더니 level 1이었다.

아무튼 아직도 왜 for문을 저런 형식으로 바꿨더니 배열의 범위를 벗어나지 않게 되었는지 잘 모르겠다ㅠ

이해가 가지 않는다.. 

 

그리고 문제를 조금 더 세심하게 읽어야 한다는 걸 다시 또 느꼈다. 시작점 위치를 0,0인 걸 마지막에라도 알아서 다행이었다. 왜 틀리는지 보면서 문제를 다시 보게 되어서 알게되었지만.. 

 

내일 학습할 것은 무엇인지 (최대 3개)

  • 정보처리기사 실기
  • 자바 형변환 정리
  • 클럽99 코딩테스트(비기너)
 
728x90
반응형