인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

정근희님의 프로필 이미지

작성한 질문수

38군데 합격 비법, 2024 코딩테스트 필수 알고리즘

2-6. 링크드 리스트 문제

2-6 LinkedList 합계 자바 풀이

해결된 질문

작성

·

41

0

1. 현재 학습 진도

  • 몇 챕터/몇 강을 수강 중이신가요? 2-6

  • 어떤 알고리즘을 학습하고 계신가요? LinkedList

  • 여기까지 이해하신 내용은 무엇인가요? 어떻게 로직이 흘러가는지 이해가 된 상태 입니다.

 

2. 어려움을 겪는 부분

  • 어느 부분에서 막히셨나요? 어려운 부분은 아니고 뭔가 제 풀이에 대해서 공유 해드리고 싶습니다!

  • 코드의 어떤 로직이 이해가 안 되시나요? 이해가 안되진 않는 것 같습니다!

  • 어떤 개념이 헷갈리시나요? 없습니다!

 

3. 시도해보신 내용

  • 문제 해결을 위해 어떤 시도를 해보셨나요? 우선 값들을 StringBuilder 로 만들어서 각각 Int로 파싱한다음 더해주는 과정을 해보았습니다.

  • 에러가 발생했다면 어떤 에러인가요? 없습니다!

  • 현재 작성하신 코드를 공유해주세요

     package algorithm_practice.second_week;
    
    public class GetLinkedLiistSum_01 {
        // Node 클래스 정의
        static class Node {
            int data;
            Node next;
    
            Node(int data) {
                this.data = data;
                this.next = null;
            }
        }
    
        // LinkedList 클래스 정의
        static class LinkedList {
            Node head;
    
            public LinkedList(int value) {
                this.head = new Node(value);
            }
    
            public void append(int value) {
                Node cur = head;
                while (cur.next != null) {
                    cur = cur.next;
                }
                cur.next = new Node(value);
            }
        }
    
        // 두 연결 리스트의 합을 계산하는 메서드
        public static int getLinkedListSum(LinkedList list1, LinkedList list2) {
            
            StringBuilder firstNumber = new StringBuilder();
            StringBuilder secondNumber = new StringBuilder();
    
            Node cur1 = list1.head;
            Node cur2 = list2.head;
    
                while (cur1 != null && cur2 != null) {
                    firstNumber.append(cur1.data);
                    secondNumber.append(cur2.data);
                    cur1 = cur1.next;
                    cur2 = cur2.next;
                }
                
    
            int result = Integer.parseInt(firstNumber.toString()) + Integer.parseInt(secondNumber.toString());
    
            return result;
        }
    
        // 메인 실행 테스트
        public static void main(String[] args) {
            LinkedList linkedList1 = new LinkedList(6);
            linkedList1.append(7);
            linkedList1.append(8);
    
            LinkedList linkedList2 = new LinkedList(3);
            linkedList2.append(5);
            linkedList2.append(4);
    
            int result = getLinkedListSum(linkedList1, linkedList2);
            System.out.println("두 연결 리스트의 합: " + result);  // 예시: 1032
        }
    }
    

파이썬 코드를 자바로 변환해서 풀어봤는데 이렇게 접근해도 좋은 풀이 일까요~?

이렇게 구체적으로 알려주시면, 더 정확하고 도움이 되는 답변을 드릴 수 있습니다! 😊

답변 2

0

딩코딩코님의 프로필 이미지
딩코딩코
지식공유자

안녕하세요 근희님! 좋은 질문 감사합니다

자바로 새롭게 코드를 작성해서 풀어보다니 너무 훌륭합니다!!

 

파이썬 코드와 비교해보면 개념적으로 동일한 접근법을 사용하신 것 같습니다. 다만 파이썬 코드에서는 get_single_linked_list_sum 함수에서 순회하면서 값을 계산할 때 자릿수를 고려하여 곱하기 10을 하는 방식을 사용했고, 자바 코드에서는 StringBuilder를 활용해 문자열로 만든 후 숫자로 변환하는 방식을 사용하셨습니다.

 

두 방식 모두 잘 작동하며 각각의 장단점이 있습니다

  1. 파이썬 코드 방식 (곱하기 10 사용):

    • 장점: 숫자를 바로 계산하므로 추가 변환 없음

    • 단점: 연결 리스트가 매우 길면 자릿수 계산에 주의해야 함

  2. 자바 코드 방식 (StringBuilder 사용):

    • 장점: 문자열 조작이 직관적이고 코드가 간결함

    • 단점: 문자열→숫자 변환 과정이 추가됨

 

다만, 자바 코드에서 한 가지 주의할 점이 있습니다.

while (cur1 != null && cur2 != null) { 
    firstNumber.append(cur1.data); 
    secondNumber.append(cur2.data); 
    cur1 = cur1.next; 
    cur2 = cur2.next; 
}

 

이 부분은 두 연결 리스트의 길이가 다른 경우 처리를 못할 수 있습니다. 예를 들어, 한 리스트가 다른 리스트보다 길면 긴 리스트의 나머지 부분이 무시될 수 있습니다. 따라서 다음과 같이 수정하면 더 확장성 있는 코드로 사용될 수 있습니다.

while (cur1 != null) {
    firstNumber.append(cur1.data);
    cur1 = cur1.next;
}

while (cur2 != null) {
    secondNumber.append(cur2.data);
    cur2 = cur2.next;
}

이 내용을 제외하면, StringBuilder를 활용한 접근법은 자바스러운 좋은 풀이입니다! 수업의 내용을 이해하고 자바로 새롭게 풀어보는 모습 너무 훌륭하십니다!! 코테 부술때까지 파이팅이십니다!

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.
정근희님께서 공유해주신 LinkedList 합계 구하는 자바 코드를 잘 보았습니다.

  1. 적절한 데이터 구조 사용: LinkedList의 각 노드를 탐색하며 숫자를 문자열로 결합하고, 이를 숫자로 변환하여 합을 구하는 방식은 문제를 해결하기 위한 적절한 접근 방식입니다. 만약 숫자가 매우 큰 경우에도 StringBuilder를 사용한 방법은 Java의 Integer.MAX_VALUE 초과 문제를 피할 수 있어 좋습니다.

  2. 코드 개선 제안:

    • 현재 코드에서는 두 리스트의 길이가 같다고 가정하고 있습니다. 다양한 길이의 리스트에도 대응할 수 있도록 개선할 수 있습니다.
    • 두 리스트에서 하나가 끝나더라도, 다른 리스트가 남아있는 경우도 고려하면 좋겠습니다.
  3. 성능 개선:

    • 현재 코드에서는 두 리스트에서 동일한 위치의 노드를 각기 갖고 와서 String을 계속해서 append하고 있습니다. 이를 대신할 수 있는 방식으로 두 리스트의 각 자릿수를 더하고, 새로운 노드를 결과로 생성하는 것도 고려해볼 수 있습니다.
  4. 코드 실행 및 테스트 필요:

    • 외부 조건이나 추가적인 예외 사항들을 고려하여, 다양한 경우에 대한 테스트 케이스를 만들어 테스트를 수행해 보시면, 더 견고하고 완성도가 높은 코드를 작성할 수 있습니다.

현재 작성하신 코드는 기본적인 로직으로 연결 리스트의 합을 구하는 데 있어 효과적입니다. 이러한 방법을 통해 논리 구현 능력을 향상시킬 수 있습니다. 더 궁금한 사항이 있으면 언제든지 문의주세요! 😊

출처: Spring Boot Reference Documentation
인프런 FAQ