TIL

2023-10-25 TIL(객체 지향 프로그래밍의 특징, 프로그래머스)

우성팔 2023. 10. 25.

객체 지향 프로그래밍의 특징

1. 추상화

  • 객체에서 공통된 속성과 행위를 추출 하는 것 → 추상화를 해두면 코드 구현할 때 생각할 것들을 줄일 수 있다.
  • 공통의 속성과 행위를 찾아서 타입을 정의하는 과정
  • 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것

 

 

2. 캡슐화

  • 데이터 구조와 데이터를 다루는 방법들을 결합 시켜 묶는 것 (변수와 함수를 하나로 묶는 것을 뜻함)
  • 낮은 결합도를 유지할 수 있도록 설계하는 것

 

 

3. 상속

  • 클래스의 속성과 행위를 하위 클래스에 물려주거나 하위 클래스가 상위 클래스의 속성과 행위를 물려받는 것
  • 새로운 클래스가 기존의 클래스의 데이터와 연산을 이용할 수 있게 하는 기능

 

 

4. 다형성

  • 하나의 변수명, 함수명이 상황에 따라 다른 의미로 해석 될 수 있는 것
  • 어떠한 요소에 여러 개념을 넣어 놓는 것

 

 

객체 지향 프로그래밍의 장단점

장점

  • 클래스 단위로 모듈화시켜서 개발하기 때문에 업무 분담이 편리하고 대규모 소프트웨어 개발에 적합하다.
  • 클래스 단위로 수정이 가능하기 때문에 유지 보수가 편리하다.
  • 클래스를 재사용하거나 상속을 통해 확장함으로써 코드 재사용이 용이하다.

단점

  • 처리속도가 상대적으로 느리다.
  • 객체의 수가 많아짐에 따라 용량이 커질 수 있다.
  • 설계시 많은 시간과 노력이 필요하게 될 수 있다.

 

 

 

프로그래머스(공원 산책)

 

JAVA

public static int[] solution(String[] park, String[] routes) {
        int[] answer = {};
        char[][] park_path = new char[park.length][];
        char[][] route = new char[routes.length][];
        int x = 0, y = 0;

        for (int i = 0; i < park.length; i++) {
            park_path[i] = park[i].toCharArray(); // park 배열 안에 문자열을 문자들로 떨어뜨리기
        }
        for (int i = 0; i < routes.length; i++) {
            route[i] = routes[i].replace(" ", "").toCharArray(); // routes 안에 있는 공백 삭제하고 문자 하나하나를 배열로
        }

        for (int i = 0; i < park_path.length; i++) { // 시작점 찾기
            for (int j = 0; j < park_path[i].length; j++) {
                if (park_path[i][j] == 'S') {
                    x = j;
                    y = i;
                }
            }
        }

        for (char[] move : route) {
            char direction = move[0];
            int distance = Character.getNumericValue(move[1]);
            boolean flag = true;
            int newX = 0, newY = 0;
            if (direction == 'E') { // E방향 일때
                for (int dx = 1; dx < distance + 1; dx++) { // distance에 해당하는 거리까지 조금씩 늘려가면서 범위를 벗어나는지 범위 내에 'X'가 있는지 확인
                    newX = x + dx; 
                    if (newX >= park_path[0].length || park_path[y][newX] == 'X') {
                        flag = false;
                        break;
                    }
                }
                if (flag) { // 명령을 무시할 상황이 아니면 x좌표 이동 시키기
                    x = newX;
                }
            } else if (direction == 'W') {
                for (int dx = 1; dx < distance + 1; dx++) {
                    newX = x - dx;
                    if (newX < 0 || park_path[y][newX] == 'X') {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    x = newX;
                }
            } else if (direction == 'S') {
                for (int dy = 1; dy < distance + 1; dy++) {
                    newY = y + dy;
                    if (newY >= park_path.length || park_path[newY][x] == 'X') {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    y = newY;
                }
            } else if (direction == 'N') {
                for (int dy = 1; dy < distance + 1; dy++) {
                    newY = y - dy;
                    if (newY < 0 || park_path[newY][x] == 'X') {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    y = newY;
                }
            }
        }
        return new int[]{y, x};
    }
Character.getNumericValue()

↑ character형에 해당하는 숫자를 int형으로 바꿔줌!

 

 

Python

def solution(park, routes):
    park_path = [[i for i in path] for path in park]
    route = [[i for i in route.split()] for route in routes]

    for i in range(len(park_path)):
        for j in range(len(park_path[i])):
            if park_path[i][j] == "S":
                x, y = j, i

    for move in route:
        direction, distance = move[0], int(move[1])
        if direction == "E":
            for dx in range(1, distance + 1):
                new_x = x + dx
                if new_x >= len(park_path[0]) or park_path[y][new_x] == "X":
                    break
            else:
                x = new_x

        elif direction == "W":
            for dx in range(1, distance + 1):
                new_x = x - dx
                if new_x < 0 or park_path[y][new_x] == "X":
                    break
            else:
                x = new_x

        elif direction == "N":
            for dy in range(1, distance + 1):
                new_y = y - dy
                if new_y < 0 or park_path[new_y][x] == "X":
                    break
            else:
                y = new_y

        elif direction == "S":
            for dy in range(1, distance + 1):
                new_y = y + dy
                if new_y >= len(park_path) or park_path[new_y][x] == "X":
                    break
            else:
                y = new_y

    return [y, x]

알고리즘은 두 언어 모두 동일

java에서는 bool값인 flag변수를 사용해서 명령을 무시하는 조건에 해당하는지 확인

python에서는 for~else문을 써서 확인

 

좌표로 이루어진 문제는 너무 헷갈린다 

댓글