💡 코테/99클럽
[ 99클럽 코테 스터디 21일차 TIL ] 프로그래머스(공원 산책)
MNY
2024. 4. 18. 22:25
728x90
반응형
💡 오늘의 학습 키워드
- 프로그래머스
* 공원 산책 : 미들러 문제(Level 1)
오늘의 회고
문제1 : [공원 산책]
- 어떤 문제가 있었고, 나는 어떤 시도를 했는지
1차원 String 배열에서 시작점과 이동할 방향, 크기가 주어진다. 마지막으로 위치한 좌표(y, x)를 리턴하는 문제이다.
단, 아래의 경우는 해당 명령을 무시하고 다음 명령을 수행한다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인
- 주어진 방향으로 이동 중 장애물을 만나는지 확인
일단, 입력된 명령만큼 반복문을 돌며
동서남북을 판별하고, 공원을 벗어나는지 / 장애물을 만나는지 확인한다.
그렇게 로직자체는 어렵지 않았다. 문제는 배열의 범위를 벗어난게 문제였다.
![](https://blog.kakaocdn.net/dn/GNYQO/btsGI7x7Sdy/aWka8B8Djnll7fYDrX33mK/img.jpg)
배열의 범위를 자꾸 벗어나고 해서 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
반응형