문제
https://school.programmers.co.kr/learn/courses/30/lessons/134240?language=java
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 코드
public String solution(int[] food) {
String answer = "0"; //answer을 xxx0xxx형태로 만들어주기 위해 미리 0을 answer에 대입
int food_n; //food의 갯수를 임시로 저장할 변수 생성
for(int i = food.length-1; i >= 1;i--){ //for문 안의 이유는 블로그에 기재
food_n = food[i]/2;
for(int j = 0; j<food_n;j++){
answer = i + answer + i;
}
}
return answer;
}
코드 해설
이 문제는 쉬운 문제이지만 풀고 다른 사람들의 코드를 보니 다들 복잡하게 풀어서 내 풀이과정이 누군가에게 도움이 될까 싶어 올려본다!
우선
for(int j = 0; j<food_n;j++){
answer = i + answer + i;
}
- 제일 안쪽의 반복문에서 j의 범위를 저렇게 잡은 이유는 food의 갯수만큼 반복해서 answer에 추가시키려고 저렇게 범위를 잡았고
- 반복문 안의 코드를 저렇게 짠 이유는, 답이 0을 중심으로 1230321 이런 식으로 대칭되는 형태라서
answer = i + answer + i 이렇게 코드를 짰다.
for(int i = food.length-1; i >= 1;i--){
food_n = food[i]/2;
for(int j = 0; j<food_n;j++){
answer = i + answer + i;
}
}
- foon_n = food[i]/2;로 한 이유는 만약에 food의 갯수가 홀수면 어차피 하나는 못 쓰므로
그냥 2로 나눈 몫을 food_n으로 잡아서 양쪽에 한번에 그 몫만큼 반복해서 food를 배치하는 방식(i + answer + i)을 택했다. - 바깥 쪽의 i의 범위를 저렇게 잡은 이유는
예를 들어, food[] = [1,3,4,6]일 경우 우리가 원하는 답은 answer --> "1223330333221" 이렇게 나와야 하지만- i = 1부터 반복문을 시작할 경우
answer = i + answer + i에 의해서
i = 1일때, answer --> "101"
i = 2일때, answer --> "2210122"
i = 3일때, answer --> "3332210122333"
이런 식으로 역순이 나와버린다. 그래서 i = food.length-1로 잡고 반복문을 시작했고
- i = 1부터 반복문을 시작할 경우
- i = food.length-1로 잡은 이유는 제일 끝 수를 넣는다고 food.length를 넣어버리면
NullPointException이 발생하기 때문이다.(new arr[4]라고 생성한다고 해도 index는 arr[0]부터 arr[3]이 마지막이기 때문)
'프로그래머스 > Level 1' 카테고리의 다른 글
[프로그래머스][Level1][Java] 신고 결과 받기 (0) | 2022.03.05 |
---|---|
[프로그래머스][Level1][Java] 키패드 누르기 (0) | 2022.03.04 |
[프로그래머스][Level1][Java] 체육복 (0) | 2022.03.04 |
[프로그래머스][Level1][Java] 실패율 (0) | 2022.03.03 |
[프로그래머스][Level1][Java] 다트 게임 (0) | 2022.03.01 |