1. 문제 링크

www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

 

 

2. 문제 설명

N을 입력받아 크기가 N * N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓을 수 있는 방법의 수를 출력하는 문제입니다.

퀸이 서로 공격할 수 없게 놓으려면 각각의 퀸이 다음 세 가지 조건을 모두 만족해야 합니다.

1. 한 행(row)에는 하나의 퀸만 있어야 한다.

2. 한 열(col)에는 하나의 퀸만 있어야 한다.

3. 대각선(diagonal)에는 하나의 퀸만 있어야 한다.

 

(0,0) (0,1) ♛ (0,2) (0,3)
(1,0) (1,1) (1,2) (1,3)
(2,0) (2,1) (2,2)  (2,3)
(3,0) (3,1) (3,2) (3,3)

N이 4일 때 퀸을 놓을 수 있는 방법 중 하나입니다.

 

1번 조건은 for문을 돌면서 한 행에 하나의 퀸만 놓아보면 되므로 생각하지 않아도 됩니다.

2번 조건은 현재 퀸이 놓여있는 열의 위치를 저장해놓는 bool check_col[15]배열을 만들고,

퀸이 있으면 true, 없으면 false로 표현해서 퀸을 놓기 전에 해당 열에 퀸이 있는지 확인해보면 됩니다.

3번 조건은 북동쪽 방향 대각선(왼쪽 아래에서 오른쪽 위)와, 남동쪽 방향 대각선(왼쪽 위에서 오른쪽 아래)을 모두 확인해봐야 합니다.

먼저, 같은 북동 대각선에 있는 경우 row + col의 값이 같은 것을 알 수 있습니다.

이 값의 범위는 0 ~ 2 * (N - 1)이므로 현재 퀸이 놓여있는 북동 대각선의 위치를 저장해놓는 bool check_diag_ne[30]배열을 만들고,

퀸이 있으면 true, 없으면 false로 표현해서 퀸을 놓기 전에 해당 북동 대각선에 퀸이 있는지 확인해보면 됩니다.

다음으로, 같은 남동쪽 방향 대각선(왼쪽 위에서 오른쪽 아래)에 있는 경우 row - col의 값이 같은 것을 알 수 있습니다.

이 값의 범위는 -(N - 1) ~ (N - 1)인데, 배열의 인덱스로 사용하기 위해 N을 더해주면 1 ~ (2 * N) - 1이므로

현재 퀸이 놓여있는 남동 대각선의 위치를 저장해놓는 bool check_diag_se[30]배열을 만들고,

퀸이 있으면 true, 없으면 false로 표현해서 퀸을 놓기 전에 해당 남동 대각선에 퀸이 있는지 확인해보면 됩니다.

 

 

 

3. 소스코드

BOJ 9663번 N-Queen C++ 풀이입니다.

#include <iostream>
using namespace std;

int N, cnt;
bool check_col[15];
bool check_diag_ne[30];
bool check_diag_se[30];

void nqueen(int row)
{
	if (row == N) {
		cnt++;
		return;
	}

	for (int col = 0; col < N; col++) {
		if (check_col[col] || check_diag_ne[row + col] || check_diag_se[row - col + N])
			continue;
		check_col[col] = true;
		check_diag_ne[row + col] = true;
		check_diag_se[row - col + N] = true;
		nqueen(row + 1);
		check_col[col] = false;
		check_diag_ne[row + col] = false;
		check_diag_se[row - col + N] = false;
	}
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N;

	nqueen(0);
	cout << cnt;

	return 0;
}

4번 라인 : N을 입력받을 int N과, 최종 정답을 출력할 int cnt를 선언합니다.

5번 라인 : 현재 퀸이 놓여있는 열을 체크하기 위해서 bool check_col[15]를 선언합니다.

6번 라인 : 현재 퀸이 놓여있는 북동쪽 방향 대각선(왼쪽 아래에서 오른쪽 위)을 체크하기 위해서 check_diag_ne[30]을 선언합니다.

7번 라인 : 현재 퀸이 놓여있는 남동쪽 방향 대각선(왼쪽 위에서 오른쪽 아래)을 체크하기 위해서 check_diag_se[30]을 선언합니다.

36번 라인 : 0번째 row부터 퀸을 놓아보기 위해서 nqueen(0)을 호출합니다.

11번 라인 : row가 N이면 퀸을 마지막 행까지 놓을 수 있는 것이기 때문에 cnt를 1 증가시키고 return 시킵니다.

16번 라인 : 현재 행의 몇번째 열에 퀸을 놓을지 결정하기 위해 0부터 N - 1까지 for문을 돌립니다.

17, 18번 라인 : 같은 열에 이미 퀸이 있거나(check_col[col] == true), 북동쪽 방향 대각선에 퀸이 있거나(check_diag_ne[row + col] == true), 남동쪽 방향 대각선에 퀸이 있으면(check_diag_se[row - col + N]) 현재 열에는 퀸을 놓을 수 없으므로 다음 열에 퀸을 놓아보기 위해서 continue합니다.

19, 20, 21번 라인 : 17번 라인 if조건의 값이 모두 false이면 현재 열에는 퀸을 놓을 수 있으므로, 퀸을 놓았다는 표시로 check_col[col], check_diag_ne[row + col], check_diag_se[row - col + N] 에 true를 대입합니다.

22번 라인 : 현재 행에 퀸을 놓았으므로 다음 행에 퀸을 놓아보기 위해 nqueen(row + 1)을 호출합니다.

23, 24, 25번 라인 : 23번 라인이 실행될 때는 현재 열에 퀸을 놓았을 때의 경우의 수를 모두 실행해본 후 돌아온 것이기 때문에 현재 열에 퀸을 놓지 않았을 때의 경우의 수를 확인해보기 위해서 퀸을 놓지 않았다는 표시로 check_col[col], check_diag_ne[row + col], check_diag_se[row - col + N] 에 false를 대입합니다.

37번 라인 : 재귀가 끝났으므로 최종 결과를 출력합니다.

'Algorithm' 카테고리의 다른 글

[백준 2579번 C++] 계단 오르기  (0) 2020.11.09
[백준 2580번 C++] 스도쿠  (0) 2020.10.13
[백준 14888번 C++] 연산자 끼워넣기  (0) 2020.10.07
[백준 11399번 C++] ATM  (0) 2020.10.05
[백준 2309번 C++] 일곱 난쟁이  (0) 2020.10.05

1. 문제 링크

www.acmicpc.net/problem/14888

 

14888번: 연산자 끼워넣기

첫째 줄에 수의 개수 N(2 ≤ N ≤ 11)가 주어진다. 둘째 줄에는 A1, A2, ..., AN이 주어진다. (1 ≤ Ai ≤ 100) 셋째 줄에는 합이 N-1인 4개의 정수가 주어지는데, 차례대로 덧셈(+)의 개수, 뺄셈(-)의 개수, ��

www.acmicpc.net

 

 

 

2. 문제 설명

N개의 수와 N-1개의 연산자를 입력받은 후 만들 수 있는 식의 결과의 최댓값과 최솟값을 출력하는 문제입니다.

주어진 수의 순서를 바꾸면 안 되고, 식의 계산은 연산자 우선순위를 무시하고 왼쪽에서 오른쪽으로 진행해야 합니다.

따라서 연산자로 순열을 만들고 모든 경우의 수에 대하여 계산해보면 됩니다.

 

 

 

3. 소스코드

BOJ 14888번 연산자 끼워넣기 C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, temp, min_result = 1000000000, max_result = -100000000;
	vector<int> v, op;
	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> temp;
		v.push_back(temp);
	}
	for (int i = 0; i < 4; i++) {
		cin >> temp;
		for (int j = 0; j < temp; j++)
			op.push_back(i);
	}

	do {
		int result = v[0];
		for (int i = 0; i < N - 1; i++) {
			if (op[i] == 0)
				result += v[i + 1];
			else if (op[i] == 1)
				result -= v[i + 1];
			else if (op[i] == 2)
				result *= v[i + 1];
			else if (op[i] == 3)
				result /= v[i + 1];
		}
		min_result = min(min_result, result);
		max_result = max(max_result, result);
	} while (next_permutation(op.begin(), op.end()));
	cout << max_result << '\n' << min_result;

	return 0;
}

11번 라인 : 숫자의 개수 N, 임시로 사용할 변수 temp를 선언하고, 최솟값을 저장할 변수 min_result를 문제에서 주어진 최댓값인, 10억으로 초기화하고, 최댓값을 저장할 변수 max_result를 문제에서 주어진 최솟값인 -100으로 초기화합니다.

12번 라인 : 숫자를 저장할 vector v와 연산자를 저장할 vector op를 선언합니다.

13 ~ 17번 라인 : N과 v를 입력받습니다.

18 ~ 22번 라인 : op를 입력받습니다. 예를 들어 2, 1, 3, 1이 입력된다면 op vector에는 [0, 0, 1, 2, 2, 2, 3]이 입력되도록 이중 for문을 사용했습니다.

24, 38번 라인 : do ~ while문과 next_permutation을 이용해서 op vector로 만든 순열의 모든 경우의 수를 차례로 구합니다.

25번 라인 : 계산 결과를 저장할 result변수를 v[0](첫 번째 숫자)로 초기화합니다.

26 ~ 35번 라인 : i번째 op의 값에 따라 해당하는 연산자를 이용하여 result와 v[i + 1]을 연산합니다.

36번 라인 : min_result와 result값을 비교하여 더 작은 값을 min_result에 저장합니다.

37번 라인 : max_result와 result값을 비교하여 더 큰 값을 max_result에 저장합니다.

39번 라인 : max_result와 min_result를 출력합니다.

'Algorithm' 카테고리의 다른 글

[백준 2580번 C++] 스도쿠  (0) 2020.10.13
[백준 9663번 C++] N-Queen  (0) 2020.10.13
[백준 11399번 C++] ATM  (0) 2020.10.05
[백준 2309번 C++] 일곱 난쟁이  (0) 2020.10.05
[백준 10814번 C++] 나이순 정렬  (0) 2020.09.21

1. 문제 링크

www.acmicpc.net/problem/11399

 

11399번: ATM

첫째 줄에 사람의 수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 각 사람이 돈을 인출하는데 걸리는 시간 Pi가 주어진다. (1 ≤ Pi ≤ 1,000)

www.acmicpc.net

 

 

 

2. 문제 설명

줄을 서 있는 사람의 수와 각 사람이 돈을 인출하는데 걸리는 시간을 입력받은 후,

각 사람이 돈을 인출하는데 필요한 시간의 합의 최솟값을 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 11399번 ATM C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N, P;
	vector<int> v;

	cin >> N;
	for (int i = 0; i < N; i++) {
		cin >> P;
		v.push_back(P);
	}

	sort(v.begin(), v.end());
	int result = 0;
	for (int i = 0; i < N; i++)
		// for (int j = 0; j <= i; j++)
		// 	result += v[j];
		result += v[i] * (N - i);
	cout << result;

	return 0;
}

 

20번 라인 : 최솟값을 구하려면 돈을 인출하는데 필요한 시간이 적게 걸리는 사람부터 인출해야 하므로 오름차순으로 정렬합니다.

22 ~ 24번 라인 : 3명의 사람이 있다고 가정하고 돈을 인출하는데 필요한 시간을 오름차순으로 정렬했다고 가정하면,

v[0], v[0] + v[1], v[0] + v[1] + v[2]이므로 이중 for문을 이용하여 구할 수 있습니다.

25번 라인 : 위의 예제를 살펴보면 v[0]은 3번, v[1]은 2번, v[2]는 1번 더하는 것을 알 수 있습니다.

따라서 23, 24번 라인의 for문을 사용하지 않고, 25번 라인의 식을 이용하여 단일 for문으로도 풀 수 있습니다.

1. 문제 링크

www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

 

 

2. 문제 설명

아홉 난쟁이의 키를 입력받아 키의 합이 100이 되는 일곱 난쟁이를 찾아 오름차순으로 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 2309번 일곱 난쟁이 C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int arr[9];
	int sum = 0;
	for (int i = 0; i < 9; i++) {
		cin >> arr[i];
		sum += arr[i];
	}

	sort(arr, arr + 9);
	for (int i = 0; i < 8; i++) {
		for (int j = i + 1; j < 9; j++) {
			if (sum - arr[i] - arr[j] == 100) {
				for (int k = 0; k < 9; k++) {
					if (k != i && k != j)
						cout << arr[k] << '\n';
				}
				return 0;
			}
		}
	}

	return 0;
}

 

13, 14번 라인 : 아홉 난쟁이의 키를 입력받으면서 동시에 키의 합을 구합니다.

17번 라인 : 오름차순으로 출력하기 위해 정렬합니다.

18, 19번 라인 : i, j에 0~8까지 수에서 2개를 뽑는 조합을 모두 대입합니다. (0,1 ~ 7,8)

20번 라인 : 아홉 난쟁이의 키의 합에서 i번째 난쟁이와 j번째 난쟁이의 키를 빼서 100이 되는지 확인합니다.

21 ~ 24번 라인 : 20번 라인에서 100이 된다면 정답이므로 i번째 난쟁이와 j번째 난쟁이를 제외한 난쟁이의 키를 출력합니다.

25번 라인 : 정답이 여러 개인 경우 하나만 출력해야 하므로 프로그램을 종료합니다. (break를 사용할 경우 19번 for문만 탈출합니다.)

1. 문제 링크

www.acmicpc.net/problem/10814

 

10814번: 나이순 정렬

온라인 저지에 가입한 사람들의 나이와 이름이 가입한 순서대로 주어진다. 이때, 회원들을 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하는 프로그램을 �

www.acmicpc.net

 

 

 

2. 문제 설명

나이와 이름을 입력받은 후, 나이가 증가하는 순으로, 나이가 같으면 먼저 가입한 사람이 앞에 오는 순서로 정렬하여 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 10814번 나이순 정렬 C++ 풀이입니다.

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

pair<int, string> p[100000];

bool comp(pair<int, string> p1, pair<int, string> p2)
{
	return p1.first < p2.first;
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> p[i].first >> p[i].second;

	stable_sort(p, p + N, comp);
	for (int i = 0; i < N; i++)
		cout << p[i].first << ' ' << p[i].second << '\n';

	return 0;
}

나이가 같으면 가입한 순서대로 정렬되어야 하므로 stable_sort함수를 이용하여 풀었습니다.

sort함수를 사용하면 나이가 같을 때, 가입한 순서와 다르게 정렬되는 경우가 있으므로 틀립니다.

pair의 경우 first(나이), second(이름) 순서로 정렬되는데,

이 문제에서 second(이름)는 정렬되면 안 되기 때문에 직접 comp함수를 만들어서 first만 비교하도록 구현했습니다.

1. 문제 링크

www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

 

 

2. 문제 설명

N개의 수를 입력받은 후, 오름차순으로 정렬하여 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 2751번 수 정렬하기 2 C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	int arr[1000000];
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> arr[i];

	sort(arr, arr + N);
	for (int i = 0; i < N; i++)
		cout << arr[i] << '\n';

	return 0;
}

sort함수를 이용한 풀이입니다.

sort함수를 사용하기 위해서는 <algorithm> 헤더 파일을 include 해줘야 합니다.

sort함수의 사용법은 sort(시작 지점, 끝 지점) 입니다.

시작 지점을 포함하고, 끝 지점을 포함하지 않는 범위까지 오름차순으로 정렬을 해줍니다.

 

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

void quick_sort(int *arr, int start, int end)
{
	int pivot = arr[start];
	int left = start + 1;
	int right = end;

	if (start >= end)
		return;
	while (true) {
		while (left <= right && arr[left] <= pivot)
			left++;
		while (left <= right && arr[right] >= pivot)
			right--;
		if (left > right)
			break;
		swap(arr[left], arr[right]);
	}
	swap(arr[start], arr[right]);
	quick_sort(arr, start, right - 1);
	quick_sort(arr, right + 1, end);
}

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	int arr[1000000];
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> arr[i];

	random_shuffle(arr, arr + N);
	quick_sort(arr, 0, N - 1);
	for (int i = 0; i < N; i++)
		cout << arr[i] << '\n';

	return 0;
}

 

퀵 정렬을 이용한 풀이입니다.

퀵 정렬의 시간 복잡도는 평균적으로 O(nlogn)이지만, 최악의 경우 O(n^2)입니다.

이 문제의 경우 O(nlogn)으로만 풀 수 있기 때문에 38번 라인을 주석 처리하면 시간 초과가 납니다.

퀵 정렬의 최악의 경우는 순서대로 정렬되어있거나, 거꾸로 정렬되어 있는 경우이므로

38번 라인에서 random_shuffle(arr, arr + N); 을 사용하여 랜덤으로 섞어서 이러한 경우를 방지했습니다.

STL의 sort함수의 경우 퀵 정렬, 힙 정렬, 삽입 정렬을 혼합해서 사용하는 인트로 정렬로 구현되어 있어 최악의 경우에도 O(nlogn) 입니다.

1. 문제 링크

www.acmicpc.net/problem/2750

 

2750번: 수 정렬하기

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

www.acmicpc.net

 

 

 

2. 문제 설명

N개의 수를 입력받은 후, 오름차순으로 정렬하여 출력하는 문제입니다.

 

 

 

3. 소스코드

BOJ 2750번 수 정렬하기 C++ 풀이입니다.

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

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	int arr[1000];
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> arr[i];

	sort(arr, arr + N);
	for (int i = 0; i < N; i++)
		cout << arr[i] << '\n';

	return 0;
}

sort함수를 이용한 풀이입니다.

sort함수를 사용하기 위해서는 <algorithm> 헤더 파일을 include 해줘야 합니다.

sort함수의 사용법은 sort(시작 지점, 끝 지점) 입니다.

시작 지점을 포함하고, 끝 지점을 포함하지 않는 범위까지 오름차순으로 정렬을 해줍니다.

 

#include <iostream>
using namespace std;

int main(void)
{
	ios::sync_with_stdio(0);
	cin.tie(0);

	int N;
	int arr[1000];
	cin >> N;
	for (int i = 0; i < N; i++)
		cin >> arr[i];

	for (int i = 1; i < N; i++) {
		int temp = arr[i];
		int j;
		for (j = i - 1; j >= 0; j--) {
			if (arr[j] > temp)
				arr[j + 1] = arr[j];
			else
				break;
		}
		arr[j + 1] = temp;
	}
	for (int i = 0; i < N; i++)
		cout << arr[i] << '\n';

	return 0;
}

삽입 정렬을 이용한 풀이입니다.

1. var란?

2018년 3월에 출시된 Java 10부터 var를 지원합니다.

 

var i = 1; // int로 추론
var str = "Java"; // String으로 추론
var list = new ArrayList<String>(); // ArrayList<String>으로 추론

var는 지역변수를 선언할 때 초깃값을 통하여 데이터 타입을 추론합니다.

 

int var = 1; // 식별자로 사용 가능

var는 예약된 타입 이름으로 키워드가 아니기 때문에 식별자로 사용할 수 있습니다.

예제만으로는 이해하기 힘들 것 같아서 아래에 JEP 286: Local-Variable Type Inference에서 가져온 관련 내용을 덧붙입니다.

The identifier var is not a keyword; instead it is a reserved type name. This means that code that uses var as a variable, method, or package name will not be affected; code that uses var as a class or interface name will be affected (but these names are rare in practice, since they violate usual naming conventions).

 

 

 

2. 사용 예제

// 기존 코드
Map<String, List<String>> countryToCity = new HashMap<>();
// ...
for (Map.Entry<String, List<String>> citiesInCountry : countryToCity.entrySet()) {
  List<String> cities = citiesInCountry.getValue();
  // ...
}
// var를 사용한 코드
var countryToCity = new HashMap<String, List<String>>();
// ...
for (var citiesInCountry : countryToCity.entrySet()) { // for each문에서 사용 가능
  var cities = citiesInCountry.getValue();
  // ...
}

var를 사용하면 위와 같이 코드 양을 줄일 수 있습니다.

var는 for each문에서도 사용할 수 있으며, C++의 auto와 비슷하게 사용 가능합니다.

 

Object productInfo = new Object() {
        String name = "Apple";
        int total = 30;
};
System.out.println("name = " + productInfo.name + ", total = " + productInfo.total);

익명 클래스를 만드는 경우 필드를 추가할 수 있지만, 다른 곳에서 해당 필드를 참조할 수 없으므로, 위의 코드는 5번 라인에서 에러를 발생시킵니다.

하지만, 위의 코드에서 맨 처음 Object를 var로 바꾸면 익명 클래스에 선언된 필드를 사용할 수 있으므로 에러가 나지 않습니다.

 

 

 

3. 주의해야 할 점

public class VarDemo {
    // var a = 1; // var는 지역변수에서만 사용 가능
    public static void main(String[] args) {
        // var x = 1, y = 2; // ,와 함께 사용 불가능

        // var str = null; // null은 String에서만 사용할 수 있는 것이 아니므로 타입 추론 불가능

        // var err; // var를 사용할 때는 초기화를 바로 해야 함 (타입 추론이 불가능하므로)
        // err = 1;
        
        // var l = () -> {} // 람다식에서 사용 불가능
    }
    // void test(var x) {} // 메소드의 인수타입은 지역변수여도 var 사용 불가
}

위 예제에서 사용한 var는 모두 해당 라인 주석의 이유로 에러를 발생시킵니다.

 

 

 

4. 참고한 사이트

 

JEP 286: Local-Variable Type Inference

JEP 286: Local-Variable Type Inference Summary Enhance the Java Language to extend type inference to declarations of local variables with initializers. Goals We seek to improve the developer experience by reducing the ceremony associated with writing Java

openjdk.java.net

 

Local Variable Type Inference: Frequently Asked Questions

Brian Goetz Stuart Marks 2018-10-11, updated 2019-08-30 Why have var in Java? Local variables are the workhorse of Java. They allow methods to compute significant results by cheaply storing intermediate values. Unlike a field, a local variable is declared,

openjdk.java.net

 

Java 10 Local Variable Type Inference

Java 10 introduced a new shiny language feature called local variable type inference. Sounds fancy! What is it? Let’s work through two situations where Java makes things a little difficult for us as a Java developer. Context: Boilerplate and code readabi

developer.oracle.com

 

'Java' 카테고리의 다른 글

[Java 14] 개선된 switch 문(Enhanced Switch Expressions)  (0) 2020.11.08

1. 시작하며

한글도메인이란 www.도메인.com처럼 사이트 이름이 한글이거나,

www.domain.한국처럼 최상위 도메인이 한글인 경우를 말합니다. 

최상위 도메인이 한글인 사이트는 본 적이 없는데 만들 수 있다고 합니다.

이번에 사이드 프로젝트를 진행하다가 사이트 이름에 "정"이라는 글자가 들어가서

jung으로 할까 jeong으로 할까 고민하다가 "그냥 외우기 쉽게 한글로 하면 되겠다!" 라는 생각으로

www.도메인.com 형식의 한글 도메인을 구매하여 사용해 본 경험 기반으로 말씀드리겠습니다. 

 

 

 

2. 구매 방법

한국 도메인 등록 업체뿐만 아니라 일부 해외 도메인 등록 업체에서도 한글 도메인을 판매합니다.

여러 사이트들을 돌아다니면서 가장 저렴한 사이트를 찾아서 구매하면 됩니다.

제가 원하는 한글 도메인은 해외가 더 저렴했고, 한글 도메인과 영어 도메인의 가격은 동일했습니다.

 

 

 

3. 연결 방법

한글 도메인의 경우 AWS나 구글 애널리틱스 같은 외부 사이트에 연결할 때 퓨니코드라는 형식으로 변환해야 연결이 가능합니다.

퓨니코드에 대한 설명과 변환 사이트는 링크에서 확인 가능합니다.

구글링을 통해 원하는 사이트와 연결하는 방법을 검색한 후 다른 부분은 모두 동일하게 진행하고,

사이트 주소를 입력하는 부분만 한글 도메인 대신 퓨니코드를 입력하면 됩니다.

 

 

 

4. 장점

제가 생각하는 장점은 외우기 쉽다 밖에 없는 것 같습니다...

 

 

 

5. 단점

1. AWS, 구글 애널리틱스 등 외부 사이트에 연결할 때마다 퓨니코드를 사용해야 한다.

 

위의 사진은 AWS Route53 설정 페이지인데 도메인 이름을 퓨니코드로 등록해서 알아보기 힘든 것을 알 수 있습니다.

외우기도 힘들어서 필요할 때마다 퓨니코드 변환기를 통해 퓨니코드를 알아내야 했었습니다...

물론 설명 탭에 알아볼 수 있게 표시할 수는 있지만, 한글 도메인을 여러 개 사용하고 있다면 헷갈릴 것 같습니다.

 

2. www.도메인.com 형식의 경우 도메인을 입력하고 com을 입력할 때 한영 변환을 해야 한다.

테스트하느라 들어갈 때마다 한영키를 제대로 안 눌러서 www.도메인.채ㅡ 으로 접속한 적이 많습니다.

별거 아닌 것 같지만 어떻게 보면 이것도 UX적으로 좋지 않은 케이스라고 볼 수 있을 것 같습니다.

 

3. 한글을 모르면 사용할 수 없다.

제가 만든 서비스는 재학 중인 대학교 학생들을 대상으로 만든 사이트라서 해외 진출의 가능성이 없어서 상관없지만,

추후 서비스가 잘 돼서 해외 진출하게 된다면 키보드로 한글 입력을 할 수 없는 외국인들에게는 커다란 진입장벽이 될 것입니다.

이 문제는 추후 영문 도메인으로 변경하거나, 추가하는 방식으로 해결이 가능하지만 추가 비용이 소요될 것입니다.

 

4. HTTP를 제외한 다른 인터넷 프로토콜과의 연동 지원이 미비하다. (ex. 이메일)

사이트 주소를 이용해서 자체 이메일을 만들 때 한글 이메일 주소를 사용하는 것이 어렵다고 합니다.

저는 자체 이메일이 필요 없어서 상관없었는데, 필요하신 분들은 자세히 알아보고 한글 도메인을 구입하는 게 좋을 것 같습니다.

 

5. 일부 사이트에서 링크 기능이 제대로 작동하지 않는다.

학교 학생들을 대상으로 만든 서비스라서 홍보글을 대학생 커뮤니티에 올렸었습니다.

당연히 링크가 걸릴 줄 알았는데 www. 까지만 링크가 걸려서 한글 주소로는 바로 접속이 불가능했었습니다.

사용자 입장에서 홍보글을 보고 링크를 통해 바로 클릭해서 들어갈 수 없고,

따로 창을 켜고 주소를 입력해서 들어가야 한다면 귀찮다는 생각이 들 것입니다.

어쩔 수 없이 구구절절하게 이유를 설명하며 퓨니코드 링크도 추가할 수밖에 없었습니다.

다행히 해당 커뮤니티는 학생증 인증을 통해서만 가입이 가능하므로 많은 학생들이 믿고 클릭해서 접속해 줬지만, 

제가 인터넷을 사용하다 퓨니코드 링크를 올리며 접속해 달라는 글을 본다면, 해킹당할 것 같이 생겨서 절대 클릭하지 않을 것 같습니다.

 

광고 등 본인이 직접 링크를 수정할 수 있거나, html 에디터를 지원하는 경우에는 직접 입력하면 되니 상관없을 것 같습니다.

주소창에 실제 주소를 입력하거나 즐겨찾기를 통해 접속하는 사용자가 많을 것으로 예상되는 경우에도 상관없을 것 같습니다.

하지만 제 경우에는 해당 커뮤니티 외에는 홍보할 방법을 찾지 못해서 이 부분이 가장 크리티컬 했습니다.

그러니 여러 사이트에 홍보글을 올리는 방식으로 홍보를 할 계획이라면,

홍보글을 올릴 사이트에 미리 한글 도메인을 입력해보고 링크 기능을 지원해주는지 확인해 보는 것을 추천드립니다.

포스팅을 작성하면서 티스토리와 카카오톡에서 테스트해보니

한글 도메인도 링크를 잘 연결해 주는 것으로 보아 대형 사이트에서는 문제없을 것 같습니다.

 

 

 

6. 사용 후기

처음 찾아봤을 때 일부 브라우저에서 동작이 되지 않는다, 모바일에서는 되지 않는다는 글들도 있었는데,

제가 만든 웹 사이트는 크롬, 익스플로러, 사파리, 안드로이드, ios에서 모두 정상적으로 동작했습니다.

해당 글들이 몇 년 전 글이었는데, 현재는 모두 업데이트되어 정상적으로 지원하는 것으로 보입니다.

 

단점들이 약간 불편한 정도라서 외우기 쉽다는 장점이 매우 큰 서비스라면 한글 도메인 사용을 굳이 말리고 싶지는 않습니다.

하지만 그냥 저처럼 한 번 써볼까? 하는 분들께는 굳이..? 라는 답변과 함께 영문 도메인을 추천드리고 싶습니다.

1. 시작하며

https://blog.encrypted.gg/731?category=773649

 

[실전 알고리즘] 0x06강 - 재귀_구버전

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 현재 보고있는 강..

blog.encrypted.gg

이 글을 보면서 공부하다가 스택 사이즈 설정하는 부분에서 윈도우와 방법이 달라서 구글링을 통해 해결했습니다.

저는 맥북 + Visual Studio Code + clang을 사용중입니다.

맥 OS에서는 g++을 입력하여 컴파일하면 자동으로 clang으로 컴파일됩니다.

본인이 따로 설정한적이 없다면 g++을 사용하는것처럼 보여도 clang을 사용하고 있는 것이므로 아래 방법으로 설정하시면 됩니다.

 

 

 

2. clang 스택 크기 설정

test.cpp 코드는 위 글에 나오는 코드를 사용했습니다.

위 사진처럼 컴파일할 때 -Wl,-stack_size -Wl,0x20000000 옵션을 추가하면 됩니다.

옵션 없이 컴파일 후 실행했을 때는 segmentation fault가 발생하지만,

옵션을 추가하면 정상적으로 실행되는 것을 확인할 수 있습니다.

0x20000000부분은 다른 숫자로 바꿔도 됩니다.

제가 참고한 글에서 512MB를 사용하고 있어서 저도 512MB로 예를 들었습니다.

 

 

 

3. 참고

https://clang.llvm.org/docs/CommandGuide/clang.html#cmdoption-wl-args

https://stackoverflow.com/questions/18909395/how-do-i-increase-the-stack-size-when-compiling-with-clang-on-os-x

+ Recent posts