SSAFY 1학기를 비전공 파이썬으로 마치고 나면 파이썬으로 알고리즘을 풀이하는 것에 익숙해지게 됩니다.
하지만, 요즘 기업에서 파이썬이 아닌 자바로만 코딩테스트를 보는 기업들이 점점 늘어나고 있어,
파이썬으로만 알고리즘 문제를 풀었던 친구들이 코딩테스트 때문에 입사지원을 포기하게 되는 경우를 종종 보게 됩니다.
하지만, 파이썬으로 알고리즘 문제를 풀 수 있다면, 로직을 짤 수 있는 사고 및 추론 능력은 충분합니다.
자바로 해당 코드를 어떻게 짜야하는가만 알면 금세 자바로 코딩테스트를 통과할 수 있을겁니다.
제가 느꼈던 "파이썬으로는 이렇게 풀면 되는데 자바로는 어떻게 코드를 짜야하지?" 의 생각들을
정리해둔다면 다른 비전공자 학생들도 자바로 코딩테스트를 무난하게 풀 수 있을 것이라 생각하여 글을 작성하게 되었습니다.
파이썬과 자바의 가장 큰 차이는 정적언어와 동적언어의 차이일겁니다.
lst = [] 으로 리스트를 간단하게 만들 수 있고
lst.append("1")
lst.append(1)
이렇게 다양한 타입의 언어들을 하나의 리스트에 다 넣어도 문제가 생기지 않는 파이썬에 익숙해지다보면
다양한 타입들을 리스트에 넣어야 하는 상황을 맞닥뜨리게 될 때 당황하게 됩니다.
배열보단 동적으로 가변 메모리를 갖는 리스트에 익숙하다보니 가변길이를 갖는 리스트를 찾게되고,
List<Integer> lst = new ArrayList<>(); 이렇게 만들면 간단하게 파이썬의 list와 비슷한 구현이 가능하겠구나! 라고 생각한 사람들에게 첫번째 관문이 바로 타입입니다.
문제로 예시를 들어보도록 하겠습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/1844
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
전형적인 bfs문제이며, row, column, depth를 체크해주면 되는 문제입니다.
Queue<int[]> q = new LinkedList<>(); 를 사용하여 Queue를 만든 뒤, [r, c, d] 형태로 넣어도 되겠지만,
만약 d가 숫자가 아니라 문자열이라면 int[]에 담을 수 없게 되기에 난관에 봉착하게 됩니다.
그렇기에 타입을 여러개 담을 수 있는 Class에 익숙해져야 합니다.
class Solution {
public static class Player{
int row;
int column;
int depth;
public Square(){
}
}
public int solution(int[][] maps) {
int answer = 0;
Player player = new Player();
return answer;
}
}
Player 객체를 만들고, 해당 플레이어의 row, column, 그리고 몇 번 움직여서 들어갔는지 체크할 depth 변수를 갖게 해줍니다
public int bfs(Queue<Player> q, int[][] maps){
boolean[][] visited = new boolean[endRow][endColumn];
visited[0][0] = true;
while(true){
if(q.isEmpty()){
return -1;
}
Player player = q.poll();
if(player.row == endRow-1 && player.column == endColumn-1){
return player.depth+1;
}
for(int d = 0; d<4; d++){
int nr = player.row + dr[d];
int nc = player.column + dc[d];
if(isValid(nr, nc) && maps[nr][nc] == 1 && !visited[nr][nc]){
q.add(new Player(nr, nc, player.depth+1));
visited[nr][nc] = true;
}
}
}
}
bfs의 로직을 보면 Player 객체를 만들어 그 안의 값들을 조작할 수 있습니다.
이렇게 파이썬에서 list안에 담던 것들을 객체로 만들어주면 좀 더 직관적으로 자바를 이용한 코딩테스트를 치룰 수 있습니다.
이중리스트의 경우에도 대부분은 내부 리스트가 아닌 객체 하나로 처리할 수가 있습니다.
객체지향적으로 코딩테스트를 풀을 필요는 없지만, 각각의 문제에 나온 요소들을 객체로 만들어서 관리해주면 좀 더 문제를 풀기에 편해진다는 걸 생각하면
파이썬에서 자바로 코딩테스트 언어를 옮기는 것은 그렇게 어렵지 않습니다
'자바 알고리즘 기초' 카테고리의 다른 글
자바 기초 알고리즘 - SWEA 영어공부 이분탐색 (0) | 2023.07.01 |
---|---|
자바 기초 알고리즘 - 분할정복으로 제곱 빠르게 계산하기 (0) | 2023.06.25 |
자바 기초 알고리즘 - LinkedList 직접 구현하기 - 2 (0) | 2023.06.09 |
자바 기초 알고리즘 - Linked List 직접 구현하기 (0) | 2023.06.04 |
JAVA 기초 알고리즘 - [프로그래머스] 과제 진행하기 (여러 값을 가진 리스트? 객체 만들기! + stack) (1) | 2023.05.09 |