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 | 31 |
Tags
- 백준
- 스파르타내일배움캠프TIL
- Python
- AWS
- 중심사회
- 스파르타코딩클럽
- 내일배움캠프
- 개인공부
- wil
- 자바
- 99클럽
- 부트캠프
- Flutter
- 프로그래머스
- java
- 컴퓨터개론
- 국비
- 99일지
- 운영체제
- 스파르타내일배움캠프WIL
- til
- 개발자스터디
- Spring
- 개발자블로그
- 항해
- MySQL
- 컴퓨터구조론 5판
- 소프트웨어
- 스파르타내일배움캠프
- 코딩테스트
Archives
- Today
- Total
컴공생의 발자취
프로그래머스(공원 산책) 본문
728x90
반응형
💡 오늘의 학습 키워드
- 프로그래머스
* 공원 산책 : 미들러 문제(Level 1)
오늘의 회고
문제1 : [공원 산책]
- 어떤 문제가 있었고, 나는 어떤 시도를 했는지
1차원 String 배열에서 시작점과 이동할 방향, 크기가 주어진다. 마지막으로 위치한 좌표(y, x)를 리턴하는 문제이다.
단, 아래의 경우는 해당 명령을 무시하고 다음 명령을 수행한다.
- 주어진 방향으로 이동할 때 공원을 벗어나는지 확인
- 주어진 방향으로 이동 중 장애물을 만나는지 확인
일단, 입력된 명령만큼 반복문을 돌며
동서남북을 판별하고, 공원을 벗어나는지 / 장애물을 만나는지 확인한다.
그렇게 로직자체는 어렵지 않았다. 문제는 배열의 범위를 벗어난게 문제였다.
배열의 범위를 자꾸 벗어나고 해서 GPT야.. 도와줘ㅠ
아래의 코드 부분이 배열의 범위를 벗어나게 했나보다.
변경하고 나서는 잘 됐다.
for (int i = 0; i < num; i++) // 변경 전
for (String route : routes) // 변경 후
그러고 문제를 읽으면서 시작점이 0,0이 아니라는 걸 알았다.
'S'가 입력된 곳이 시작점이었다. 이것까지 수정해주고 통과할 수 있었다.
- 어떻게 해결했는지
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
반응형
'💡 코테' 카테고리의 다른 글
Call by Value, Call by Reference 및 프로그래머스(행렬 테두리 회전하기) (0) | 2024.04.20 |
---|---|
프로그래머스(나머지가 1이 되는 수 찾기) (0) | 2024.04.19 |
프로그래머스(내적) (0) | 2024.04.17 |
시간 초과 및 프로그래머스(연속된 부분 수열의 합) (1) | 2024.04.16 |
프로그래머스(개인정보 수집 유효기간) (0) | 2024.04.15 |