문제
https://school.programmers.co.kr/learn/courses/30/lessons/131127
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
개요
문제 내용 자체는 이해하기 크게 어렵지 않았다.
처음에는 투포인터 방식으로 코드를 작성했다.
처음 구현했던 방식은 12개의 테스트 중 단 1개만 통과하고, 나머지는 다 틀렸다.
다른 방식을 고민하다가, want 길이와 number의 길이가 최대 10이고, discount의 길이는 최대 10만이기 때문에 부담 없이 중첩 for문을 사용해도 되겠다는 생각이 들었다.
그래서 굳이 복잡하게 투포인터 방식을 사용하지 말고, 직관적으로 for문을 사용해서 구현하기로 했다.
정답 코드
#include <string>
#include <vector>
#include <map>
using namespace std;
int func(map<string, int> w, map<string, int> m){
for (auto item : m){
if (w.find(item.first) == w.end()) return 0;
if (w[item.first] != item.second) return 0;
}
return 1;
}
int solution(vector<string> want, vector<int> number, vector<string> discount) {
map <string, int> wantmap; // want와 number를 map 형태로 저장
int answer = 0;
for (int i = 0; i < want.size(); i++)
wantmap[want[i]] = number[i];
for (int i = 0; i <= discount.size() - 10; i++){
map <string, int> tempmap;
for (int j = i; j < i + 10; j++){
tempmap[discount[j]]++;
}
answer += func(wantmap, tempmap);
}
return answer;
}
want에는 string 형식의 원하는 제품이 저장되어 있고, number에는 해당 제품의 원하는 수량이 저장되어 있다.
그렇기 때문에 당연하게도 want와 number의 size는 같을 수 밖에 없다.
두 개의 vector를 한 번에 다루기 편하게 want와 number 각각의 값을 대응시켜 map에 저장하였다. (wantmap)
이제 discount 배열을 처음부터 순회하되, i번째 부터 i + 9번째까지 총 10개의 품목을 일단 일시적인 map (tempmap)에 저장하고, 이 tempmap과 wantmap을 적절히 비교하기만 하면 된다.
비교하는 로직은 func 함수를 따로 만들어 구현했다.
func 함수는 wantmap과 tempmap의 내용물이 궁극적으로 동일하면 1을 반환하고, 그렇지 않으면, 즉 특정 조건을 만족하지 않으면 0을 반환한다.
(1을 반환하는 것은 곧 회원 가입 가능한 날짜가 하나 추가된다는 의미이다.)
크게 2가지 조건을 확인해야 한다.
1. tempmap에 있는 제품이 wantmap에는 없으면 곧바로 0 반환
2. tempmap에 있는 제품이 wantmap에도 있긴 한데, 그 수량이 다르면 곧바로 0 반환
위의 2가지 조건에 걸리지 않고 func 함수 내의 for문을 탈출하면, 결국 wantmap과 tempmap이 동일하다는 것이기 때문에 1을 반환한다.
깨달은 점
일단은, map을 사용하는 것에 익숙해진 느낌이다. map을 잘 사용하면 정말 편한 것 같다.
map의 원소를 순회할 때 auto를 이용한 for문을 처음 사용해보았다.
for (auto item : m) 이런 식으로 auto를 이용해 map을 순회할 때 item의 자료형은 pair 형식이다.
예를 들어, map <string, int> m 과 같은 형식이었다면 item의 자료형은 pair<string, int> 인 것이다.
그리고, 구현하려는 로직이 solution 함수 내에서 너무 길어질 거 같으면 밖에 따로 함수를 만드는 것도 괜찮다고 느꼈다.
기존에 새로운 함수를 만드는 방식을 꺼렸던 이유는 파라미터 설정이 까다로울 것 같아서였다.
근데 생각보다 그렇게 까다롭지는 않을 뿐더러, 까다로울 거 같으면 전역 변수로 선언하는 등의 적절한 조치만 취해주면 더 보기 좋은 코드 작성이 될 것 같다고 생각했다.
'프로그래머스 문제 리뷰 > Lv2' 카테고리의 다른 글
[프로그래머스] [1차] 캐시 (C++) - Lv.2 (0) | 2023.08.01 |
---|---|
[프로그래머스] 구명 보트 (C++) - Lv.2 (0) | 2023.07.31 |
[프로그래머스] 점프와 순간 이동 (C++) - Lv.2 (0) | 2023.07.29 |
[프로그래머스] 예상 대진표 (C++) - Lv.2 (0) | 2023.07.29 |
[프로그래머스] 다음 큰 숫자 (C++) - Lv.2 (0) | 2023.05.13 |
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131127
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
개요
문제 내용 자체는 이해하기 크게 어렵지 않았다.
처음에는 투포인터 방식으로 코드를 작성했다.
처음 구현했던 방식은 12개의 테스트 중 단 1개만 통과하고, 나머지는 다 틀렸다.
다른 방식을 고민하다가, want 길이와 number의 길이가 최대 10이고, discount의 길이는 최대 10만이기 때문에 부담 없이 중첩 for문을 사용해도 되겠다는 생각이 들었다.
그래서 굳이 복잡하게 투포인터 방식을 사용하지 말고, 직관적으로 for문을 사용해서 구현하기로 했다.
정답 코드
#include <string>
#include <vector>
#include <map>
using namespace std;
int func(map<string, int> w, map<string, int> m){
for (auto item : m){
if (w.find(item.first) == w.end()) return 0;
if (w[item.first] != item.second) return 0;
}
return 1;
}
int solution(vector<string> want, vector<int> number, vector<string> discount) {
map <string, int> wantmap; // want와 number를 map 형태로 저장
int answer = 0;
for (int i = 0; i < want.size(); i++)
wantmap[want[i]] = number[i];
for (int i = 0; i <= discount.size() - 10; i++){
map <string, int> tempmap;
for (int j = i; j < i + 10; j++){
tempmap[discount[j]]++;
}
answer += func(wantmap, tempmap);
}
return answer;
}
want에는 string 형식의 원하는 제품이 저장되어 있고, number에는 해당 제품의 원하는 수량이 저장되어 있다.
그렇기 때문에 당연하게도 want와 number의 size는 같을 수 밖에 없다.
두 개의 vector를 한 번에 다루기 편하게 want와 number 각각의 값을 대응시켜 map에 저장하였다. (wantmap)
이제 discount 배열을 처음부터 순회하되, i번째 부터 i + 9번째까지 총 10개의 품목을 일단 일시적인 map (tempmap)에 저장하고, 이 tempmap과 wantmap을 적절히 비교하기만 하면 된다.
비교하는 로직은 func 함수를 따로 만들어 구현했다.
func 함수는 wantmap과 tempmap의 내용물이 궁극적으로 동일하면 1을 반환하고, 그렇지 않으면, 즉 특정 조건을 만족하지 않으면 0을 반환한다.
(1을 반환하는 것은 곧 회원 가입 가능한 날짜가 하나 추가된다는 의미이다.)
크게 2가지 조건을 확인해야 한다.
1. tempmap에 있는 제품이 wantmap에는 없으면 곧바로 0 반환
2. tempmap에 있는 제품이 wantmap에도 있긴 한데, 그 수량이 다르면 곧바로 0 반환
위의 2가지 조건에 걸리지 않고 func 함수 내의 for문을 탈출하면, 결국 wantmap과 tempmap이 동일하다는 것이기 때문에 1을 반환한다.
깨달은 점
일단은, map을 사용하는 것에 익숙해진 느낌이다. map을 잘 사용하면 정말 편한 것 같다.
map의 원소를 순회할 때 auto를 이용한 for문을 처음 사용해보았다.
for (auto item : m) 이런 식으로 auto를 이용해 map을 순회할 때 item의 자료형은 pair 형식이다.
예를 들어, map <string, int> m 과 같은 형식이었다면 item의 자료형은 pair<string, int> 인 것이다.
그리고, 구현하려는 로직이 solution 함수 내에서 너무 길어질 거 같으면 밖에 따로 함수를 만드는 것도 괜찮다고 느꼈다.
기존에 새로운 함수를 만드는 방식을 꺼렸던 이유는 파라미터 설정이 까다로울 것 같아서였다.
근데 생각보다 그렇게 까다롭지는 않을 뿐더러, 까다로울 거 같으면 전역 변수로 선언하는 등의 적절한 조치만 취해주면 더 보기 좋은 코드 작성이 될 것 같다고 생각했다.
'프로그래머스 문제 리뷰 > Lv2' 카테고리의 다른 글
[프로그래머스] [1차] 캐시 (C++) - Lv.2 (0) | 2023.08.01 |
---|---|
[프로그래머스] 구명 보트 (C++) - Lv.2 (0) | 2023.07.31 |
[프로그래머스] 점프와 순간 이동 (C++) - Lv.2 (0) | 2023.07.29 |
[프로그래머스] 예상 대진표 (C++) - Lv.2 (0) | 2023.07.29 |
[프로그래머스] 다음 큰 숫자 (C++) - Lv.2 (0) | 2023.05.13 |