Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- 혼공챌린지
- 인프런
- 기술면접
- groupby
- 티스토리챌린지
- doitandroid
- java
- 안드로이드스튜디오
- select
- CS
- 혼공단
- 프로그래머스
- MySQL
- 오블완
- 자료구조
- 정보처리기사
- 혼공파
- Til
- 코테
- 안드로이드
- 스터디
- 카카오코테
- SQL
- Android
- join
- 자바
- 코틀린
- Kotlin
- 정처기
- 알고리즘
Archives
- Today
- Total
Welcome! Everything is fine.
[프로그래머스/Lv.1] 공원 산책 - Java 본문
728x90
📌 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📌 풀이
주어진 방향과 거리에 따라 로봇강아지를 이동시켜 최종적으로 놓인 위치를 반환하는 문제였다. 쉬워 보였지만 코드를 치면 칠수록 점점 헷갈려갔고..왜 안되지?를 반복하다가 힌트를 보고 풀었다.
먼저 해야하는 일을 적어보자면 아래와 같다.
- 시작 좌표를 저장한다.
- park 배열을 돌면서 'S'의 위치를 저장한다.
- routes 배열을 돌면서 방향과 거리에 따라 로봇강아지를 이동시킨다.
- 이동하는 경우
- 공원의 크기를 벗어나지 않고, 장애물이 없다면 이동한다. 가로 방향을 width, 세로 방향을 height 라고 하고 주어진 거리를 n 이라고 한다면, 다음과 같이 움직인다.
- 동(E) : width + n
- 서(W) : width - n
- 남(S) : height - n
- 북(N) : height + n
- 공원의 크기를 벗어나지 않고, 장애물이 없다면 이동한다. 가로 방향을 width, 세로 방향을 height 라고 하고 주어진 거리를 n 이라고 한다면, 다음과 같이 움직인다.
- 이동하지 않는 경우
- 이동한 위치가 공원의 크기를 벗어난다면 이동하지 않는다.
- 이동한 위치가 장애물이거나 이동하는 도중 장애물을 지나게 된다면 이동하지 않는다.
- 이동하는 경우
- 반복문을 모두 돈 후 최종적으로 도착한 좌표를 int형 배열의 형태로 반환한다.
다음 코드는 처음에 적은 코드의 일부인데, 매 반복문마다 똑같은 검증을 하니 불필요한 코드가 많아보인다. 그리고 코드를 작성하며헷갈린 이유 중 하나가 변수를 x, y로 했기 때문인데..그냥 문제에 나온 것처럼 w, h로 하면 덜 헷갈리지 않았을까 싶다.🙄 또한 시작 좌표를 cx, cy에 넣은 것까지는 좋았지만, 내가 실수한 점은 해당 변수도 for문 안에 넣고 조건에 충족하면 시작 좌표를 계속 갱신시켜 cx, cy에 넣었어야 했다는 점이다.
📌 전체 코드
작성하던 코드에서 다른 사람의 코드를 보고 약간 고쳐 통과되었다.
import java.util.*;
class Solution {
public int[] solution(String[] park, String[] routes) {
int H = park.length;
int W = park[0].length();
int h = 0;
int w = 0;
for (int i = 0; i < park.length; i++) {
for (int j = 0; j < park[i].length(); j++) {
if (park[i].charAt(j) == 'S') {
h = i;
w = j;
}
}
}
for (String route : routes) {
String[] arr = route.split(" ");
String op = arr[0];
int n = Integer.parseInt(arr[1]);
int nh = h;
int nw = w;
for (int i = 0; i < n; i++) {
if (op.equals("E")) {
nw++;
} else if (op.equals("W")) {
nw--;
} else if (op.equals("S")) {
nh++;
} else if (op.equals("N")) {
nh--;
}
if (nh >= 0 && nh < H && nw >= 0 && nw < W) {
if (park[nh].substring(nw, nw + 1).equals("X")) break;
if (i == n - 1) {
h = nh;
w = nw;
}
}
}
}
int[] answer = {h, w};
return answer;
}
}
📌 다른 코드
내가 참고한 코드인데, 더 깔끔하고 가독성이 좋은 것 같다고 느꼈다. 우선 시작 좌표를 구할 때도 나처럼 이중 for문을 돌지 않아도 indexOf를 활용해 구할 수 있다는 것을 알게 되었다. 또한 routes 배열을 돌며 이동할 때도 switch문으로 좀 더 깔끔하게 작성한 점이 마음에 든다. 다른 사람들의 코드를 많이 보면서 계속해서 배워나가야겠다..😅
class Solution {
public int[] solution(String[] park, String[] routes) {
int h = park.length;
int w = park[0].length();
int startH = 0;
int startW = 0;
for(int i=0; i<h; i++){
if(park[i].contains("S"))
{
startH = i;
startW = park[i].indexOf("S");
}
}
for(String route : routes){
String d = route.split(" ")[0];
int move = Integer.parseInt(route.split(" ")[1]);
int moveH = startH;
int moveW = startW;
for(int i=0; i<move; i++)
{
switch(d) {
case "S" : moveH++; break;
case "N" : moveH--; break;
case "E" : moveW++; break;
case "W" : moveW--; break;
}
if(moveH>=0&& moveH<h&&moveW>=0&&moveW<w){
if(park[moveH].substring(moveW,moveW+1).equals("X")){
break;
}
if(i==move-1){
startH=moveH;
startW=moveW;
}
}
}
}
int[] answer = {startH,startW};
return answer;
}
}
'프로그래머스 > Lv.1' 카테고리의 다른 글
[프로그래머스/Lv.1] 비밀지도(2018 KAKAO BLIND RECRUITMENT) - Java (0) | 2024.04.12 |
---|---|
[프로그래머스/Lv.1] 가장 가까운 같은 글자 - Java (0) | 2024.04.11 |
[프로그래머스/Lv.1] 시저 암호 - Java (0) | 2024.04.09 |
[프로그래머스/Lv.1] 신고 결과 받기(2022 KAKAO BLIND RECRUITMENT) - Java (0) | 2024.04.09 |
[프로그래머스/Lv.1] 같은 숫자는 싫어 - Java (0) | 2024.04.08 |