약 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;
}
}
이번 문제를 풀면서 느낀점은
예외사항이나 고려해야할 점을 놓치면 안된다는 점이다.
차근차근 풀다보면 풀리지만 코드가 복잡해진다. 문법은 계속 반복해서 외우자.
'문제풀기 > 프로그래머스 문풀' 카테고리의 다른 글
[프로그래머스] 구간을 잘 나눠요 (1) | 2023.10.05 |
---|---|
[프로그래머스] 최솟값과 최댓값을 찾는방법 (0) | 2023.10.04 |
[프로그래머스0] 배열 자바 (0) | 2023.09.18 |
[프로그래머스] 2차원배열, 구간쿼리 (0) | 2023.09.05 |
[프로그래머스] 비교 연산 (0) | 2023.08.15 |