문제
정답
총 층수와 해당하는 num의 층수를 구해서 빼면 구할 수 있을 것이라 생각했다.
맨 위층이 다 채워진 경우와 다 채워지지 않는 경우로 나누고,
다 채워지지 않은 경우 num이 해당하는 층이 정방향인지 역방향인지 고려하여 에서 어느 위치에 있는지 1부터 w까지 구했다. 역방향의 경우 w를 빼주어 정방향의 위치로 고쳐주었다.
맨 위층의 방향도 고려하여 어디까지 상자가 채워져 있고 이를 num의 위치와 비교하여 상자의 개수를 구했다.
class Solution {
public int solution(int n, int w, int num) {
int answer = 0;
int numh = 0;
int numloc = 0;
// 총 층수 구하기
if(n%w == 0) {answer=n/w;}
else {answer=n/w +1;}
// 주어진 num의 층수 구하기
if(num%w==0) {numh=num/w;} // w의 배수일 때는 몫이 하나 크게 나오므로 1을 더하지 않는다.
else {numh=num/w+1;} // 1층부터 사용하므로 1을 더한다.
// 가장 꼭대기 층에 상자가 더 쌓여 있는지 확인
if(n%w != 0) {
// 홀수층 방향이 정방향, num 위치 구하기
if(numh%2!=0) {
if(num%w==0) {numloc = num%w + w;}
else {numloc = num%w;}
}
// 짝수층 방향이 역방향, num 반대로 바꾸고 위치 구하기
else {
if(num%w==0) {numloc = w - (num%w + w) +1;}
else {numloc = w - (num%w) +1;}
}
// num의 위치 맨 위에 상자가 있는지 확인
if(answer%2!=0) { // 맨 위가 홀수층(정방향)일 경우
if(n%w >= numloc) {answer = answer-numh+1;} // 맨 위의 상자의 숫자보다 num의 위치가 작거나 같을 경우 하나를 더한다.
else {answer = answer-numh;}
}
else { // 맨 위가 짝수층(역방향)일 경우
if((w-(n%w)) < numloc) {answer = answer-numh+1;} // 비어있는 공간보다 num의 위치가 큰 경우 하나를 더한다.
else {answer = answer-numh;}
}
}
else {answer = answer-numh;} // 배수면 바로 빼주기만 한다.
return answer;
}
}
70 정확도로 테스트 1~10만 계속 실패했다.
코드를 주석처리하며 결과를 확인했으나 잘 되지 않아서 테스트 케이스로 여러 경우를 추가해보았다.
n=20, w=4, num=18, 예상 결과값이 1인 테스트 케이스에서 걸렸다. 맨 위층의 상자를 꺼낼경우 전체 높이에서 해당 상자의 높이를 빼기에 0이 나와 생기는 오류였다.
해당 케이스에 1을 더해주니 테스트를 통과하였다.
최종 제출한 정답
class Solution {
public int solution(int n, int w, int num) {
int answer = 0;
int numh = 0;
int numloc = 0;
// 총 층수 구하기
if(n%w == 0) {answer=n/w;}
else {answer=n/w +1;}
// 주어진 num의 층수 구하기
if(num%w!=0) {numh=num/w+1;} // w의 배수일 때는 몫이 하나 크게 나오므로 1을 더하지 않는다.
else {numh=num/w;} // 1층부터 사용하므로 1을 더한다.
// 가장 꼭대기 층에 상자가 더 쌓여 있는지 확인
if(n%w != 0) {
// 홀수층 방향이 정방향, num 위치 구하기
if(numh%2!=0) {
if(num%w==0) {numloc = num%w + w;}
else {numloc = num%w;}
}
// 짝수층 방향이 역방향, num 반대로 바꾸고 위치 구하기
else {
if(num%w==0) {numloc = w - (num%w + w) +1;}
else {numloc = w - (num%w) +1;}
}
// num의 위치 맨 위에 상자가 있는지 확인
if(answer%2!=0) { // 맨 위가 홀수층(정방향)일 경우
if(n%w >= numloc) {answer = answer-numh+1;} // 맨 위의 상자의 숫자보다 num의 위치가 작거나 같을 경우 하나를 더한다.
else {answer = answer-numh;}
}
else { // 맨 위가 짝수층(역방향)일 경우
if((w-(n%w)) < numloc) {answer = answer-numh+1;} // 비어있는 공간보다 num의 위치가 큰 경우 하나를 더한다.
else {answer = answer-numh;}
}
}
else {answer = answer-numh+1;} // 배수면 바로 빼주기만 한다.
return answer;
}
}
'취업 > 코딩테스트' 카테고리의 다른 글
백준[1181] 단어 정렬 (0) | 2024.08.13 |
---|---|
[미완]프로그래머스 [PCCP 기출문제] 1번/붕대감기 (0) | 2024.05.28 |
프로그래머스 가장 가까운 같은 글자 (0) | 2024.05.24 |
코딩테스트 준비 문법 정리 (1) | 2024.05.17 |