알고리즘 CODEKATA 51 (두개 뽑아서 더하기)

오리너구리·2024년 6월 29일
0

CODEKATA

목록 보기
50/57
post-thumbnail

문제 설명

수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.

이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.

예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.

수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ food의 길이 ≤ 9
  • 1 ≤ food의 각 원소 ≤ 1,000
  • food에는 칼로리가 적은 순서대로 음식의 양이 담겨 있습니다.
  • food[i]는 i번 음식의 수입니다.
  • food[0]은 수웅이가 준비한 물의 양이며, 항상 1입니다.
  • 정답의 길이가 3 이상인 경우만 입력으로 주어집니다.

내 풀이

최종 코드

class Solution {
    fun solution(food: IntArray): String {
        var answer: String = ""
        var player1 :String = ""
        
        for (i in 1 ..food.size -1){
            val num = food[i] /2
            for(j in 1..num){
                player1 += i.toString()
            }
        }
        
        answer = player1 + "0" + player1.reversed()
        
        return answer
    }
}

풀이

food 에 들어간 숫자들은

인덱스 0 : 물 (무조건 1개만있음)

그리고 칼로리 순으로 분류한 음식의 개수들임

food의 음식 개수를 토대로 새로운 배열을 만들어야하는데,

일단 물이 가운데에 들어가야하고, 각 음식별로 두명의 선수한테 똑같은 개수로 나눠야하니까 2로 나눈 몫만큼을 주면됨 그리고 일렬로 놓고 끝부터 먹는 방식이기 때문에

한 선수의 분량을 만들고 그걸 그냥 중간에 0 놓고 순서 뒤집어서 주면된다.

그래서 일단 player1 이란 문자열 하나 만들어서

for문으로 인덱스 1부터 돌면서

음식의 개수를 2로 나눈 몫을 num이라는 변수에 넣어주고,

한번 더 for문을 돌려서 num만큼 해당 인덱스를 player1의 문자열에 추가해줌

그리고 최종 리턴할 answer문자열에 player1 + 0(물) player1을 뒤집은 문자열 합쳐서 넣어주면 끝


다른 사람 풀이

class Solution {
    fun solution(food: IntArray): String {
        val sb = StringBuilder()
        for (i in 1..food.lastIndex) {
            repeat(food[i] / 2) { sb.append(i) }
        }
        val reversed = sb.reversed()
        sb.append(0)
        sb.append(reversed)
        return sb.toString()
    }
}

같은 조 코드카타 리뷰? 할 때 우리팀 짱고수 분이 스트링 빌더라는게 있다고 알려주셨었는데,

여기서 나왔당~

근데 뭔지는 잘모름..ㅜ 나중에 공부해볼것

class Solution {
    fun solution(food: IntArray): String {
        var answer: String = ""

        food.forEachIndexed { index, i -> if(index != 0) for(i in 1 .. i / 2) answer += index }

        var temp = answer.reversed()
        answer = answer + "0" + temp

        return answer
    }
}

forEach를 사용해서 했는데..

index랑 , i를 받아서 인덱스가 0이 아닐때만 for문 돌려서 i가 i/2 만큼일 때 answer에 인덱스를 더해줌

문제 접근 방식은 저랑 똑같은데 람다식을 쓰셧군용~


TMI

옛날에 나보다 진도 빠른 팀원 분이 이거 풀었다고 보여주실 때는
문제 길이 너무 길어보여서 와.. ㅅㅂ저거어케풀어야함 했는데
막상 또 풀때 돼서 푸니까 쉬워서 신남~
열심히 공부햇더니 쪼끔씩 똑똑해지고있나봄

profile
오리너구리입니다

0개의 댓글