Notion을 자주 쓰게되면서 Notion 이 편해졌는데요.

마침 Notion을 기능을 이용한 woopy라는 서비스가 나와 블로그를 이전하게됐습니다.

이전 글들은 그대로 놔둘 예정이고 woopy라는 서비스 위에서 자유롭게 포스팅해보겠습니다.

woopy에서는 글을 게재하면서 조금씩 제 입맛대로 여러가지 꾸며볼려고 합니다.

 

이전 주소

https://codejcd.oopy.io/

 

'생각정리' 카테고리의 다른 글

코딩 테스트 인터뷰 리뷰  (0) 2023.01.11
리프레시 & 코로나  (0) 2022.11.24
이직  (0) 2022.07.30
인앱 결제 진행 중 생각정리  (0) 2022.05.26
코딩테스트  (0) 2022.03.30

지금까지 경험해 본 회사의 코딩 테스트 유형은 크게 세 가지다.

 

1. 온라인 코딩테스트

 보통 프로그래머스 같은 유명한 플랫폼으로 알고리즘 문제를 주로 풀게 된다.

유형은 경력직은 구현 문제가 많이 나오는 것 같고 회사마다 다르긴 하지만 적절하게 잘 섞어서

여러 가지 유형으로 출제된다.

 

2. 오프라인 코딩테스트

 일명 손코딩이라고 한다. 노트북을 주고 라이브 코딩을 시키는 곳도 있다고는 하는데 

아직 경험해보지 못했다.

주로 칠판에 특정 알고리즘이나 간단한 문제를 내고 sudo 코드 작성을 시킨다.

 

3. 기술과제 코딩테스트

 특정 구현 주제를 주고 해당 구현을 했는지 여부와 구현을 위해 설계를 어떻게 했는지

어떤 스타일로 코딩하는지 아주 면밀하게 보는 것 같다.

개인적으로는 이렇게 테스트하는 게 경력직은 맞다고 본다.

또 부족한 부분은 피드백을 받을 수 있어 좋은 거 같다.

코드 리뷰 문화가 없는 회사라면 당황스러울 수도 있겠지만 과정을 거치면서

성장을 하기 위해서는 코드 리뷰가 있는 회사에 가는 게 좋을 것 같다는 생각이 든다.

 

가장 최근에 본 유형은 기술과제 테스트였다.

나름 고민해서 코딩한다고 했는데 기능 구현과 별개로 알고는 있지만 안일하게 넘긴 부분을 많이 지적당해서 부끄러웠다.

관련해서 다시 체크해서 간단한 토이 프로젝트를 만들어 봐야겠다는 생각이 들었다.

그리고 TDD나 BDD 개발에 익숙하지는 않아서 이런 부분에서 생각보다 시간이 많이 들어갔다.

 

이직이나 구직을 고려할 때 어떤 개발 문화를 가졌는지도 장기적인 관점에서 중요해 보인다.

'생각정리' 카테고리의 다른 글

블로그 이전  (0) 2023.11.05
리프레시 & 코로나  (0) 2022.11.24
이직  (0) 2022.07.30
인앱 결제 진행 중 생각정리  (0) 2022.05.26
코딩테스트  (0) 2022.03.30

문제

https://www.acmicpc.net/problem/2477

분석/설계

최대 넓이를 가지는 가로 * 세로를 구하고 

최소 넓이를 가지는 가로*세로를 구하여 최대 넓이 - 최소 넓이 빼주고

거기에 참외수를 곱하여 방식으로 처음에 생각하고 접근하였습니다.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 최대 넓이를 가지는 가로, 세로의 길이 각 입력 값을 받아 방향에 따라 각각의 최대 값을 구해주면 됩니다.

3. 최소 넓이는 꺽이는 부분을 고려하여, 아래와 같이 정의하고 i 위치에따른 이전 변과 다음 변의 방향이 같으면

    i는 최소 넓이를 구하는 가로 또는 세로 중에 하나이므로 이를 저장합니다.

4. 마지막으로 구해진 최대, 최소 가로와 세로 값 그리고 참외 수를 곱해서 결과 값을 구합니다.

구현 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		int K = Integer.parseInt(br.readLine());
		int maxHeight = 0;
		int maxWidth = 0;
		int minHeight = 0;
		int minWidth = 0;
		
		int[] dirArr = new int[6];
		int[] distArr = new int[6];
		
		for(int i=0; i<6; i++) { // 1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
			String[] input = br.readLine().split(" ");
			dirArr[i] = Integer.parseInt(input[0]);
			distArr[i] = Integer.parseInt(input[1]);
			
            // 2. 최대 넓이를 가지는 가로, 세로의 길이 각 입력 값을 받아 방향에 따라 각각의 최대 값을 구해주면 됩니다.
			if (dirArr[i] == 1 || dirArr[i] == 2) { 
				maxWidth = Math.max(maxWidth, distArr[i]);
			} else {
				maxHeight = Math.max(maxHeight, distArr[i]);
			}
		}
			
        // 3. 최소 넓이는 꺽이는 부분을 고려하여, 아래와 같이 정의하고 i 위치에따른 이전 변과 다음 변의 방향이 같으면
        // i는 최소 넓이를 구하는 가로 또는 세로 중에 하나이므로 이를 저장합니다.
		for(int i=0; i<6; i++) { // 최소 넓이를 가진 넓이를 구한다.
			// i를 최소 넓이의 가로 또는 세로라고 가정한다.
			int before = (i+5) % 6; 
			int after  = (i+1) % 6;
			
			if (dirArr[before] == dirArr[after]) { // i 기준으로 이전과 다음에 나올 변의 방향이 같으면
				if (dirArr[i] == 1 || dirArr[i] == 2) { // 방향에 따라 가장 작은 크기 가로, 세로 
					minWidth = distArr[i];
				} else {
					minHeight = distArr[i];
				}
			}
		}
		
        // 4. 마지막으로 구해진 최대, 최소 가로와 세로 값 그리고 참외 수를 곱해서 결과 값을 구합니다.
		int result = (maxHeight * maxWidth - minHeight * minWidth) * K; // (최대 넓이 - 최소 넓이) * 참외 개수 
		System.out.println(result);
	}
}

정리

최소 넓이의 가로 세로를 어떤식으로 기준을 잡고 구할지가 쉽게 떠오르지 않습니다.

문제에 주어진 조건을 잘 확인하고 고민해봐야합니다.

참고

https://www.acmicpc.net/problem/2477

'Algorithm > 구현' 카테고리의 다른 글

[백준] 배열돌리기 1  (0) 2022.12.23
[백준] 마인크래프트  (0) 2022.12.23
괄호의 값  (1) 2022.12.14
구현 - 문자열 재정렬  (0) 2022.03.17

문제

https://www.acmicpc.net/problem/16926

분석/설계

회전을 할 각 라인의 개수와 구한 각 라인을 반복하여 회전시켜야합니다.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 회전을 할 각 라인의 개수를 구합니다.

    2X2  = 2개, 4X4 = 2개, 5x4 = 2개, 6x4 = 2개....

    Math.min(N, M) / 2  

3. 구한 각 라인을 반복하여 회전시킵니다.

   이때 회전하는 방향을 유의해야하고 각 시작점(0,0) ... (1,1)는 임시 변수에 저장했다가 이동한 위치로 (1,0) ... (2,1)

   반복이 끝날때 값을 넣어줍니다. 

 

구현 코드

import java.util.Scanner;

public class Main {
	static int M, N, R; // 가로, 새로, 회전 수
	static int [][] arr;
	static int[] dx = {0, 1, 0, -1}; 
	static int[] dy = {1, 0, -1, 0};
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.
		N = sc.nextInt();
		M = sc.nextInt();
		R = sc.nextInt();
		arr = new int[N][M];
		
		for (int i=0; i<N; i++) {
			for (int j=0; j<M; j++) {
				arr[i][j] = sc.nextInt(); 
			}
		}
		
        // 2. 회전을 할 각 라인의 개수를 구합니다.
		int line = Math.min(N, M) / 2;
		
        // 3. 구한 각 라인을 반복하여 회전시킵니다.
		for (int i=0; i<R; i++) { 
			for (int j=0; j<line; j++) { 
				int x = j;
				int y = j;
				int val = arr[x][y];
				int idx = 0;
				
				while(idx<4) {
					int mx = x + dx[idx];
					int my = y + dy[idx];
					
					if (mx >= j && mx < N-j && my >= j && my < M-j) {
						arr[x][y] = arr[mx][my];
						x = mx;
						y = my;
					} else {
						idx++;
					}	
				}
				arr[j+1][j] = val;
			}
		}
		
		for (int i=0; i<N; i++) {
			for(int j=0; j<M; j++) {
				System.out.print(arr[i][j] + " ");
			}
			System.out.println();
		}
		
		sc.close();
	}
}

정리

각 라인 별로 어떻게 값 이동을 구현할지를 각 라인의 수를 어떻게 구할지 

처음 접하면 떠오르지 않습니다. 

기존 맵의 탐색하는 유형은 많이 만나봐서 그런 방식으로 접근을 했고,

각 라인의 범위를 침범하지 않은 채로 이동을 해야했기때문에 많은 고심을 한 문제입니다.

백준 사이트에 보면 이런 유형의 문제가 많으니 많이 접해보고 다른분들의 풀이도 보면 도움이 되지 않을까 싶습니다.

참고

https://www.acmicpc.net/problem/16926

'Algorithm > 구현' 카테고리의 다른 글

[백준] 참외밭  (0) 2022.12.23
[백준] 마인크래프트  (0) 2022.12.23
괄호의 값  (1) 2022.12.14
구현 - 문자열 재정렬  (0) 2022.03.17

문제

https://www.acmicpc.net/problem/18111

분석/설계

답이 여러개인 경우 땅의 높이가 가장 높은 것을 골라야한다는 것을 염두해두어야함.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 맵 상에 블록 높이의 최소 값과 최대값을 구합니다.

3. 최소~최대 높이의 수 만큼 반복문을 만듭니다.

   3.1 맵의 크기만큼 반복문을 만들고 맵의 높이 - (최소 값~최대 높이 )를 차이를 구합니다.

   3.2 차이가 0보다 클 경우 시간과 인벤토리에 차이값을 더해줍니다.

   3.3 차이가 0보다 작을 경우 시간과 인벤토리에 차이값을 더하고 빼줍니다.

   3.4 구한 값들을 반복문이 끝날때까지 결과값에 갱신합니다.

4. 결과값을 출력합니다.

 

구현 코드

import java.util.*;
import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
    	// 입력을 Scanner 로 받을 경우 시간 초과
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] nmb = br.readLine().split(" ");
        int N = Integer.parseInt(nmb[0]);
        int M = Integer.parseInt(nmb[1]);
        int B = Integer.parseInt(nmb[2]);
		int[][ ]map = new int[N][M];
		
		int min = Integer.MAX_VALUE;
		int max = Integer.MIN_VALUE;
		
		for(int i=0; i<N; i++) { // 변수를 초기화 하면서 최대값, 최소값을 구한다.
            String[] mapRow = br.readLine().split(" ");
			for(int j=0; j<M; j++) {
				int input = Integer.parseInt(mapRow[j]);
				map[i][j] = input;
				max = Math.max(max, input);
				min = Math.min(min, input);
			}
		}
		
		int minTime = Integer.MAX_VALUE; 
		int height = 0; 
		
		for (int i=min; i<=max; i++) { // 최소~최대까지 루프
			int time = 0;
			int inventory = B;
			int diff = 0;
			
			for (int j=0; j<N; j++) {
				for (int k=0; k<M; k++) {
					if (map[j][k] > i) { // 값이 클 경우
						diff = map[j][k]-i; // 차이 값을 구함
						time += diff * 2; // 시간에 (+)
						inventory += diff; // 인벤토리에 (+)
					} else if(map[j][k] < i) { // 값이 작을 경우
						diff = i- map[j][k]; // 차이 값을 구함
						time += diff; // 시간에 (+)
						inventory -= diff; // 인벤토리에 (-)
					}
				}
			}
			
			if(inventory >= 0 && minTime >= time) { // 최소 시간과 높이를 갱신
				minTime = time;
				height = i;
			}
		}
		
		System.out.println(minTime + " " + height);
	}
}

정리

입력받을 시 Scanner를 사용할 경우 백준 채점 사이트에서 시간초과를 만나게됩니다.

Scanner 대신 BufferedReader를 통해 입력을 받아야합니다.

Scanner는 1KB 버퍼 BufferedReader 는 8KB 버퍼로 차이가 있기때문에 입력 값이 많을수록 성능 차이가 있습니다.

참고

https://dlee0129.tistory.com/238

https://www.acmicpc.net/problem/18111

'Algorithm > 구현' 카테고리의 다른 글

[백준] 참외밭  (0) 2022.12.23
[백준] 배열돌리기 1  (0) 2022.12.23
괄호의 값  (1) 2022.12.14
구현 - 문자열 재정렬  (0) 2022.03.17

문제

https://www.acmicpc.net/problem/2504

분석/설계

Stack 자료구조를 활용하여, 문제의 조건들을 구현 가능합니다.

 

1. 입력받은 문자열을 각각의 문자로 쪼개 확인합니다.

2. 문자의 각 괄호가 '(' , '[' 이면 2, 3을 곱해줍니다.

3. 문자의 괄호가 ')'의 경우

    3.1 스택이 비어있거나 '('이 없는 경우 결과 값을 0으로 수정.

    3.2 이전 문자 값이 '('  일 경우 결과 값에 더해주고, Stack에서 제거.

4. 문자의 괄호가 ']' 경우

    4.1 스택이 비어있거나 '['이 없는 경우 결과 값을 0으로 수정.

    4.2 이전 문자 값이 '['  일 경우 결과 값에 더해주고, Stack에서 제거.

 

구현 코드

import java.util.Scanner;
import java.util.Stack;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		Stack<Character> stack = new Stack<>();
		
		int res = 0;
		int val = 1;
		
		for (int i=0; i<str.length(); i++) {
			char c = str.charAt(i);
			if (c == '(' ) {
				stack.push(c);
				val *= 2;
			} else if(c == '[') {
				stack.push(c);
				val *= 3;
			} else if(c == ')') {
				if(stack.isEmpty() || stack.peek() != '(') {
					res = 0;
					break;
				} else if(str.charAt(i-1) == '(') {
					res += val;
				}
				stack.pop();
				val /= 2;
			} else if(c == ']') {
				if(stack.isEmpty() || stack.peek() != '[') {
					res = 0;
					break;
				} else if(str.charAt(i-1) == '[') {
					res += val;
				}
				stack.pop();
				val /= 3;
			}
		}
		
		if(!stack.isEmpty()) {
			res = 0;
		} 
		System.out.println(res);
		sc.close();	
	}
}

정리

조건들을 잘 읽고 어떻게 구현할지 쪼개서 생각해봐야 합니다.

Java에서 Stack과 문자열 다루는 메서드들에 대해서는 익숙해질 필요가 있습니다.

  • push(item): item 하나를 스택의 가장 윗부분에 삽입.
  • peek(): 스택의 가장 위에 있는 항목을 반환.
  • pop(): 스택에서 가장 위에 있는 항목을 삭제하고 해당 item을 반환.
  • isEmpty(): 스택이 비어있는지 유무에 따라 true/false를 반환.

참고

https://www.acmicpc.net/problem/2504

'Algorithm > 구현' 카테고리의 다른 글

[백준] 참외밭  (0) 2022.12.23
[백준] 배열돌리기 1  (0) 2022.12.23
[백준] 마인크래프트  (0) 2022.12.23
구현 - 문자열 재정렬  (0) 2022.03.17

+ Recent posts