본문 바로가기
  • 2025
문제풀기/프로그래머스 문풀

[프로그래머스] 단순구현

by soonrang 2023. 10. 3.

약 3주정도만에 블로그에 글을 쓴다. 세상에 !

파이널 프로젝트과 기업 면접 두곳을 보느라 정신이 없었다. 

시간이 되면 파이널 프로젝트랑 기업면접, 포트폴리오 및 이력서 상담 이야기까지 글을 써보겠다!

간략하게 면접 관련 썰을 풀자면 ....

 

파이널 프로젝트를 막 시작하는단계에 기업 면접이 잡혔다. 

면접 전날인가 이틀전에 기업이 정해져 이력서를 부랴부랴 적었어야했다. 

그럴듯한 자격증이나 프로젝트가 없어 내가 뭘 어필 할 수 있을까? 곰곰히 생각했고 두가지를 내세웠다.

1. 매일 아침 읽는 벨로그 글

2. 매일 아침 푸는 프로그래머스 코딩 테스트 (입문과 기초 ^^;,)

 

우리 반에서 코딩테스트를 준비하는 사람이 나 포함 두명정도였고 벨로그는 나만 읽었다.

벨로그 글 관련 질문은 들어오지 않았고 최근 어떤 알고리즘을 풀었냐는 질문만 받았다. 

아직 입문, 기초를 푸는 내가 뭘 대답할 수 있을까 그냥 솔직하게 '입문', '기초' 정도를 푸는 수준이라고 말씀드렸다. 

 

면접을 보고나서 코딩테스트 알고리즘을 설명할 수 있는 정도는 되어야겠다 생각했고 

lv1을 풀기 시작했다. (+기초, 입문)

 

 

 

문제 설명


지나다니는 길을 'O', 장애물을 'X'로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.

  • ["방향 거리", "방향 거리" … ]

예를 들어 "E 5"는 로봇 강아지가 현재 위치에서 동쪽으로 5칸 이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에 다음 두 가지를 먼저 확인합니다.

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

위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.

공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.

공원을 나타내는 문자열 배열 park, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 routes가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

 

 

아직 문법을 다 외우지 못해서 생각나는대로 풀었다. 문법에 맞게 수정할 시간!

import java.util.ArrayList;

class Solution {
    public int[] solution(String[] park, String[] routes) {
//        int [][] array ;
//        array = new int[park[1].length()][park.length];
        int x=0;
        int y=0;

        for (int i=0; i<routes.length; i++){
            // 방향을 확인합니다.
             if(routes[i][2]>park[i].length() ||
                routes[i][3]>park[i].length() ||
                park[i].indexOf("X")) {
                 if(routes[1]=="E") {
                    x += routes[i][2];
                 }else if(routes[1]=="S") {
                     y += routes[i][2];
                 }else if(routes[i]=="W") {
                     x += routes[i][2];
                 }else if (routes[i]=="N") {
                     y += routes[i][2];
                 }
             }
        }

        ArrayList<Integer> answer = new ArrayList<>();
        answer.add(x);
        answer.add(y);
        return answer;
    }

}

 

 

생각나는 대로 입력한 코드는 문법도 원리도 엉망이다. 

 

코드를 개선해서 고친 두번째 코드

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int x=0;
        int y=0;
        int testX=0;
        int testY=0;

        for (int i=0; i<routes.length; i++){
            int movement = Integer.parseInt(routes[i].split(" ")[1]);
            String direction = routes[i].split(" ")[0];

             if (i == 0) {
                testX = park[1].indexOf("S");
                }
             if (park[i].indexOf("X") == -1)  {
                 if(direction.equals("E")) {
                    testX += movement;
                 }else if(direction.equals("N")) {
                    testY -= movement;
                 }else if(direction.equals("W")) {
                    testX -= movement;
                 }else if (direction.equals("S")) {
                    testY += movement;
                 }
             }

             if(testX <park[i].length() && testY<park[i].length()
             && testX>-1 && testY>-1) {
                x = testX;
                y = testY;
             }
        }
        return new int[]{x, y};
    }

}

 

- 문자를 비교할 땐 equals를 사용해주자.

- split을 사용해 쪼갠 뒤 배열로 탐색을 할 수 있다. 

- 문자열을 int(정수형)으로 변환 : Integer.parseInt

 

 

문제가 생겼다 테스트케이스를 보면 시작점 위치가 달라진다. 

- 지금은 (0.0) 위치를 S (시작점)으로 두고 풀었다. 

- 장애물이 있는지 없는지 파악해야한다.

 

 

class Solution {
   public int[] solution(String[] park, String[] routes) {
       // 문제 그대로 입력(높이와 너비)
       int h = park.length;
       int w = park[0].length();
       
       int startX=0;
       int startY=0;

       // 시작점 설정
       for(int i=0; i<h; i++){
         if(park[i].contains("S")){
            startX = i;
            startY = park[i].indexOf("S");
         }
       }

       for(String route : routes) {
         // 방향(공백을 기준으로 나누고 0번째 인덱스 값을 반환)
         String direction = route.split(" ")[0];
         // 이동횟수(공백을 기준으로 나누고 1번째 인덱스 값을 반환)
         int movement = Integer.parseInt(route.split(" ")[1]);

         int moveX = startX;
         int moveY = startY;

         for(int i=0; i<movement; i++){
            switch(direction) {
               case "S" : moveX++; break;
               case "N" : moveX--; break;
               case "E" : moveY++; break;
               case "W" : moveY--; break;
            }
			
            // 장애물 파악 및 공원을 벗어나는지 확인
            if(moveX>-1&&moveX<h&&moveY>-1&&moveY<w){
               if(park[moveX].substring(moveY, moveY+1).equals("X")){
                  break;
               }
               if(i==movement-1){
                  startX=moveX;
                  startY=moveY;
               }
            }
         }
       }

       int[] answer = {startX,startY};
       return answer;

      }
}

 

 

이번 문제를 풀면서 느낀점은 

예외사항이나 고려해야할 점을 놓치면 안된다는 점이다. 

차근차근 풀다보면 풀리지만 코드가 복잡해진다. 문법은 계속 반복해서 외우자.