Light Blue Pointer
본문 바로가기
Coding Test

[프로그래머스][Lv.1]공원 산책

by Greedy 2023. 10. 26.

문제 주소

https://school.programmers.co.kr/learn/courses/30/lessons/172928

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

  • 공원 산책

문제 설명

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

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

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

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

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

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

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


제한사항

  • 3 ≤ park의 길이 ≤ 50
    • 3 ≤ park[i]의 길이 ≤ 50
      • park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.
        • S : 시작 지점
        • O : 이동 가능한 통로
        • X : 장애물
    • park는 직사각형 모양입니다.
  • 1 ≤ routes의 길이 ≤ 50
    • routes의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.
    • 로봇 강아지는 routes의 첫 번째 원소부터 순서대로 명령을 수행합니다.
    • routes의 원소는 "op n"과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.
      • op는 다음 네 가지중 하나로 이루어져 있습니다.
        • N : 북쪽으로 주어진 칸만큼 이동합니다.
        • S : 남쪽으로 주어진 칸만큼 이동합니다.
        • W : 서쪽으로 주어진 칸만큼 이동합니다.
        • E : 동쪽으로 주어진 칸만큼 이동합니다.
      • 1 ≤ n ≤ 9

입출력 예

park routes result

["SOO","OOO","OOO"] ["E 2","S 2","W 1"] [2,1]
["SOO","OXX","OOO"] ["E 2","S 2","W 1"] [0,1]
["OSO","OOO","OXO","OOO"] ["E 2","S 3","W 1"] [0,0]

입출력 예 설명

입출력 예 #1

입력된 명령대로 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동하면 [0,0] -> [0,2] -> [2,2] -> [2,1]이 됩니다.

입출력 예 #2

입력된 명령대로라면 동쪽으로 2칸, 남쪽으로 2칸, 서쪽으로 1칸 이동해야하지만 남쪽으로 2칸 이동할 때 장애물이 있는 칸을 지나기 때문에 해당 명령을 제외한 명령들만 따릅니다. 결과적으로는 [0,0] -> [0,2] -> [0,1]이 됩니다.

입출력 예 #3

처음 입력된 명령은 공원을 나가게 되고 두 번째로 입력된 명령 또한 장애물을 지나가게 되므로 두 입력은 제외한 세 번째 명령만 따르므로 결과는 다음과 같습니다. [0,1] -> [0,0]

제출 코드

class Solution {
    static public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        
        boolean go; 
        
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);
            System.out.println("a,b"+a+","+b);

            go = true;

            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            break LoopN;
                        }
                    }
                    if (go==true) {
                        h = h - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("W")) {
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            System.out.println("LoopW");
                            break LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                    }
                }
            } else if (a.equals("S")) {
                if ((h + b) < maxH) {
                    LoopS:
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) == 'X') {
                            go = false;
                            break LoopS;
                        }
                    }
                    if (go) {
                        h = h + b;
                    }
                }
            } else if (a.equals("E")) {
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) == 'X') {
                            go = false;
                            break LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                        System.out.println("E"+h+","+w);
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}

풀이 과정

직사각형임

강아지가 공원을 벗어나는지 h<H,w<W로 비교하면 될듯 H-1, W-1이니까

장애물은 x인지 확인

명령 읽는거 이런식으로 하면 될듯 아까 푼 0단계 문제 되게 도움된다

a, b = .strip().split(' ')
b = (int)b

⭐파이썬 중첩반복문 break

  1. add a flag variable
# add a flag variable
break_out_flag = False
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break_out_flag = True
            break
    if break_out_flag:
        break
  1. Use the For-Else Syntax
# use the for-else syntax
for i in range(5):
    for j in range(5):
        if j == 2 and i == 0:
            break
    else:  # only execute when it's no break in the inner loop
        continue
    break

3.Put It Into a Function

# make it as a function
def check_sth():
    for i in range(5):
        for j in range(5):
            if j == 2 and i == 0:
                return
check_sth() # Run the function

Final Thoughts: Avoid Nested Loops

If there are no elegant solutions to break out of nested loops, why not avoid writing nest loops? If it’s possible, we will smartly switch the hard problem into a easier problem.

By using some helper functions, we can indeed avoid nested loops:

# Avoid nested loops
import itertools
for i, j in itertools.product(range(5), range(5)):
    if j == 2 and i == 0:
        break

걍 함수로 짬

def findStart(park):
    for i in range(len(park)):
        for j in range(len(x)):
            if(park[i][j]=='S'):
                return i,j;
    

def solution(park, routes):

    
    h,w = findStart(park)
def findStart(park):
    for i in range(len(park)):
        for j in range(len(x)):
            if(park[i][j]=="S"):
                return i,j;
    

def solution(park, routes):
    
    h,w = findStart(park)
    
    for x in routes:
        a, b = x.strip().split(' ')
        b = (int)b
        
        if(a=="N"):
            if(0=<(h-b)):
                h = h-b
        elif(a=="W"):
            if(0=<(w-b)):
                w = w-b
        elif(a=="S"):
            if((h+b)<len(park[0]):
               h=h+b
        elif(a=="E"):
            if((w+b)<len(park)):
               w = w+b

    
    answer = [h,w]
    return answer

이렇게 짬

b = (int)b

^

SyntaxError: invalid syntax

def findStart(park):
    for i in range(len(park)):
        for j in range(len(x)):
            if(park[i][j]=="S"):
                return i,j;
    

def solution(park, routes):
    
    h,w = findStart(park)
    
    for x in routes:
        a, b = x.strip().split(' ')
        b = (int)b
        
        if(a=="N"):
            if(0<=(h-b)):
                h = h-b
        elif(a=="W"):
            if(0<=(w-b)):
                w = w-b
        elif(a=="S"):
            if((h+b)<len(park[0]):
               h=h+b
        elif(a=="E"):
            if((w+b)<len(park)):
               w = w+b
            
       
    
    answer = [h,w]
    return answer

어제부터 저게 왜 안 되는지 모르겠다 걍 없애봄

for x in routes:
        a, b = x.strip().split(' ')

        
        if(a=="N"):
            if(0<=(h-b)):
                h = h-b
        elif(a=="W"):
            if(0<=(w-b)):
                w = w-b
        elif(a=="S"):
            if((h+b)<len(park[0])):
               h=h+b
        elif(a=="E"):
            if((w+b)<len(park)):
               w = w+b
answer = [h,w]
return answer

NameError: name 'x' is not defined

뭔소리임 대체

Name X is not defined error in Python

In Python, a NameError: name 'x' is not defined error is raised when the program attempts to access or use a variable that has not been defined or assigned a value. This can happen if the variable is spelled incorrectly, or if it is accessed before it has been defined.

def findStart(park):
    for i in range(len(park)):
        for j in range(len(x)):
            if(park[i][j]=="S"):
                return i,j;
    

def solution(park, routes):
    
    h,w = findStart(park)
    
    for i in range(len(routes)):
        a, b = routes[i].strip().split(' ')

        
        if(a=="N"):
            if(0<=(h-b)):
                h = h-b
        elif(a=="W"):
            if(0<=(w-b)):
                w = w-b
        elif(a=="S"):
            if((h+b)<len(park[0])):
               h=h+b
        elif(a=="E"):
            if((w+b)<len(park)):
               w = w+b
            
       
    
    answer = [h,w]
    return answer

엥 x라곤 없는데

NameError: name 'x' is not defined

또 이 에러가

for i in range(len(routes)):
        a, b = routes[i].strip().split(' ')

허어 가슴이 답답해져오니 자바로 먼저 풀어본다

자바 → 파이썬 순서로 푸는게 나을듯

⭐자바 String split, strip

String str = "geekss@for@geekss";
        String[] arrOfStr = str.split("@", 2);

⭐자바 String to Integer

int number = Integer.parseInt(str);

Integer number = Integer.valueOf(str)

I have created a simple method for checking whether the passed-in string is numeric or not.

public class StringTest {
    public static void main(String[] args) {
        String str = "25";
        String str1 = "25.06";
        System.out.println(isNumeric(str));
        System.out.println(isNumeric(str1));
    }

    private static boolean isNumeric(String str){
        return str != null && str.matches("[0-9.]+");
    }
}
class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int h = 0;
        int w = 0;
        
        Loop1:
        for(int i=0;i<park.length;i++){
            for(int j=0;j<park[i].length;j++){
                if(park[i][j]=="S"){
                    h=j;
                    w=i;
                    break Loop1;
                }
            }
        }
        
        for(int i =0;i<routes.length;i++){
            String x = routes[i];
            String[] route = x.split(" ",2);
            
            String a = route[0];
            int b = Integer.parseInt(route[1]);

        if(a=="N"){
            if(0<=(h-b)){
                h = h-b;
            } 
        }       
        else if(a=="W"){
            if(0<=(w-b)){
                 w = w-b   ;    
                }    
        }else if(a=="S"){
            if((h+b)<park[0].length){
               h=h+b;
            }
        }
        else if(a=="E"){
            if((w+b)<park.length){
               w = w+b;
            }
        }
 
    }
        int[] answer = {h,w};
        return answer;
}
}

ㅋㅋㅋ String 배열이 들어오는데 혼자 2차원 배열이라고 생각하고 풂

코드 수정해야함

Loop1:
        for(int i=0;i<park.length;i++){
            for(int j=0;j<park[i].length();j++){
                if(park[i].charAt(j)=='S'){
                    h=j;
                    w=i;
                    break Loop1;
                }
            }
        }

이렇게 수정했다

이제 돌아가긴 하는데

결괏값이 달라버림!

테스트 1입력값 〉["SOO", "OOO", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[2, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [2,1]과 다릅니다.테스트 2입력값 〉["SOO", "OXX", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[0, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [0,1]과 다릅니다.테스트 3입력값 〉["OSO", "OOO", "OXO", "OOO"], ["E 2", "S 3", "W 1"]기댓값 〉[0, 0]실행 결과 〉실행한 결괏값 [1,0]이 기댓값 [0,0]과 다릅니다.
class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int h = 0;
        int w = 0;
        
        Loop1:
        for(int i=0;i<park.length;i++){
            for(int j=0;j<park[i].length();j++){
                if(park[i].charAt(j)=='S'){
                    h=j;
                    w=i;
                    break Loop1;
                }
            }
        }
        
        int maxH = park.length;
        int maxW = park[0].length();
        
        for(int i =0;i<routes.length;i++){
            String x = routes[i];
            String[] route = x.split(" ",2);
            
            String a = route[0];
            int b = Integer.parseInt(route[1]);

        if(a=="N"){
            if(0<=(h-b)){
                h = h-b;
            } 
        }       
        else if(a=="W"){
            if(0<=(w-b)){
                 w = w-b   ;    
                }    
        }else if(a=="S"){
            if((h+b)<maxH){
               h=h+b;
            }
        }
        else if(a=="E"){
            if((w+b)<maxW){
               w = w+b;
            }
        }
 
    }
        int[] answer = {h,w};
        return answer;
}
}
테스트 1입력값 〉["SOO", "OOO", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[2, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [2,1]과 다릅니다.테스트 2입력값 〉["SOO", "OXX", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[0, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [0,1]과 다릅니다.테스트 3입력값 〉["OSO", "OOO", "OXO", "OOO"], ["E 2", "S 3", "W 1"]기댓값 〉[0, 0]실행 결과 〉실행한 결괏값 [1,0]이 기댓값 [0,0]과 다릅니다.테스트 결과 (~˘▾˘)~
3개 중 0개 성공

테스트코드

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) {

        String [] park = {"SOO","OOO","OOO"};
        String [] routes = {"E 2","S 2","W 1"};

            int h = 0;
            int w = 0;

            Loop1:
            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;
                        break Loop1;
                    }
                }
            }

            int maxH = park.length;
            int maxW = park[0].length();

            for(int i =0;i<routes.length;i++){
                String x = routes[i];
                String[] route = x.split(" ",2);

                String a = route[0];
                int b = Integer.parseInt(route[1]);

                if(a=="N"){
                    if(0<=(h-b)){
                        h = h-b;
                        System.out.println("N"+h);
                    }
                }
                else if(a=="W"){
                    if(0<=(w-b)){
                        w = w-b   ;
                        System.out.println("W"+w);
                    }
                }else if(a=="S"){
                    if((h+b)<maxH){
                        h=h+b;
                        System.out.println("S"+h);
                    }
                }
                else if(a=="E"){
                    if((w+b)<maxW){
                        w = w+b;
                        System.out.println("E"+w);
                    }
                }

            }
            int[] answer = {h,w};
            System.out.println(h);
            System.out.println(w);

    }
}

0 0

오 저 if문 자체가 안 돌아가 버림

for(int i =0;i<routes.length;i++){
                String x = routes[i];
                String[] route = x.split(" ",2);

                String a = route[0];
                int b = Integer.parseInt(route[1]);
                System.out.println("a,b");
                System.out.println(a);
                System.out.println(b);
for(int i =0;i<routes.length;i++){
                String x = routes[i];
                String[] route = x.split(" ",2);

                String a = route[0];
                int b = Integer.parseInt(route[1]);
                System.out.println("a,b");
                System.out.println(a);
                System.out.println(b);

a,b E 2 a,b S 2 a,b W 1 0 0

생각해보니 String 은 equals 써야 한다

if(a.equals("N"))

equals로 고치니까 해결되었다

근데 장애물 피하는걸 안 넣음ㅋㅋㅋㅋㅋㅋㅋㅋ

if(a.equals("N")){
            if(0<=(h-b)){
                if(!park[h].charAt(w).equals("X")){
                    h = h-b; 
                }
            } 
        }

이렇게 바꿈

if(!park[h+b].charAt(w).equals("X")){

이건 또 char이라서 String 아닌거 깜빡함

class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int h = 0;
        int w = 0;
        
        Loop1:
        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;
                    break Loop1;
                }
            }
        }
        
        int maxH = park.length;
        int maxW = park[0].length();
        
        for(int i =0;i<routes.length;i++){
            String x = routes[i];
            String[] route = x.split(" ",2);
            
            String a = route[0];
            int b = Integer.parseInt(route[1]);

        if(a.equals("N")){
            if(0<=(h-b)){
                if(park[h-b].charAt(w)!='X'){
                    h = h-b; 
                }
            } 
        }       
        else if(a.equals("W")){
            if(0<=(w-b)){
                if(park[h].charAt(w-b)!='X'){
                    w = w-b;
                }   
            }    
        }else if(a.equals("S")){
            if((h+b)<maxH){
                if(park[h+b].charAt(w)!='X'){
                    h=h+b;
                }
            }
        }
        else if(a.equals("E")){
            if((w+b)<maxW){
                if(park[h].charAt(w+b)!='X'){
                    w = w+b;
                }
            }
        }
    }
        int[] answer = {h,w};
        return answer;
}
}

// Press Shift twice to open the Search Everywhere dialog and type `show whitespaces`,
// then press Enter. You can now see whitespace characters in your code.
public class Main {
    public static void main(String[] args) {

        String [] park = {"SOO","OXX","OOO"};
        String [] routes = {"E 2","S 2","W 1"};

            int h = 0;
            int w = 0;

            Loop1:
            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;
                        System.out.println("S:" +h+","+w);
                        break Loop1;
                    }
                }
            }

            int maxH = park.length;
            int maxW = park[0].length();

            for(int i =0;i<routes.length;i++){
                String x = routes[i];
                String[] route = x.split(" ",2);

                String a = route[0];
                int b = Integer.parseInt(route[1]);
                System.out.println("a,b");
                System.out.println(a);
                System.out.println(b);

                if(a.equals("N")){
                    if(0<=(h-b)){
                        if(park[h-b].charAt(w)!='X'){
                            h = h-b;
                            System.out.println(park[h-b].charAt(w));
                            System.out.println(h+","+w);
                        }
                    }
                }
                else if(a.equals("W")){
                    if(0<=(w-b)){
                        if(park[h].charAt(w-b)!='X'){
                            w = w-b;
                            System.out.println(park[h].charAt(w-b));
                            System.out.println(h+","+w);
                        }
                    }
                }else if(a.equals("S")){
                    if((h+b)<maxH){
                        if(park[h+b].charAt(w)!='X'){
                            h=h+b;
                            System.out.println(park[h-b].charAt(w));
                            System.out.println(h+","+w);
                        }
                    }
                }
                else if(a.equals("E")){
                    if((w+b)<maxW){
                        if(park[h].charAt(w+b)!='X'){
                            w = w+b;
                            System.out.println(park[h].charAt(w+b));
                            System.out.println(h+","+w);
                        }
                    }
                }

            }
            int[] answer = {h,w};
            System.out.println(h);
            System.out.println(w);

    }
}

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4

System.*out*.println(park[h].charAt(w+b));

w가 이미 w+b가 되었는데 거기서 또 w+b를 해버리면 문제가 생기지

else if(a.equals("E")){
                    if((w+b)<maxW){
                        if(park[h].charAt(w+b)!='X'){
                            w = w+b;
                            System.out.println(park[h].charAt(w));
                            System.out.println(h+","+w);
                        }
                    }
                }

으로 수정함

문제 : 그리고 깨달음 중간에 장애물이 있으면 못가는거지 목적지에만 X가 있는지 보면 되는게 아니라는걸

문제를 처음부터 좀 꼼꼼하게 읽고 생각을 하면서 풀어야겠다

해결: 장애물 있으면 루프 다음으로 스킵하게 바꿈

int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        LoopRoutes:
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);

            boolean go = true;
            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    for (int i = 0; i < b; i++) {
                        if (park[h - i].charAt(w) == 'X') {
                            continue LoopRoutes;
                        }
                    }

                    h = h - b;
                }
            } else if (a.equals("W")) {
                if (0 <= (w - b)) {
                    for (int i = 0; i < b; i++) {
                        if (park[h].charAt(w - i) == 'X') {
                            continue LoopRoutes;
                        }
                    }

                    w = w - b;

                }
            } else if (a.equals("S")) {
                if ((h + b) < maxH) {
                    for (int i = 0; i < b; i++) {
                        if (park[h + i].charAt(w) != 'X') {
                            continue LoopRoutes;
                        }
                    }
                    h = h + b;
                }
            } else if (a.equals("E")) {
                if ((w + b) < maxW) {
                    for (int i = 0; i < b; i++) {
                        if (park[h].charAt(w + i) != 'X') {
                            continue LoopRoutes;
                        }
                    }

                    w = w + b;

                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

Solution.java:43: error: variable i is already defined in method solution(String[],String[])

for(int i=0;i<b;i++){

^

그리고 내가 routes읽는 for문을 돌리는 중이었던 것을 까먹고 index를 겹치게 사용한 것을 깨달음

j로 다 변경함

class Solution {
    public int[] solution(String[] park, String[] routes) {
        
        int h = 0;
        int w = 0;
        
        Loop1:
        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;
                    break Loop1;
                }
            }
        }
        
        int maxH = park.length;
        int maxW = park[0].length();
        
        LoopRoutes:
        for(int i =0;i<routes.length;i++){
            String x = routes[i];
            String[] route = x.split(" ",2);
            
            String a = route[0];
            int b = Integer.parseInt(route[1]);

            boolean go = true;
        if(a.equals("N")){
            if(0<=(h-b)){
                for(int j=0;j<b;j++){
                    if(park[h-j].charAt(w)=='X'){
                        continue LoopRoutes;
                    }
                }
                
                 h = h-b;
            } 
        }       
        else if(a.equals("W")){
            if(0<=(w-b)){
                for(int j=0;j<b;j++){
                    if(park[h].charAt(w-j)=='X'){
                        continue LoopRoutes;
                    }
                }
                 
                    w = w-b;
                   
            }    
        }else if(a.equals("S")){
            if((h+b)<maxH){
                for(int j=0;j<b;j++){
                    if(park[h+j].charAt(w)!='X'){
                        continue LoopRoutes;
                    }
                }
                    h=h+b;
                }
            }
        
        else if(a.equals("E")){
            if((w+b)<maxW){
                for(int j=0;j<b;j++){
                    if(park[h].charAt(w+j)!='X'){
                        continue LoopRoutes;
                    }
                }
                
                    w = w+b;
            
            }
        }
    }
        int[] answer = {h,w};
        return answer;}
    
}

예전에는 1번만 됐는데 이제 테스트 3번만 통과함 ㅋㅋ…

생각해보니 h에서 b만큼 가고싶었으면 b까지 포함해서 검사하는게 맞음

목적지에 장애물이 있는 경우는 빼고 하고 있었음

for문 수정해봄

if(a.equals("N")){
            if(0<=(h-b)){
                for(int j=0;j<=b;j++){
                    if(park[h-j].charAt(w)=='X'){
                        continue LoopRoutes;
                    }
                }
                 h = h-b;
            } 
        }
테스트 1입력값 〉["SOO", "OOO", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[2, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [2,1]과 다릅니다.테스트 2입력값 〉["SOO", "OXX", "OOO"], ["E 2", "S 2", "W 1"]기댓값 〉[0, 1]실행 결과 〉실행한 결괏값 [0,0]이 기댓값 [0,1]과 다릅니다.테스트 3입력값 〉["OSO", "OOO", "OXO", "OOO"], ["E 2", "S 3", "W 1"]기댓값 〉[0, 0]실행 결과 〉테스트를 통과하였습니다.

또 안 됨 근데 3번만 되는 이유가 자세히 보니 결과 기대값이 0,0이어서인 거 같다 ㅋㅋㅋㅋ

셋다 0,0만 나오고 있어…

생각해보니 아예 LoopRoutes를 나가버리면 안 되고

저 if문만 나가야 해서 break 말고 다른 방법 써야할 거 같다

if(a.equals("N")){
            if(0<=(h-b)){
                LoopN:
                for(int j=0;j<=b;j++){
                    if(park[h-j].charAt(w)=='X'){
                        go= false;
                        continue LoopN;
                    }
                }
                if(go){
                    h = h-b;
                }
                 
            }

이렇게 수정했다

class Solution {
    public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        LoopRoutes:
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);
            
            String a = route[0];
            int b = Integer.parseInt(route[1]);
            
            boolean go = true;
            
            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            continue LoopN;
                        }
                    }
                    if (go) {
                        h = h - b;
                    }
                }
            } else if (a.equals("W")) {
                go = true;
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            continue LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                    }
                }
            } else if (a.equals("S")) {
                go = true;
                if ((h + b) < maxH) {
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) != 'X') {
                            go = false;
                            continue LoopRoutes;
                        }
                    }
                    if (go) {
                        h = h + b;
                    }
                }
            } else if (a.equals("E")) {
                go = true;
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) != 'X') {
                            continue LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}

이렇게 수정했는데 테스트 1이 통과가 안 된다

그리고 여태까지 파이썬 돌리면서 항상 메인으로 바꿔서 넣었었는데

자바로 하니까 솔루션 클래스를 따로 넣으면 된다는걸 알게되었다…

class Solution {
    static public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        LoopRoutes:
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);

            boolean go = true;

            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            continue LoopN;
                        }
                    }
                    if (go) {
                        h = h - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("W")) {
                go = true;
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            continue LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("S")) {
                go = true;
                if ((h + b) < maxH) {
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) != 'X') {
                            go = false;
                            continue LoopRoutes;
                        }
                    }
                    if (go) {
                        h = h + b;
                        System.out.println("S"+h+","+w);
                    }
                }
            } else if (a.equals("E")) {
                go = true;
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) != 'X') {
                            continue LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                        System.out.println("E"+h+","+w);
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}

흠…

아 그리고 이제 테스트를 다른 프로그램으로 할 필요 없다는것도 알게됨 ㅋㅋ

프로그래머스에서 print 함수 넣으니까 출력을 띄워준다

입력값 〉 ["SOO", "OOO", "OOO"], ["E 2", "S 2", "W 1"]

기댓값 〉 [2, 1]
실행 결과 〉 실행한 결괏값 [0,1]이 기댓값 [2,1]과 다릅니다.
출력 〉 a,bE,2E0,2a,bS,2a,bW,1N0,1

N은 명령어로 들어오지도 않았는데 왜 가는건데

S는 왜 안 가지고 W는 왜 N을 가는건데..?

아마 go가 초기화가 안 돼서 그런거 같다고 생각

go를 무조건 실행하지도 않는 곳인 if에 넣어두었고 E에는 go=false를 안 넣어둔걸 발견하게 됐다

그리고 지금보니 LoopE는 break를 해야하는데 왜 continue를 하고있는지 모르겠다

오늘 하루종일 집중 안 되더니 코딩테스트 푸는데 이렇게까지 덜렁거릴 일인지 모르겠다

class Solution {
    static public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        LoopRoutes:
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);
            System.out.println("a,b"+a+","+b);

            boolean go = true;

            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            break LoopN;
                        }
                    }
                    if (go) {
                        h = h - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("W")) {
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            break LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("S")) {
                if ((h + b) < maxH) {
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) != 'X') {
                            go = false;
                            break LoopRoutes;//->오타났다...
                        }
                    }
                    if (go) {
                        h = h + b;
                        System.out.println("S"+h+","+w);
                    }
                }
            } else if (a.equals("E")) {
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) != 'X') {
                            go = false;
                            break LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                        System.out.println("E"+h+","+w);
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}
class Solution {
    static public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);
            System.out.println("a,b"+a+","+b);

            boolean go = true;

            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            
                            System.out.println("LoopN");
                            break LoopN;
                        }
                    }
                    if (go) {
                        h = h - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("W")) {
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            
                            System.out.println("LoopW");
                            break LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("S")) {
                if ((h + b) < maxH) {
                    LoopS:
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) != 'X') {
                            go = false;
                            
                            System.out.println("LoopS");
                            break LoopS;
                        }
                    }
                    if (go) {
                        h = h + b;
                        System.out.println("S"+h+","+w);
                    }
                }
            } else if (a.equals("E")) {
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) != 'X') {
                            go = false;
                            
                            System.out.println("LoopE");
                            break LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                        System.out.println("E"+h+","+w);
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}

a,bE,2

LoopE

a,bS,2

LoopS

a,bW,1

go가 flag로써 동작하지 않는뎁쇼

LoopE가 출력되면

if (park[h].charAt(w + j) != 'X') {
                            go = false;
                            
                            System.out.println("LoopE");
                            break LoopE;
                        }

이게 실행된단 얘기인데 go에 false가 들어가서 안 나오는듯

지금보니 코드를 잘못 짬

break 랑 if문으로 고칠거였으면 X면 break하게 해야지 X가 아니면 break하게 하고 있음

지금보니 위에 두개만 고치고 아래는 놔둠

약간 코테사이트에 가스라이팅 당하는 기분인데 내가 왜 저랬을까

수정하는데 저렇게까지 깜빡깜빡하고 나머지 수정해야 할 걸 놓친다고?

class Solution {
    static public int[] solution(String[] park, String[] routes) {

        int h = 0;
        int w = 0;

        Loop1:
        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;
                    break Loop1;
                }
            }
        }

        int maxH = park.length;
        int maxW = park[0].length();

        
        boolean go; 
        
        for (int i = 0; i < routes.length; i++) {
            String x = routes[i];
            String[] route = x.split(" ", 2);

            String a = route[0];
            int b = Integer.parseInt(route[1]);
            System.out.println("a,b"+a+","+b);

            go = true;

            if (a.equals("N")) {
                if (0 <= (h - b)) {
                    LoopN:
                    for (int j = 0; j <= b; j++) {
                        if (park[h - j].charAt(w) == 'X') {
                            go = false;
                            break LoopN;
                        }
                    }
                    if (go==true) {
                        h = h - b;
                        System.out.println("N"+h+","+w);
                    }
                }
            } else if (a.equals("W")) {
                if (0 <= (w - b)) {
                    LoopW:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w - j) == 'X') {
                            go = false;
                            System.out.println("LoopW");
                            break LoopW;
                        }
                    }
                    if (go) {
                        w = w - b;
                    }
                }
            } else if (a.equals("S")) {
                if ((h + b) < maxH) {
                    LoopS:
                    for (int j = 0; j <= b; j++) {
                        if (park[h + j].charAt(w) == 'X') {
                            go = false;
                            break LoopS;
                        }
                    }
                    if (go) {
                        h = h + b;
                    }
                }
            } else if (a.equals("E")) {
                if ((w + b) < maxW) {
                    LoopE:
                    for (int j = 0; j <= b; j++) {
                        if (park[h].charAt(w + j) == 'X') {
                            go = false;
                            break LoopE;
                        }
                    }

                    if (go) {
                        w = w + b;
                        System.out.println("E"+h+","+w);
                    }
                }
            }
        }
        int[] answer = {h, w};
        return answer;
    }

}

드디어 다 고침

별로 어렵지도 않은 문제 엄청 힘들게 풀었다 ㅋㅋ

아무래도 adhd약을 먹어야될듯

다른 사람의 풀이

class Solution {
    public static int[] solution(String[] park, String[] routes) {
        int x = 0;
        int y = 0;
        int[][] arr = {{-1,0},{1,0},{0,-1},{0,1}};
        boolean start = false;
        for(int i=0; i< park.length;i++){
            if(start){
                break;
            }
            for(int j=0; j<park[i].length();j++){
                if(park[i].charAt(j) == 'S'){
                    x = i;
                    y = j;
                    start = true;
                    break;
                }
            }
        }

        for (String route : routes) {
            String[] routeArr = route.split(" ");
            String direction = routeArr[0];
            int distance = Integer.parseInt(routeArr[1]);

            int index = getDirectionIndex(direction);

            if(isWalk(park, x, y, distance, arr[index])){
                x += distance*arr[index][0];
                y += distance*arr[index][1];
            }
        }

        return new int[]{x,y};
    }

    private static boolean isWalk(String[] park, int x, int y, int distance, int[] arr) {
        for(int i = 0; i< distance; i++){
            x+= arr[0];
            y+= arr[1];

            if(y<0 || y> park[0].length()-1 || x<0 || x> park.length-1 || park[x].charAt(y)=='X'){
                return false;
            }
        }
        return true;
    }

    private static int getDirectionIndex(String direction) {
        int index = 0;
        switch (direction){
            case "N":
                break;
            case "S":
                index = 1;
                break;
            case "W":
                index = 2;
                break;
            case "E":
                index = 3;
                break;
        }
        return index;
    }
}
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;
    }
}
import java.util.*;

class Solution {
    public int[] solution(String[] park, String[] routes) {
        int m = park.length;
        int n = park[0].length();
        int curX = 0;
        int curY = 0;
        char[][] grid = new char[m][n];

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                grid[i][j] = park[i].charAt(j);
                if (grid[i][j] == 'S') {
                    curX = i;
                    curY = j;
                }
            }
        }

        int[] dx = { -1, 1, 0, 0 };
        int[] dy = { 0, 0, -1, 1 };
        HashMap<Character, Integer> map = new HashMap<>();
        map.put('N', 0);
        map.put('S', 1);
        map.put('W', 2);
        map.put('E', 3);

        for (String command : routes) {

            char op = command.charAt(0);
            int move = command.charAt(2) - '0';

            int nextX = curX;
            int nextY = curY;
            boolean isOK = true;
            for (int i = 0; i < move; i++) {
                nextX += dx[map.get(op)];
                nextY += dy[map.get(op)];

                if (nextX < 0 || nextY < 0 || nextX >= m || nextY >= n || grid[nextX][nextY] == 'X') {
                    isOK = false;
                    break;
                }
            }

            if (isOK) {
                curX = nextX;
                curY = nextY;
            }
        }

        return new int[] { curX, curY };
    }
}
class Solution {
    public int[] solution(String[] park, String[] routes) {

        Cord cur = new Cord(0,0);
        A : for(int i=0; i<park.length; i++) {
            String str = park[i];
            for(int j=0; j<str.length(); j++) {
                if(park[i].charAt(j)=='S') {
                    cur = new Cord(i, j);
                    break A;
                }
            }
        }
        B : for(int i=0; i<routes.length; i++) {
            char d = routes[i].charAt(0);
            int n = Integer.parseInt(routes[i].split(" ")[1]);
            if(d=='E') {
                if(cur.y+n>=park[0].length()) continue;
                for(int j=1; j<=n; j++) {
                    if(park[cur.x].charAt(cur.y+j)=='X') continue B;
                }
                cur = new Cord(cur.x, cur.y+n);
            } else if(d=='W') {
                if(cur.y-n<0) continue;
                for(int j=1; j<=n; j++) {
                    if(park[cur.x].charAt(cur.y-j)=='X') continue B;
                }
                cur = new Cord(cur.x, cur.y-n);
            } else if(d=='S') {
                if(cur.x+n>=park.length) continue;
                for(int j=1; j<=n; j++) {
                    if(park[cur.x+j].charAt(cur.y)=='X') continue B;
                }
                cur = new Cord(cur.x+n, cur.y);
            } else  {
                if(cur.x-n<0) continue;
                for(int j=1; j<=n; j++) {
                    if(park[cur.x-j].charAt(cur.y)=='X') continue B;
                }
                cur = new Cord(cur.x-n, cur.y);
            }
        }
        int[] answer = {cur.x, cur.y};

        return answer;
    }

    public class Cord {
        int x, y;

        Cord(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }
}