운동 시작 전 약 5분 스트레칭

벤치프레스
- 20kg * 10 (웜업)
- 40kg * 10 (본 세트 시작)
- 50kg * 10
- 60kg * 5
- 60kg * 5
- 60kg * 5
- 50kg * 8
- 50kg * 7

딥스
- 보조 30kg * 10 (웜업)
- 맨몸 * 10
- 맨몸 * 8
- 보조 30kg * 10
- 맨몸 * 7
- 보조 30kg * 10

케이블 크런치
- 40kg * 10
- 45kg * 10
- 50kg * 10

사람이 많은 시간대에 하다보니 생각보다 시간이 많이 걸려서 모든 운동을 못했다.
자극 위주의 훈련만 하다가 중량을 섞어주니 효과가 좋다고 느껴진다.

운동 시작 전 스트레칭 약 5분

점심 시간을 이용하여 운동하였다. (약 50분)

시간이 빠듯하여 휴식 시간을 짧게하여 운동하였다. 

 

밀리터리 프레스(웜업 제외 6세트)

 - 20kg * 10 (웜업)

 - 30kg * 10 (본 세트 시작)

 - 40kg * 8

 - 40kg * 7

 - 30kg * 8

 - 30kg * 8

 - 30kg * 8

 

사이드 레터럴 레이즈 (5세트)

 - 4kg * 10 (본 세트 시작)

 - 5kg * 10

 - 5kg * 10

 - 5kg * 10

 - 5kg * 10

 

프론트 레터럴 레이즈 (5세트)

 - 5kg * 10

 - 5kg * 10

 - 5kg * 10

 - 5kg * 10

 - 5kg * 10

 

팩 덱 플라이 (어깨 후면 5세트)

 - 15kg * 10 (본 세트 시작)

 - 20kg * 10

 - 20kg * 8

 - 15kg * 10

 - 15kg * 8

 

오늘 먹은 것

 - 아침: 달걀볶음밥 + 달걀 후라이 + 하인즈 reduced 슈가 케찹

 - 점심: 고구마 약 300g

 - 저녁: 제육볶음

 

 

서류 탈락 소식들이 들려오고 있다.

좌절하지 말고 긍정적인 마인드를 유지하기 위해 노력해야겠다.

운동 시작 전 스트레칭 약 5분

 

랫풀다운

 - 20kg * 12 (웜업)

 - 30kg * 10 (본 세트 시작)

 - 35kg * 10

 - 40kg * 8

 - 40kg * 8

 - 40kg * 8

 

바벨로우

 - 30kg * 10 (본 세트 시작)

 - 35kg * 10

 - 35kg * 8

 - 35kg * 7

 - 35kg * 7

 

스트레이트 암풀다운

 - 20kg * 10 (본 세트 시작)

 - 20kg * 10

 - 20kg * 10

 - 20kg * 10

 - 20kg * 8

 - 15kg * 10

 

케이블 크런치

 - 50kg * 10

 - 55kg * 10

 - 50kg * 10

 - 50kg * 8

 - 40kg * 10

 - 35kg * 10

 

최근 취업 준비를 본격적으로 시작하면서 운동할 시간이 부족해지고 있는 느낌이다.

하지만 이것은 핑계라는 것을 안다.

24시간 중에 1시간 투자할 시간이 없다는 것은 말이 안된다.

끊임없이 스스로 동기부여를 하고 열심히 해야겠다.

[문제 링크]

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

 

16235번: 나무 재테크

부동산 투자로 억대의 돈을 번 상도는 최근 N×N 크기의 땅을 구매했다. 상도는 손쉬운 땅 관리를 위해 땅을 1×1 크기의 칸으로 나누어 놓았다. 각각의 칸은 (r, c)로 나타내며, r은 가장 위에서부터

www.acmicpc.net

 

[문제 풀이]

전형적인 삼성 시뮬레이션 기출문제이다.

문제에서 봄, 여름, 가을, 겨울에 하는 일을 정의해놨기 때문에 본인은 4개의 함수를 구현했다.

함수를 보기 전에 선언한 변수를 살펴보겠다.

MAP은 해당 자리에 있는 양분의 양이다. 양분은 처음에 모든 자리에 5가 있다.

eat은 겨울에 해당 자리에 추가되는 양분의 양이다.

tree는 해당 자리에 있는 나무들의 나이를 담는 배열이다. 여러 개의 나무가 같은 자리에 있을 수 있기 때문에 덱 배열을 사용하였다.

여기서 덱을 사용한 이유는 나무를 쉽게 푸시하고 팝 하기 위해서이다.

dead_tree는 해당 자리에서 죽은 나무이다. 마찬가지로 해당 자리에 죽은 나무가 여러 개 있을 수 있기 때문에 벡터 배열로 선언하였다.

그리고 가을에서 인접한 8자리에 번식하는 것을 구현하기 위해 dx, dy 배열을 사용하였다.

이 문제에서 가장 애먹은 부분은 봄 부분이었다.

봄의 조건에서 하나의 칸에 여러 개의 나무가 있다면, 나이가 어린 나무부터 양분을 먹는다고 되어 있다.

이 조건 때문에 tree 배열을 덱으로 선언하였다. 덱을 사용하면 가장 어린 나무를 바로 뽑을 수 있기 때문이다.

본인은 모든 자리를 탐색하면서 해당 자리에 나무의 크기만큼 반복문을 수행했다.

여기서 미리 해당 자리의 나무 개수를 구하고 나무 개수만큼 반복문을 돌린 이유는 반복문 안에서 푸시와 팝이 이루어지는데 미리 정해준 나무 개수만큼 돌리지 않으면 우리가 원하는 대로 결과가 나오지 않기 때문이다.

예를 들어 (0,0) 자리에 나이가 1인 나무가 3개 있고 양분은 7이라고 가정해보자.

여기서는 당연히 나무의 개수인 3번만큼만 반복문이 돌아야 한다.

그렇지 않다면 나이가 1이었던 나무들은 해당 자리에 양분이 충분하지 않을 때까지 나이를 먹을 것이다.

마지막 조건을 보면 땅에 양분이 부족해 자신의 나이만큼 양분을 먹을 수 없는 나무는 즉시 죽는다고 하였다.

이 말이 처음에는 조금 헷갈렸는데 말을 바꿔보면 현재 나무의 나이보다 해당 자리의 양분이 더 작다면 나무는 죽는 것이다.

이때 죽은 나무는 dead_tree 배열에 넣어줬다.

봄 부분만 해결하면 나머지 부분은 어렵지 않게 구현할 수 있다.

여름에서는 해당 자리에 죽은 나무가 있다면 그 죽은 나무의 나이를 2로 나눈 값을 해당 자리의 양분에다가 추가하면 된다.

가을에서는 나무의 나이가 5의 배수이면 인접한 8칸에 나이가 1인 나무를 추가한다.

여기서 tree 배열을 덱으로 선언한 이유가 나온다.

나이가 1인 나무라는 것은 결국 가장 어린 나무를 뜻한다. 그렇기 때문에 나무가 번식을 한다면 해당하는 자리 맨 앞에 1을 푸시해준다.

겨울은 가장 간단하다.

해당하는 자리에 처음에 입력받았던 양분을 추가해주면 된다.

이 작업을 K번 반복했을 때 남아있는 나무의 수를 구하는 문제이다.

K번 반복하고 난 후에 모든 자리를 탐색하면서 해당하는 자리의 사이즈를 더해주었다.

[소스 코드]

#include <bits/stdc++.h>
using namespace std;
int n, m, K;
int MAP[11][11];
int eat[11][11];
deque<int> tree[11][11];
vector<int> dead_tree[11][11];
int dx[8] = { -1,-1,-1,0,0,1,1,1 };
int dy[8] = { -1,0,1,-1,1,-1,0,1 };
void spring() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int size = tree[i][j].size();
			while (size--) {
				int age = tree[i][j].front();
				tree[i][j].pop_front();
				if (MAP[i][j] < age) {
					dead_tree[i][j].push_back(age);
					continue;
				}
				MAP[i][j] -= age;
				tree[i][j].push_back(age + 1);
			}
		}
	}
}

void summer() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			int size = dead_tree[i][j].size();
			while (size--) {
				int age = dead_tree[i][j].back();
				dead_tree[i][j].pop_back();
				MAP[i][j] += (age / 2);

			}
		}
	}
}

void fall() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			for (int k = 0; k < tree[i][j].size(); k++) {
				int age = tree[i][j][k];
				if (age % 5 == 0) {
					for (int dir = 0; dir < 8; dir++) {
						int nx = i + dx[dir];
						int ny = j + dy[dir];
						if (nx < 1 || ny < 1 || nx > n || ny > n) continue;
						tree[nx][ny].push_front(1);
					}
				}
			}
		}
	}
}

void winter() {
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			MAP[i][j] += eat[i][j];
		}
	}
}

void count_tree() {
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			sum += tree[i][j].size();
		}
	}
	cout << sum;
}
void INPUT() {
	cin >> n >> m >> K;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			MAP[i][j] = 5;
			cin >> eat[i][j];
		}
	}

	for (int i = 0; i < m; i++) {
		int x, y, z;
		cin >> x >> y >> z;
		tree[x][y].push_back(z);
	}
}

void solve() {
	while (K--) {
		spring();
		summer();
		fall();
		winter();
	}
	count_tree();
}
void solution() {
	INPUT();
	solve();
}
int main() {
	cin.tie(0);
	ios::sync_with_stdio(0);
	solution();
	return 0;
}

 

'알고리즘 > BOJ' 카테고리의 다른 글

백준 BOJ 17779 C++ 게리맨더링 2  (0) 2020.04.21
백준 BOJ 14891 C++ 톱니바퀴  (0) 2020.04.19
백준 BOJ 17822 C++ 원판 돌리기  (0) 2020.04.17

2차 온라인 코딩 테스트 이후 생각보다 빠르게 결과가 나왔다.

아쉽게도 결과는 탈락이었다

4월 29일 오후 5시쯤 메일이 왔던 것 같다.

이 날 오전에는 네이버 핵데이 합격을 하고 오후에는 소프트웨어 마에스트로에서 탈락했다.

두 마리 토끼는 잡지 못했지만, 하나라도 합격해서 다행이라고 생각한다.

2차 온라인 코딩 테스트 후기에도 썼지만 알고리즘 문제에서 시간 초과가 나는 코드를 작성한 것이 탈락 원인 중 하나라고 생각한다.

다른 원인은 웹 문제를 아예 풀지 못한 것에 있다고 생각한다.

알고리즘을 아예 잘 풀었거나 웹 문제를 잘 풀었거나 둘 중에 하나는 해야 합격을 하는 것 같다.

본인은 둘 다 못했기에... 어떻게 보면 탈락이 당연하다.

소프트웨어 마에스트로 11기부터 예전에 없던 SQL문제와 웹 문제가 추가되면서 소프트웨어 마에스트로에서 원하는 연수생이 달라진 것 같다.

내년엔 또 어떻게 달라질지 모르지만 1차 온라인 코딩 테스트와 2차 온라인 코딩 테스트에서 동일하게 SQL문제와 웹 문제를 낸 것으로 보아 앞으로도 비슷하게 갈 것이라고 생각한다.

소프트웨어 마에스트로 12기를 준비하는 사람이 이 글을 본다면 알고리즘에만 집중하는 것보다 SQL과 웹에 대해서 공부를 조금이라도 하는 것이 도움이 될 것이라고 생각한다.

합격자 발표 예정일이었던 4월 29일에 11시쯤에 합격 통보를 받았다.

코딩 테스트 후기에 썼지만 본인은 온라인 코딩 테스트에 나온 3문제 중에 2문제를 풀었다.

당시 3번 문제가 굉장히 어려웠기 때문에 합격컷은 2솔이라고 생각한다.

2솔인 사람들도 탈락한 사람들이 있는 것으로 봐서는 서류 + 2솔이라고 생각한다.

3번과 다르게 1,2번은 문제가 쉬웠기 때문에 2솔은 해야 붙지 않았을까 싶다.

1솔 합격자가 있는지는 잘 모르겠다.

하지만 그렇다고 본인이 서류를 잘 써서 합격했다고 생각하지 않는다.

서류에는 깃허브 주소를 첨부를 해야 했고, 선택한 주제에 대한 프로젝트 경험을 쓰는 칸이 있었다.

여러 가지 주제를 선택하고 프로젝트 경험을 여러 개 써도 됐지만 선택한 주제에 대해 그나마 규모 있는 프로젝트는 1개였기 때문에 딱 1개만 썼다.

그래서 사실 탈락할 가능성이 크다고 생각했는데 잘 봐주셨는지 운이 좋게 합격했다.

참고로 깃허브에는 이렇다 할 내용은 없고, 선택한 주제에 대한 프로젝트 내용과 매일 풀고 있는 알고리즘 문제들밖에 없다.

만약 NAVER CAMPUS HACKDAY를 준비하는 사람들이 이 글을 본다면 누구나 희망을 가지고 준비했으면 좋겠다.

물론 기본적인 코딩 테스트 준비는 되어 있어야하고, 본인이 하고 싶은 주제에 대한 프로젝트 1개 정도의 경험은 있어야 할 것 같다.

다음 주부터 약 2-3주간 개발을 할 예정이고, 자세한 후기는 NAVER CAMPUS HACKDAY 종료 후에 쓰겠다.

2020 소프트웨어 마에스트로 11기 1차 온라인 코딩 테스트를 통과하고 2차 온라인 코딩 테스트를 보게 되었다.

원래 2차는 오프라인 코딩 테스트가 예정되어 있었지만, 코로나 바이러스 때문에 2차도 온라인 코딩 테스트로 변경되었다.

2차 온라인 코딩 테스트는 2020년 4월 26일 일요일 14시부터 16시까지 2시간 동안 진행되었다.

1차 온라인 코딩 테스트와 마찬가지로 알고리즘 3문제, SQL 1문제, 웹 프로그래밍 1문제가 출제되었다. 그리고 1차와 마찬가지로 구름 플랫폼에서 코딩 테스트가 진행되었다.

1차와 달라진 점은 난이도밖에 없는 것 같다. 웹을 제외하고 나머지 문제들의 난이도가 훨씬 올라간 느낌을 받았다.

1번 문제는 DP문제였다. DP문제 중에서 유명한 문제라고 한다. 본인은 DP 풀이가 생각이 나지 않아서 일단 빠르게 완전 탐색으로 풀었다. 시간 초과가 날 것을 알았지만 우선 빠르게 모든 문제를 푸는 게 중요하다고 생각했다. 5분가량 풀고 테스트 케이스가 다 맞는 것을 확인하고 다음 문제로 넘어갔다.

2번 문제는 3문제 중에 가장 어려웠다. 처음 딱 보자마자 어렵다는 느낌을 받았다. 알고리즘 유형으로 따지면 유니온 파인드라고 한다. 본인도 유니온 파인드를 이용해서 풀었다. 이 문제만 1시간 넘게 풀어서 시간 초과는 생각하지도 못했다. 테스트 케이스가 다 맞는 것을 확인하고 다음 문제로 넘어갔다.

3번 문제를 풀 때 이미 시간이 절반이 지나가 있었다. 이 문제도 완전 탐색 느낌으로 풀었다. 시간 초과가 날 것을 알았지만 다른 풀이가 생각이 안났고 일단 제출했다.

4번 문제는 SQL 문제였다. SQL도 1차에 비해서 난이도가 굉장히 올라간 느낌을 받았다. 본인은 서브쿼리를 이용해서 풀었는데 시간이 많이 부족해서 출력만 잘 나오는 것을 보고 제출하였다. 아마 빠르게 풀다 보니 실수를 했을 것 같다.

5번 문제는 웹 프로그래밍 문제였다. 본인은 웹에 대해 잘 몰라서 그냥 실행만 되게끔 해서 제출했다. 1차 때도 웹은 건드리지도 못했는데 2차 때도 마찬가지였다. 다른 사람들의 반응을 봤을 때, 웹은 1차보다 쉬웠다는 반응들이 있었다. 

분명한 것은 1차 온라인 코딩 테스트에 비해 전체적인 난이도가 올라갔다는 것이다.

그래서 아마 컷도 낮아질 것 같고 효율성까지 따졌을 때 완벽하게 알고리즘을 푼 사람은 그렇게 많지 않을 것 같다.

효율성까지 체크를 하는지는 모르겠다.

본인 생각에는 문제 수준을 생각했을 때, 3솔 정도가 합격 컷이 될 것이라고 생각한다.

합격 발표가 언제인지는 모르겠지만, 열심히 푼 만큼 합격했으면 좋겠다.

2020년 현대카드/캐피탈/커머셜 Summer Internship 온라인 코딩 테스트는 4월 25일 토요일 오전 10시부터 2시간 동안 진행되었다.

문제는 총 4문제로 구성되었다.

문제 풀이에 사용되는 언어는 C++, JAVA, JavaScript, Kotlin, Python3, Swift 이렇게 6개였다.

문제마다 풀이 언어는 달라도 된다.

2020 현대카드 온라인 코딩 테스트는 프로그래머스 플랫폼에서 진행되었다.

전체적인 난이도는 중하 정도라고 생각한다.

1번 문제는 문자열을 이용한 구현 문제였다.

모든 기업 코딩 테스트에는 문자열을 이용한 구현 문제가 하나씩은 꼭 들어가는 느낌이다.

딱히 풀이가 생각나지 않았고, 결국 풀지 못했다.

주변 사람들은 하드 코딩으로 했다는 사람도 있었다. 문제 난이도는 어려운 편은 아니었다.

2번 문제도 문자열을 이용한 구현 문제였다.

구현이라고는 하지만 해싱을 적용해서 풀어도 됐을 것 같다.

본인은 3번 문제의 쓸 데 없는 부분에서 시간을 너무 많이 써서 풀지 못하였다. 1번보다는 쉬운 난이도였던 것 같다.

3번 문제도 문자열을 이용한 구현 문제였다.

약간 시뮬레이션 느낌도 났다. 그냥 하라는 대로 하면 되는 문제였다.

본인은 재귀를 이용하여 풀었다. 쓸 데 없는 곳에서 런타임 에러가 자꾸 나서 애먹었다. 1번 문제랑 비슷한 난이도인 것 같다.

4번 문제는 bfs/dfs/시뮬레이션 문제였다.

본인은 bfs를 이용하여 풀었다. 평소 bfs 문제를 풀어본 사람이라면 쉽게 풀 수 있었을 것이다.

관건은 bfs를 할 줄 아느냐와 구현 능력이었던 것 같다.

난이도 자체는 가장 어렵다고 생각하지만 비슷한 유형을 풀어본 사람들은 쉽게 느껴졌을 것이다.

최근 기업들의 코딩 테스트를 보면 어려운 알고리즘을 묻기보다는 구현 능력을 많이 보는 것 같다.

이번 현대카드 코딩 테스트에서도 모든 문제에 구현 능력을 보는 부분이 있었다.

앞으로 코딩 테스트를 준비하는 사람들이라면 구현/시뮬레이션 문제를 많이 풀어보는 것을 추천한다.

시간이 부족하여 2솔밖에 하지 못했다.

대부분의 사람들이 3솔 이상했다는 반응이 많았다. 99% 탈락이라고 생각한다.

이번에도 파이썬으로 빨리 갈아타야겠다는 생각이 들었다.

코딩 테스트는 빠르게 푸는 것이 중요한데 C++로 문자열 문제를 푸는데 시간이 꽤나 걸린다.

이 글을 읽는 사람에게도 문자열 문제를 수월하고 풀고 싶으면 파이썬을 배우라고 추천하고 싶다.

+ Recent posts