객체 지향 프로그래밍의 특징
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문을 써서 확인
좌표로 이루어진 문제는 너무 헷갈린다
'TIL' 카테고리의 다른 글
2023-10-27(프로그래머스) (1) | 2023.10.27 |
---|---|
2023-10-26 TIL(프로그래머스) (0) | 2023.10.26 |
2023-10-24 TIL(프로그래머스) (0) | 2023.10.24 |
2023-10-23 TIL(컬랙션) (0) | 2023.10.23 |
2023-10-20 TIL (추상클래스와 인터페이스의 차이점) (2) | 2023.10.20 |
댓글