일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- C/C++
- 개인 프로젝트
- 10월
- 수학
- 2월
- 기초
- 게임 엔진 공부
- 단계별로 풀어보기
- 1월
- 백준
- 4월
- 코딩 테스트
- 2023년
- 7월
- 개인 프로젝트 - 런앤건
- 골드메탈
- 3월
- 유니티 심화과정
- 입문
- 2022년
- 자료 구조
- 유니티
- 2025년
- 5월
- todolist
- c++
- 2024년
- 코딩 기초 트레이닝
- 프로그래머스
- 다이나믹 프로그래밍
- Today
- Total
기록 보관소
[프로그래머스] 코딩 기초 트레이닝 PART 8(C++) 본문
프로그래머스 코딩 테스트 연습 : 코딩 기초 트레이닝(C++)
https://school.programmers.co.kr/learn/challenges?order=recent&languages=cpp&partIds=44139&page=2
코딩테스트 연습 | 프로그래머스 스쿨
개발자 취업의 필수 관문 코딩테스트를 철저하게 연습하고 대비할 수 있는 문제를 총망라! 프로그래머스에서 선발한 문제로 유형을 파악하고 실력을 업그레이드해 보세요!
school.programmers.co.kr
프로그래머스 코딩 기초 트레이닝 : 간단한 논리 연산
https://school.programmers.co.kr/learn/courses/30/lessons/181917
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
boolean 변수 x1, x2, x3, x4가 매개변수로 주어질 때, 다음의 식의 true/false를 return 하는 solution 함수를 작성해 주세요.
- (x1 ∨ x2) ∧ (x3 ∨ x4)
입출력 예


코드
#include <string>
#include <vector>
using namespace std;
bool solution(bool x1, bool x2, bool x3, bool x4) {
return (x1 || x2) && (x3 || x4);
}
결과

프로그래머스 코딩 기초 트레이닝 : 주사위 게임 3
https://school.programmers.co.kr/learn/courses/30/lessons/181916
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
1부터 6까지 숫자가 적힌 주사위가 네 개 있습니다.
네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻습니다.
- 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 × p점을 얻습니다.
- 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p ≠ q)라면 (10 × p + q)2 점을 얻습니다.
- 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p ≠ q)라고 한다면 (p + q) × |p - q|점을 얻습니다.
- 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q ≠ r)이라면 q × r점을 얻습니다.
- 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻습니다.
네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return 하는 solution 함수를 작성해 주세요.
제한 사항
- a, b, c, d는 1 이상 6 이하의 정수입니다.
입출력 예


코드
#include <string>
#include <vector>
#include <cstdlib>
#include <map>
using namespace std;
int solution(int a, int b, int c, int d) {
map<int, int> m;
m[a]++; m[b]++; m[c]++; m[d]++;
if (m.size() == 1)
return 1111 * a;
else if (m.size() == 2) {
bool isPair = false;
int q = 0;
int p = 0;
for (auto it = m.begin(); it != m.end(); it++) {
if (it->second == 2) {
if (p == 0)
p = it->first;
else if (it->first != p)
q = it->first;
isPair = true;
}
else if (it->second == 3)
p = it->first;
else
q = it->first;
}
if (!isPair)
return (10 * p + q) * (10 * p + q);
else
return (p + q) * abs(p - q);
}
else if (m.size() == 3) {
int q = 0;
int r = 0;
for (auto it = m.begin(); it != m.end(); it++)
if (it->second == 1) {
if (q == 0)
q = it->first;
else
r = it->first;
}
return q * r;
}
else {
vector<int> arr = {a, b, c, d};
int min = 7;
for (int num : arr)
if (num < min)
min = num;
return min;
}
}
// 다른 사람의 풀이 1 : vector를 이용하는 방법
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int solution(int a, int b, int c, int d) {
int answer = 0;
vector<int> table(6);
table[a-1]++; table[b-1]++; table[c-1]++; table[d-1]++;
vector<vector<int>> nums(5);
nums[table[0]].emplace_back(1);
nums[table[1]].emplace_back(2);
nums[table[2]].emplace_back(3);
nums[table[3]].emplace_back(4);
nums[table[4]].emplace_back(5);
nums[table[5]].emplace_back(6);
if(!nums[4].empty())
{
return 1111*nums[4][0];
}
else if(!nums[3].empty())
{
return pow(10*nums[3][0]+nums[1][0],2);
}
else if(nums[2].size() == 2)
{
return (nums[2][0]+nums[2][1])*abs(nums[2][0]-nums[2][1]);
}
else if(nums[2].size() == 1)
{
return nums[1][0]*nums[1][1];
}
else
{
return *min_element(nums[1].begin(),nums[1].end());
}
return answer;
}
// 다른 사람의 풀이 2 : if-else문으로 해결한 방법
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(int a, int b, int c, int d) {
if(a == b && b == c && c == d) return 1111*a;
else if (a == b && b == c) return (10*a+d)*(10*a+d);
else if (b == c && c == d) return (10*b+a)*(10*b+a);
else if (c == d && d == a) return (10*c+b)*(10*c+b);
else if (d == a && a == b) return (10*d+c)*(10*d+c);
else if (a == b && c == d) return (a+c)*abs(a-c);
else if (a == c && b == d) return (a+d)*abs(a-d);
else if (a == d && b == c) return (a+b)*abs(a-b);
else if (a == b) return c*d;
else if (a == c) return b*d;
else if (a == d) return b*c;
else if (b == c) return a*d;
else if (b == d) return a*c;
else if (c == d) return a*b;
else return min(a, min(b, min(c, d)));
}
결과

프로그래머스 코딩 기초 트레이닝 : 글자 이어 붙여 문자열 만들기
https://school.programmers.co.kr/learn/courses/30/lessons/181915
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
문자열 my_string과 정수 배열 index_list가 매개변수로 주어집니다.
my_string의 index_list의 원소들에 해당하는 인덱스의 글자들을 순서대로 이어 붙인 문자열을 return 하는 solution 함수를 작성해 주세요.
제한 사항
- 1 ≤ my_string의 길이 ≤ 1,000
- my_string의 원소는 영소문자로 이루어져 있습니다.
- 1 ≤ index_list의 길이 ≤ 1,000
- 0 ≤ index_list의 원소 < my_string의 길이
입출력 예


코드
#include <string>
#include <vector>
using namespace std;
string solution(string my_string, vector<int> index_list) {
string answer = "";
for (int index : index_list)
answer += my_string[index];
return answer;
}
결과

프로그래머스 코딩 기초 트레이닝 : 9로 나눈 나머지
https://school.programmers.co.kr/learn/courses/30/lessons/181914
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
음이 아닌 정수를 9로 나눈 나머지는 그 정수의 각 자리 숫자의 합을 9로 나눈 나머지와 같은 것이 알려져 있습니다.
이 사실을 이용하여 음이 아닌 정수가 문자열 number로 주어질 때, 이 정수를 9로 나눈 나머지를 return 하는 solution 함수를 작성해주세요.
제한 사항
- 1 ≤ number의 길이 ≤ 100,000
- number의 원소는 숫자로만 이루어져 있습니다.
- number는 정수 0이 아니라면 숫자 '0'으로 시작하지 않습니다.
입출력 예


코드
#include <string>
#include <vector>
using namespace std;
int solution(string number) {
int answer = 0;
for (int i = 0; i < number.size(); i++)
answer += number[i] - '0';
return answer % 9;
}
결과

프로그래머스 코딩 기초 트레이닝 : 문자열 여러 번 뒤집기
https://school.programmers.co.kr/learn/courses/30/lessons/181913
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 설명
문자열 my_string과 이차원 정수 배열 queries가 매개변수로 주어집니다.
queries의 원소는 [s, e] 형태로, my_string의 인덱스 s부터 인덱스 e까지를 뒤집으라는 의미입니다.
my_string에 queries의 명령을 순서대로 처리한 후의 문자열을 return 하는 solution 함수를 작성해 주세요.
제한 사항
- my_string은 영소문자로만 이루어져 있습니다.
- 1 ≤ my_string의 길이 ≤ 1,000
- queries의 원소는 [s, e]의 형태로 0 ≤ s ≤ e < my_string의 길이를 만족합니다.
- 1 ≤ queries의 길이 ≤ 1,000
입출력 예


코드
#include <string>
#include <vector>
using namespace std;
string solution(string my_string, vector<vector<int>> queries) {
for (auto query : queries) {
string temp = "";
for (int i = 0; i <= query[0] - 1; i++)
temp += my_string[i];
for (int i = query[1]; i >= query[0]; i--)
temp += my_string[i];
for (int i = query[1] + 1; i < my_string.size(); i++)
temp += my_string[i];
my_string = temp;
}
return my_string;
}
// 다른 사람의 풀이 1 : reverse 함수를 사용한 방법 1
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string my_string, vector<vector<int>> queries) {
for(const auto& q : queries)
{
reverse(my_string.begin()+q[0],my_string.begin()+q[1]+1);
}
return my_string;
}
// 다른 사람의 풀이 2 : reverse 함수를 사용한 방법 2
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
string solution(string my_string, vector<vector<int>> queries) {
string answer = my_string;
for(auto i : queries)
reverse(answer.begin()+i[0],answer.begin()+i[1]+1);
return answer;
}
결과

여담
이번 문제 대부분은 무난하게 해결했지만, 주사위 게임 3은 조금 어려웠다.
정확히는 어렵다기보단, 바로 map으로 접근은 했지만 중간에 size가 2인 경우(주사위가 3개/1개로 같거나 2개/2개로 같은 경우)를 좀 더 깔끔하게 만들고 싶었던 욕심에 계속 고민하고 고치다가 미궁에 빠진 느낌이었다.
결국 정공법으로 if-else를 한 것보다 더 더럽게 해결한 것같아서 아쉬웠다..
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 코딩 기초 트레이닝 PART 10(C++) (0) | 2024.01.17 |
---|---|
[프로그래머스] 코딩 기초 트레이닝 PART 9(C++) (0) | 2024.01.16 |
[프로그래머스] 코딩 기초 트레이닝 PART 7(C++) (2) | 2024.01.11 |
[프로그래머스] 코딩 기초 트레이닝 PART 6(C++) (2) | 2024.01.10 |
[프로그래머스] 코딩 기초 트레이닝 PART 5(C++) (0) | 2024.01.09 |