문제 링크입니다.
2025 프로그래머스 코드챌린지 2차 예선 문제네요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
박스를 정방향 -> 역방향 -> 정방향 ... 이런식으로 쌓는게 문제입니다.
이런 경우에 고민할점은
1. 정방향 벡터를 만들어서 인덱스를 구하는쪽에서 야무지게 구할것인지
2. 문제의 쌓는 방향을 고려해서 벡터를 구성한뒤에 쉽게 인덱스를 구할것인지
인데요. 문제의 데이터를 쌓는 방식이 구현이 어렵다고 판단이 되면 그대로 구현하는것도 나쁘지 않은것 같습니다.
인덱스를 복잡하게 구하던 도중에 중간에 누가 절 부르기라도 하면 머리가 터져버리더라구요.
아래는 전체 코드입니다.
#include <string>
#include <vector>
#include <cmath>
#include <iostream>
using namespace std;
int solution(int n, int w, int num) {
int height = ceil((double)n/w);
int range = height*w;
vector<int> box(range);
int targetIndex = 0;
bool direction = true;
for(int i = 0; i < height; i++) {
for(int j = 0; j < w; j++) {
//정방향
if(direction) box[i*w+j] = i*w+j+1;
//역방향
else box[i*w+j] = (i+1)*w-j;
if(box[i*w+j] == num) targetIndex = i*w+j;
}
direction = !direction;
}
int answer = 0;
while(targetIndex < box.size()) {
if(box[targetIndex] <= n) {
answer++;
targetIndex += w;
} else break;
}
return answer;
}
일단 몇층을 쌓아올릴지는 height에 저장합니다. 간단하게 ceil(n/w)하면 총 몇 층인지 계산할 수 있습니다.
주의할점은 int/int를 하면 계산과정에서 내림 처리가 되버려서 ceil(3.XX)을 하고싶었는데 ceil(3)을 백날 하고있을 가능성이 있습니다. 소수점 타입으로 잘 캐스트 해줍니다.
이후 2중 for문으로 박스를 구성합니다. 정방향일때는 i*w+j를 그대로 사용하면 되지만(+1하는 이유는 문제에서 i번째 index의 값이 i+1이라서입니다) 역방향일때는 현재 높이(i)의 최대 원소 값(i+1)*w 에서 j를 빼주는 방식으로 구성하면 됩니다.
이제 박스가 벡터에 야무지게 들어찼으니 인덱스는 간단하게 계산해주면 됩니다. 이미 정/역방향처리를 벡터에 처리해줬으니 단순하게 계산하면 됩니다.
주의할점은 예제에서처럼 가장 높은곳의 박스가 꽉차있지 않는 경우가 당연히 있다는것이며, 이러한 경우에는 answer에 추가되지 않도록 while문 안에서 조건문을 통해 box[targetIndex]의 값이 실제 박스의 범위인 n 안에 있는지 확인해줍니다.
마지막으로 answer를 리턴해주면 됩니다.
'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 - 아이템 줍기 (C++) (0) | 2025.02.17 |
---|---|
프로그래머스 - 단어 변환 (C++) (0) | 2025.02.16 |
프로그래머스 - 피로도 (C++) (0) | 2025.02.15 |
프로그래머스 - 불량 사용자 (C++) (0) | 2025.02.15 |
[프로그래머스] (C#) 공원 산책 (1) | 2024.06.04 |