반응형

2020 하반기 UIT 개발직무 인턴 코딩테스트후기입니다.

 

5개문제 140분입니다. 

문제난이도는 백준 solve.ac 기준 실버상위 정도의 난이도로 코딩테스트 난이도는 매우 낮았습니다.

 

단순구현, dp 등의 문제들이 출제되었고, 난이도가 낮다보니 문제를 빠르고 정확하게 푸는게 관건이었습니다.

 

 

그리고 이렇게 제출마다 정답여부를 알려주는게 특징입니다.

 

 

평소 코딩테스트 준비를 성실하게 하셨다면 전혀 어려움 느끼지 않을겁니다.

 

화이팅

반응형
반응형

문제링크: acmicpc.net/problem/2116

 

2116번: 주사위 쌓기

첫줄에는 주사위의 개수가 입력된다. 그 다음 줄부터는 한 줄에 하나씩 주사위의 종류가 1번 주사위부터 주사위 번호 순서대로 입력된다. 주사위의 종류는 각 면에 적혀진 숫자가 그림1에 있는

www.acmicpc.net

 

전형적인 구현문제입니다. 문제를 읽으면서 왤캐어렵지.. 생각했는데 

문제 조건중에 위 아래를 고정한 채 옆으로 90도, 180도, 또는 270도 돌릴 수 있다 라는 조건이 있어서 금방 접근 방법을 찾았습니다.

 

 

첫번째 값에서 시작할때 ~ 여섯번째 값에서 시작할때

총 6가지 경우 전부 확인해주어야 하는 브루트 포스입니다.

 

이때 1(a)번 위치는 6(f)번 위치와 2(b)번위치는 4(d)번위치와 3(c)번위치는 5(e)번 위치와 짝을 이루게 됩니다.

 

위아래가 되는 값들은 마킹을 해주고 나머지 값들을 통해서 결과값을 얻으면 됩니다. 

 

  • 1. 위아래 값 마킹 
  • 2. 결과값 비교

구현자체 난이도를 요하는 문제인데, 그 마저도 주사위에 익숙하시다면 어렵지 않으셨을 겁니다.

구현 문제는 꼭 설계를 꼼꼼하게 작성하고 진행하는 습관을 가집시다. (스스로에게 하는말)

#include <iostream>
#include <algorithm>
using namespace std;

int n = 0;
int arr[10001][7] = { 0, };
int result = 0;
int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);

	cin >> n;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= 6; j++)
			cin >> arr[i][j];

	for (int i = 1; i <= 6; i++) {
		bool temp[10001][7] = { 0, };
		int num = 0, next = 0;

		for (int j = 1; j <= n; j++) {
			if (j == 1) {
				num = i;
				temp[j][i] = 1;
			}
			else {
				int val = next;
				for (int u = 1; u <= 6; u++) {
					if (val == arr[j][u]) {
						temp[j][u] = 1;
						num = u;
						break;
					}
				}
			}
		

			if (num == 1) {
				next = arr[j][6];
				temp[j][6] = 1;
			}
			else if (num == 2) {
				next = arr[j][4];
				temp[j][4] = 1;
			}
			else if (num == 3) {
				next = arr[j][5];
				temp[j][5] = 1;
			}
			else if (num == 4) {
				next = arr[j][2];
				temp[j][2] = 1;
			}
			else if (num == 5) {
				next = arr[j][3];
				temp[j][3] = 1;
			}
			else if (num == 6) {
				next = arr[j][1];
				temp[j][1] = 1;
			}
			
		}



		/*
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= 6; j++)
				cout << temp[i][j] << ' ';
			cout << endl;
		}*/

		int maxed = 0;
		for (int i = 1; i <= n; i++) {
			int temp_max_num = 0;
			for (int j = 1; j <= 6; j++)
				if (temp[i][j] == 0 && temp_max_num < arr[i][j])
					temp_max_num = arr[i][j];
			maxed += temp_max_num;
		}
		result = max(result, maxed);
	}


	cout << result << endl;

	return 0;
}
반응형

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

[백준] 12904-A와 B(C++)  (0) 2020.12.24
[백준] 2839-설탕 배달(C++)  (0) 2020.12.21
[백준] 2636-치즈(C++)  (0) 2020.12.18
[백준] 14719-빗물(C++)  (0) 2020.12.15
[백준] 5624-좋은 수  (0) 2020.08.08
반응형

문제링크:www.acmicpc.net/problem/2636

 

2636번: 치즈

아래 <그림 1>과 같이 정사각형 칸들로 이루어진 사각형 모양의 판이 있고, 그 위에 얇은 치즈(회색으로 표시된 부분)가 놓여 있다. 판의 가장자리(<그림 1>에서 네모 칸에 X친 부분)에는 치즈가 놓

www.acmicpc.net

 

bfs를 사용한 구현문제였습니다.

단계를 나누어 구현하시면 편합니다.

 

  • 0. 치즈가 다 녹았는지 확인
  • 1. bfs를 통해서 외부 공기 표시하기
  • 2. 외부 공기에 닿는 치즈를 찾아서 없애기
  • 3. 최근 치즈의 개수 저장하기(0이 아닐때만)

 

중간중간에 테스트 코드를 통해서 올바르게 진행 되는지 확인하면 더 어려운 문제가 나오더라도 당황하지 않고 푸실 수 있을겁니다!

 

혹시 bfs 구현이 어렵다면 쉬운 bfs 문제들 풀어보시면 그냥 bfs 코드자체에 익숙해지셔야 합니다.

아래는 정답코드입니다.

#include <iostream>
#include <queue>
using namespace std;

int result = 0;
int result2 = 0;
int n, m;
bool arr[101][101] = { 0, };

int y_ar[4] = { 0,0,1,-1 };
int x_ar[4] = { 1,-1,0,0 };

int solved(){

	//0. init
	bool jud = false;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (arr[i][j] == 1)
				jud = true;

	if (jud == false)
		return 1;

	//1. bfs 
	bool visited[101][101] = { 0, };
	queue <pair <int, int>> que;
	que.push(make_pair(1, 1));
	visited[1][1] = 1;

	while (!que.empty()) {
		int cy = que.front().first;
		int cx = que.front().second;
		que.pop();

		for (int i = 0; i < 4; i++) {
			int ny = cy + y_ar[i];
			int nx = cx + x_ar[i];

			if (ny >= 1 && ny <= n && nx >= 1 && nx <= m) 
				if (arr[ny][nx] == 0 && visited[ny][nx] == 0) {
					que.push(make_pair(ny, nx));
					visited[ny][nx] = 1;
				}
			
		}

	}
	//2. 닿는 곳 찾아 없애기
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (arr[i][j] == 1) {

				for (int u = 0; u < 4; u++) {
					int ad_y = i + y_ar[u];
					int ad_x = j + x_ar[u];

					if (visited[ad_y][ad_x] == 1) {
						arr[i][j] = 0;
						break;
					}
				}
			}

	//3. 최근 갯수
	int cnt = 0;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++)
			if (arr[i][j] == 1)
				cnt++;
	if(cnt!=0)
		result2 = cnt;
	result++;


	/*
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++)
			cout << arr[i][j] << ' ';
		cout << endl;
	}*/

	return 0;

}


int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	cin >> n >> m;

	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= m; j++) {
			cin >> arr[i][j];
			if (arr[i][j] == 1)
				result2++;
		}

	while (1) {
		if (solved() == 1)
			break;
	}


	cout << result << endl;
	cout << result2 << endl;
	return 0;
}
반응형

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

[백준] 2839-설탕 배달(C++)  (0) 2020.12.21
[백준] 2116-주사위 쌓기(C++)  (0) 2020.12.18
[백준] 14719-빗물(C++)  (0) 2020.12.15
[백준] 5624-좋은 수  (0) 2020.08.08
[백준] 6593-상범 빌딩(C++)  (0) 2020.07.05
반응형

문제링크:programmers.co.kr/learn/courses/30/lessons/59045

 

코딩테스트 연습 - 보호소에서 중성화한 동물

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

중성화 기준 나와있지않아서 종류를 확인했습니다.

select SEX_UPON_OUTCOME
from ANIMAL_OUTS
group by SEX_UPON_OUTCOME

 

아 그러면 4가지 경우를 고려해서 결과를 도출하면 되겠구나 해서 아래와 같이 작성했습니다. 

-- 코드를 입력하세요

SELECT a.ANIMAL_ID, a.ANIMAL_TYPE, a.NAME
from ANIMAL_OUTS as a 
inner join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where (b.SEX_UPON_INTAKE like 'Intact Male' and a.SEX_UPON_OUTCOME like 'Neutered Male' ) 
   or (b.SEX_UPON_INTAKE like 'Intact Female' and a.SEX_UPON_OUTCOME like 'Spayed Female')
order by a.ANIMAL_ID

 

반응형
반응형

문제링크: programmers.co.kr/learn/courses/30/lessons/59044

 

코딩테스트 연습 - 오랜 기간 보호한 동물(1)

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

아직 입양을 못 간 동물 중, 가장 오래 보호소에 있었던 동물 3마리의 이름과 보호 시작일을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일 순으로 조회해야 합니다.

 

입양을 못 간 동물중에서 조회하는것이기 때문에 ANIMAL_INS 기준으로 조인이 이루어져야 합니다.

즉 INS 위치에 따라 left 와 right 중에서 선택해야합니다.

 

limit와 order by로 쉽게 구현했습니다.

 

아래는 정답코드입니다.

select b.NAME,b.DATETIME
from ANIMAL_OUTS as a
right outer join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.DATETIME is null
order by b.DATETIME asc
limit 3;
반응형
반응형

문제링크:programmers.co.kr/learn/courses/30/lessons/59043

 

코딩테스트 연습 - 있었는데요 없었습니다

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

관리자의 실수로 일부 동물의 입양일이 잘못 입력되었습니다. 보호 시작일보다 입양일이 더 빠른 동물의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 시작일이 빠른 순으로 조회해야합니다.

 

 

 

조인을 통해서 문제를 해결해야 합니다.

보호시작일과 입양일을 비교하면 되는 문제입니다.

어떤 조인을 선택해야할지 고민했는데 생각해보니 left, right, inner 전부 가능합니다.

 

두 교집합을 출력하는 문제이기 때문입니다. 

 

 

 

아래는 2개의 정답 코드입니다.

-- 코드를 입력하세요
select a.ANIMAL_ID, a.NAME
from ANIMAL_OUTS as a
inner join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.DATETIME < b.DATETIME
order by b.DATETIME
-- 코드를 입력하세요
/*
SELECT 
  a.ANIMAL_ID, 
  a.NAME 
 FROM ANIMAL_OUTS AS a
 LEFT OUTER JOIN ANIMAL_INS AS I ON I.ANIMAL_ID = a.ANIMAL_ID 
WHERE  I.datetime > a.datetime
ORDER BY I.datetime;
*/
반응형
반응형

문제링크:programmers.co.kr/learn/courses/30/lessons/59042

 

코딩테스트 연습 - 없어진 기록 찾기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요.

 

 

조인을 통해서 문제를 해결해야 합니다.

입양기록만 있고 보호소 기록이 없는 상태이므로 ANIMAL_OUTS을 기준으로 조인 해주면 됩니다.

ANIMAL_OUTS 위치에 따라서 left 조인, right 조인 둘다 가능합니다.  외래키와 주키인 ANIMAL_ID를 통해서 연결하고 OUTS의 ID와 NAME 출력하면 되는 문제입니다.

 

 

아래는 2개의 정답 코드입니다.

select a.ANIMAL_ID, a.NAME
from ANIMAL_OUTS as a
left outer join ANIMAL_INS as b on a.ANIMAL_ID = b.ANIMAL_ID
where b.ANIMAL_ID is null
order by a.ANIMAL_ID


select b.ANIMAL_ID, b.NAME
from ANIMAL_INS as a
right outer join ANIMAL_OUTS as b on a.ANIMAL_ID = b.ANIMAL_ID
where a.ANIMAL_ID is null
반응형
반응형

문제링크:programmers.co.kr/learn/courses/30/lessons/59410

 

코딩테스트 연습 - NULL 처리하기

ANIMAL_INS 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. ANIMAL_INS 테이블 구조는 다음과 같으며, ANIMAL_ID, ANIMAL_TYPE, DATETIME, INTAKE_CONDITION, NAME, SEX_UPON_INTAKE는 각각 동물의 아이디

programmers.co.kr

 

IFNULL 을 통해서  NULL이라는 기호를 다른 값으로 대체할 수 있습니다.

 

 

아래는 정답코드입니다. 

-- 코드를 입력하세요
SELECT ANIMAL_TYPE, IFNULL(NAME,"No name") as NAME, SEX_UPON_INTAKE
from ANIMAL_INS 
order by ANIMAL_ID
반응형

+ Recent posts