728x90
 

1547번: 공

첫째 줄에 컵의 위치를 바꾼 횟수 M이 주어지며, M은 50보다 작거나 같은 자연수이다. 둘째 줄부터 M개의 줄에는 컵의 위치를 바꾼 방법 X와 Y가 주어지며, X번 컵과 Y번 컵의 위치를 서로 바꾸는 것을 의미한다. 컵을 이동시키는 중에 공이 컵에서 빠져나오는 경우는 없다. X와 Y의 값은 3보다 작거나 같고, X와 Y가 같을 수도 있다.

www.acmicpc.net

#include <iostream>
#include <string>
#include <map>
using namespace std;


int main() {
	int m;
	cin >> m;
	int cup[3] = { 1, 2, 3 };
	map<int, int> map;
	map[1] = 0;
	map[2] = 1;
	map[3] = 2;
	for (int i = 0; i < m; i++) {
		int from, to;
		cin >> from >> to;
		swap(cup[map[from]], cup[map[to]]);
		swap(map[from], map[to]);
	}
	cout << cup[0];
	return 0;
}
728x90
728x90
 

코딩테스트 연습 - 오픈채팅방 | 프로그래머스

오픈채팅방 카카오톡 오픈채팅방에서는 친구가 아닌 사람들과 대화를 할 수 있는데, 본래 닉네임이 아닌 가상의 닉네임을 사용하여 채팅방에 들어갈 수 있다. 신입사원인 김크루는 카카오톡 오픈 채팅방을 개설한 사람을 위해, 다양한 사람들이 들어오고, 나가는 것을 지켜볼 수 있는 관리자창을 만들기로 했다. 채팅방에 누군가 들어오면 다음 메시지가 출력된다. [닉네임]님이 들어왔습니다. 채팅방에서 누군가 나가면 다음 메시지가 출력된다. [닉네임]님이 나갔습니다. 채팅

www.welcomekakao.com

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 […]

tech.kakao.com

#include <string>
#include <vector>
#include <tuple>
#include <map>
using namespace std;

vector<string> solution(vector<string> record) {
    vector<string> answer;
    map<string, int> m;
    vector<string> ids;
    vector<string> nicknames;
    vector<pair<int, string>> ment;
    for (int i = 0; i < record.size(); i++) {
        if (record[i][0] == 'E') {
            int j = 6;
            while (record[i][j] != ' ') {
                j++;
            }
            string id = record[i].substr(6, j - 6);
            string nickname = record[i].substr(j + 1);
            //answer.push_back(nickname + "님이 들어왔습니다.");
            if (m.find(id) != m.end()) {
                nicknames[m[id]] = nickname;
            }
            else {
                ids.push_back(id);
                nicknames.push_back(nickname);
                m[id] = ids.size() - 1;
            }
            ment.push_back(make_pair(m[id], "님이 들어왔습니다."));
        }
        else if (record[i][0] == 'L') {
            string id = record[i].substr(6);
            ment.push_back(make_pair(m[id], "님이 나갔습니다."));
        }
        else if (record[i][0] == 'C') {
            int j = 7;
            while (record[i][j] != ' ') {
                j++;
            }
            string id = record[i].substr(7, j - 7);
            string nickname = record[i].substr(j + 1);
            nicknames[m[id]] = nickname;
        }
    }
    for (pair<int, string> t : ment) {
        string temp = nicknames[t.first] + t.second;
        answer.push_back(temp);
    }
    return answer;
}

 

728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1120번 문자열  (0) 2020.02.09
[백준] 1547번 공  (0) 2020.02.09
[백준] 3613번 Java vs C++  (0) 2020.02.08
[백준] 10808번 알파벳 개수  (0) 2020.02.08
[백준] 11403번 경로 찾기  (0) 2020.02.07
728x90
 

3613번: Java vs C++

문제 Java 예찬론자 김동규와 C++ 옹호가 김동혁은 서로 어떤 프로그래밍 언어가 최고인지 몇 시간동안 토론을 하곤 했다. 동규는 Java가 명확하고 에러가 적은 프로그램을 만든다고 주장했고, 동혁이는 Java는 프로그램이 느리고, 긴 소스 코드를 갖는 점과 제네릭 배열의 인스턴스화의 무능력을 비웃었다. 또, 김동규와 김동혁은 변수 이름을 짓는 방식도 서로 달랐다. Java에서는 변수의 이름이 여러 단어로 이루어져있을 때, 다음과 같은 방법으로 변수명을

www.acmicpc.net

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


int main() {
	string s;
	cin >> s;
	if (s[0] < 97) {
		cout << "Error!"; //첫 글자가 대문자면 에러
		return 0;
	}
	vector<int> underscoreIndex;
	vector<int> capitalLetterIndex;
	for (int i = 1; i < s.size(); i++) {
		if (s[i] == '_')
			underscoreIndex.push_back(i);
		else if (char c = s[i] < 97)
			capitalLetterIndex.push_back(i);
	}
	if (underscoreIndex.size() == 0 && capitalLetterIndex.size() == 0) {
		cout << s; //언더바도 안 나오고 대문자도 안 나오면 그대로 출력
		return 0;
	}
	else if (underscoreIndex.size() != 0 && capitalLetterIndex.size() != 0) {
		cout << "Error!"; //언더바도 나오고 대문자도 나오면 에러
		return 0;
	}
	else if (s[s.size() - 1] == '_' || s[0] == '_') {
		cout << "Error!";//첫글자나 마지막 글자가 언더바면 에러
		return 0;
	}
	else if (underscoreIndex.size() != 0) {// 대문자가 안 나오는 C++ 형식의 경우
		int previous = underscoreIndex[0];
		for (int i = 1; i < underscoreIndex.size(); i++) {
			if (underscoreIndex[i] - previous == 1) {//언더바가 연속으로 두개 나오면 에러
				cout << "Error!";
				return 0;
			}
			previous = i;
		}
		int count = 0;
		for (int i : underscoreIndex) {
			s.erase(i - count, 1);
			s.replace(i - count, 1, 1, s[i - count] - 32);
			count++;
		}
	}
	else if (capitalLetterIndex.size() != 0) {//언더바가 안 나오는 Java 형식의 경우
		int count = 0;
		for (int i : capitalLetterIndex) {
			s.replace(i + count, 1, 1, s[i + count] + 32);
			s.insert(i + count, 1, '_');
			count++;
		}
	}
	cout << s;
	return 0;
}
728x90
728x90
 

10808번: 알파벳 개수

단어에 포함되어 있는 a의 개수, b의 개수, …, z의 개수를 공백으로 구분해서 출력한다.

www.acmicpc.net

a의 아스키코드는 97, b의 아스키코드는 98, c의 아스키코드는 99 이런식으로 가기 때문에 char형으로 바꾸고 char에는 아스키코드인 정수가 저장되어있으니 97을 뺀 그 인덱스의 count를 늘려주었다.

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


int main() {
	string s;
	cin >> s;
	int alphabet[26];
	for (int i = 0; i < 26; i++) {
		alphabet[i] = 0;
	}
	for (int i = 0; i < s.size(); i++) {
		char c = s[i];
		alphabet[c - 97]++;
	}
	for (int i = 0; i < 26; i++) {
		cout << alphabet[i] << " ";
	}
	return 0;
}
728x90
728x90
 

11403번: 경로 찾기

가중치 없는 방향 그래프 G가 주어졌을 때, 모든 정점 (i, j)에 대해서, i에서 j로 가는 경로가 있는지 없는지 구하는 프로그램을 작성하시오.

www.acmicpc.net

DFS나 BFS로 풀려다가 코드 짜기가 너무 복잡할 것 같아서 간단하게 플로이드로 풀었다.

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


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n;
	cin >> n;
	const int INF = 1000;
	vector<vector<int>> d(n, vector<int>(n, INF));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int temp;
			cin >> temp;
			if (temp != 0) {
				d[i][j] = temp;
			}
		}
	}
	for (int k = 0; k < n; k++) {
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
			}
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (d[i][j] == INF) cout << 0 << " ";
			else cout << 1 << " ";
		}
		cout << endl;
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 3613번 Java vs C++  (0) 2020.02.08
[백준] 10808번 알파벳 개수  (0) 2020.02.08
[백준] 11404번 플로이드  (0) 2020.02.07
[백준] 1977번 완전제곱수  (0) 2020.02.07
[백준] 2163번 초콜릿 자르기  (0) 2020.02.07
728x90

그 유명한 플로이드(Floyd) 알고리즘이다.

 

11404번: 플로이드

첫째 줄에 도시의 개수 n(1 ≤ n ≤ 100)이 주어지고 둘째 줄에는 버스의 개수 m(1 ≤ m ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 m+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그 버스의 출발 도시의 번호가 주어진다. 버스의 정보는 버스의 시작 도시 a, 도착 도시 b, 한 번 타는데 필요한 비용 c로 이루어져 있다. 시작 도시와 도착 도시가 같은 경우는 없다. 비용은 100,000보다 작거나 같은 자연수이다. 시작

www.acmicpc.net

주의할 점은 n에서 m으로 가는 이음선이 여러 개가 있을 수 있다는 것이다. 따라서 가중치를 입력받을 때 작은 값만 배열에 저장하도록 해야 한다.

플로이드 알고리즘은 아래 글에서 자세히 설명해놓았다.

https://breakcoding.tistory.com/148

 

[알고리즘] 플로이드 (Floyd) 알고리즘

최단경로 알고리즘은 플로이드 알고리즘과 다익스트라 알고리즘이 가장 대표적인 두 알고리즘이다. 다익스트라 알고리즘은 출발지가 주어졌을 때 그 출발지(one)로부터 모든 지점(all)으로 가는

breakcoding.tistory.com

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


int main() {
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);
	int n, e;
	cin >> n >> e;
	const int INF = 100001;
	vector<vector<int>> d(n + 1, vector<int>(n + 1, INF));
	for (int i = 1; i <= n; i++) {
		d[i][i] = 0;
	}
	for (int i = 0; i < e; i++) {
		int from, to, weight;
		cin >> from >> to >> weight;
		if(d[from][to] == 0 || d[from][to] == INF)
			d[from][to] = weight;
		else d[from][to] = min(weight, d[from][to]);
	}
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (d[i][j] == INF) cout << 0 << " ";
			else cout << d[i][j] << " ";
		}
		cout << '\n';
	}
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 10808번 알파벳 개수  (0) 2020.02.08
[백준] 11403번 경로 찾기  (0) 2020.02.07
[백준] 1977번 완전제곱수  (0) 2020.02.07
[백준] 2163번 초콜릿 자르기  (0) 2020.02.07
[백준] 1037번 약수  (0) 2020.02.07
728x90
 

1977번: 완전제곱수

M과 N이 주어질 때 M이상 N이하의 자연수 중 완전제곱수인 것을 모두 골라 그 합을 구하고 그 중 최솟값을 찾는 프로그램을 작성하시오. 예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 완전제곱수는 64,  81,  100 이렇게 총 3개가 있으므로 그 합은 245가 되고 이 중 최솟값은 64가 된다.

www.acmicpc.net

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


int main() {
	int arr[100];
	int m, n;
	cin >> m >> n;
	for (int i = 0; i < 100; i++) {
		arr[i] = (i + 1) * (i + 1);
	}
	int count = 0;
	long long sum = 0;
	int minNum;
	for (int i = 0; i < 100; i++) {
		if (arr[i] >= m && arr[i] <= n) {
			count++;
			sum += arr[i];
			if (count == 1) {
				minNum = arr[i];
			}
		}
	}
	if (count == 0) cout << -1;
	else {
		cout << sum << endl;
		cout << minNum;
	}
	return 0;
}​
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 11403번 경로 찾기  (0) 2020.02.07
[백준] 11404번 플로이드  (0) 2020.02.07
[백준] 2163번 초콜릿 자르기  (0) 2020.02.07
[백준] 1037번 약수  (0) 2020.02.07
[백준] 1094번 막대기  (0) 2020.02.07
728x90
 

2163번: 초콜릿 자르기

정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다. 초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 이와

www.acmicpc.net

#include <iostream>
using namespace std;


int main() {
	int n, m;
	cin >> n >> m;
	cout << (n - 1) + (m - 1) * n;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 11404번 플로이드  (0) 2020.02.07
[백준] 1977번 완전제곱수  (0) 2020.02.07
[백준] 1037번 약수  (0) 2020.02.07
[백준] 1094번 막대기  (0) 2020.02.07
[백준] 1010번 다리 놓기  (0) 2020.02.07
728x90
 

1037번: 약수

첫째 줄에 N의 진짜 약수의 개수가 주어진다. 이 개수는 50보다 작거나 같은 자연수이다. 둘째 줄에는 N의 진짜 약수가 주어진다. 1,000,000보다 작거나 같고, 2보다 크거나 같은 자연수이고, 중복되지 않는다.

www.acmicpc.net

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

int main() {
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}
	sort(v.begin(), v.end());
	cout << v[0] * v[v.size() - 1];
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 1977번 완전제곱수  (0) 2020.02.07
[백준] 2163번 초콜릿 자르기  (0) 2020.02.07
[백준] 1094번 막대기  (0) 2020.02.07
[백준] 1010번 다리 놓기  (0) 2020.02.07
[백준] 1026번 보물  (0) 2020.02.07
728x90
 

1094번: 막대기

지민이는 길이가 64cm인 막대를 가지고 있다. 어느 날, 그는 길이가 Xcm인 막대가 가지고 싶어졌다. 지민이는 원래 가지고 있던 막대를 더 작은 막대로 자른다음에, 풀로 붙여서 길이가 Xcm인 막대를 만들려고 한다. 막대를 자르는 가장 쉬운 방법은 절반으로 자르는 것이다. 지민이는 아래와 같은 과정을 거쳐서 막대를 자르려고 한다. 지민이가 가지고 있는 막대의 길이를 모두 더한다. 처음에는 64cm 막대 하나만 가지고 있다. 이때, 합이 X보다 크다면,

www.acmicpc.net

#include <iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	int count = 0;
	while (n != 0) {
		if (n == 64) {
			n -= 64;
		}
		else if (n >= 32) {
			n -= 32;
		}
		else if (n >= 16) {
			n -= 16;
		}
		else if (n >= 8) {
			n -= 8;
		}
		else if (n >= 4) {
			n -= 4;
		}
		else if (n >= 2) {
			n -= 2;
		}
		else if (n >= 1) {
			n -= 1;
		}
		count++;
	}
	cout << count;
	return 0;
}
728x90

'알고리즘 문제' 카테고리의 다른 글

[백준] 2163번 초콜릿 자르기  (0) 2020.02.07
[백준] 1037번 약수  (0) 2020.02.07
[백준] 1010번 다리 놓기  (0) 2020.02.07
[백준] 1026번 보물  (0) 2020.02.07
[백준] 4963번 섬의 개수  (0) 2020.02.06

+ Recent posts