[프로그래머스] 나머지가 1이되는 수 찾기

2024. 10. 12. 22:58·여러가지/알고리즘 & 자료구조

문제 설명

주어진 자연수 n을 어떤 자연수 x로 나눈 나머지가 1이 되는 가장 작은 자연수 x를 찾는 문제입니다.


1. Java 코드 풀이

class Solution {
    public int solution(int n) {
        for (int x = 2; x < n; x++) {
            if (n % x == 1) {
                return x;
            }
        }
        return -1;  // 조건 상 이 부분은 실행되지 않음
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution(10));  // 출력: 3
        System.out.println(sol.solution(12));  // 출력: 11
    }
}

설명:

  • x = 2부터 시작해서 n-1까지 반복문을 돌며, n % x == 1이 되는 가장 작은 x를 찾습니다.
  • 첫 번째로 조건을 만족하는 x가 가장 작은 값이므로 즉시 반환합니다.

2. Python 코드 풀이

def solution(n):
    for x in range(2, n):
        if n % x == 1:
            return x

# 테스트
print(solution(10))  # 출력: 3
print(solution(12))  # 출력: 11

설명:

  • for 루프를 사용하여 2부터 n-1까지 탐색하며, 조건에 맞는 가장 작은 값을 찾습니다.
  • 찾는 즉시 값을 반환합니다.

3. 시간 복잡도 분석

  • 시간 복잡도: O(n)
    • 최악의 경우, x를 n-1까지 탐색해야 하므로 반복문이 n번 실행됩니다.
    • 즉, 시간 복잡도는 O(n)입니다.

4. 공간 복잡도 분석

  • 공간 복잡도: O(1)
    • 추가적인 배열이나 데이터 구조 없이 상수 공간만 사용하므로, 공간 복잡도는 O(1)입니다.

5. 다른 자바 코드 풀이 방법

방법 1: Stream API를 사용한 풀이

import java.util.stream.IntStream;

class Solution {
    public int solution(int n) {
        return IntStream.range(2, n)
                        .filter(x -> n % x == 1)
                        .findFirst()
                        .orElse(-1);  // 조건 상 항상 해답이 있음
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution(10));  // 출력: 3
        System.out.println(sol.solution(12));  // 출력: 11
    }
}

설명:

  • IntStream.range(2, n)을 사용하여 2부터 n-1까지의 범위를 생성합니다.
  • filter(x -> n % x == 1)을 통해 조건을 만족하는 값을 필터링하고, findFirst()로 가장 첫 번째 값을 반환합니다.

방법 2: while문을 사용한 반복 풀이

class Solution {
    public int solution(int n) {
        int x = 2;
        while (n % x != 1) {
            x++;
        }
        return x;
    }

    public static void main(String[] args) {
        Solution sol = new Solution();
        System.out.println(sol.solution(10));  // 출력: 3
        System.out.println(sol.solution(12));  // 출력: 11
    }
}

설명:

  • while 루프를 사용하여 n % x == 1이 될 때까지 x를 1씩 증가시킵니다.
  • 조건을 만족하는 첫 번째 x 값을 반환합니다.

6. Java 코드 풀이 방법들 간의 비교

방법 장점 단점
기본 for 루프 직관적이고 간단함 다른 방식에 비해 코드가 덜 간결할 수 있음
Stream API 사용 함수형 스타일로 코드가 매우 간결함 성능적으로 아주 미세한 오버헤드 발생 (스트림 처리 때문)
while문 반복 비교적 간결하고 효율적 다른 방식에 비해 직관적이지 않을 수 있음
  • Stream API 방식: 코드가 간결하며 함수형 스타일을 선호하는 사람들에게 적합합니다. 하지만 작은 성능 차이로 인해 반복문 방식이 조금 더 효율적일 수 있습니다.
  • while문 방식: while을 사용한 반복 방식은 필요 조건만을 처리하여 효율적이지만, 일반적인 for 루프보다 가독성이 떨어질 수 있습니다.

결론

  • 이 문제는 기본적인 탐색 문제로, 가장 직관적인 방법은 for 또는 while을 이용해 조건을 만족하는 값을 찾는 것입니다.
  • Stream API는 코드를 간결하게 만들 수 있지만, 작은 성능 오버헤드가 발생할 수 있습니다.
  • 시간 복잡도는 O(n), 공간 복잡도는 O(1)로, 문제의 제한 조건 내에서는 성능적으로 충분히 효율적인 해결 방법입니다.
저작자표시 (새창열림)

'여러가지 > 알고리즘 & 자료구조' 카테고리의 다른 글

[프로그래머스] x만큼 간격이 있는 n개의 숫자  (0) 2024.10.13
[프로그래머스] 평균 구하기  (0) 2024.10.13
[프로그래머스] 뒤에서 5등까지  (0) 2024.10.12
[프로그래머스] 원소들의 곱과 합  (0) 2024.10.12
[프로그래머스] 마지막 두 원소  (0) 2024.10.12
'여러가지/알고리즘 & 자료구조' 카테고리의 다른 글
  • [프로그래머스] x만큼 간격이 있는 n개의 숫자
  • [프로그래머스] 평균 구하기
  • [프로그래머스] 뒤에서 5등까지
  • [프로그래머스] 원소들의 곱과 합
hyeseong-dev
hyeseong-dev
안녕하세요. 백엔드 개발자 이혜성입니다.
  • hyeseong-dev
    어제 오늘 그리고 내일
    hyeseong-dev
  • 전체
    오늘
    어제
    • 분류 전체보기 (282)
      • 여러가지 (107)
        • 알고리즘 & 자료구조 (72)
        • 오류 (4)
        • 이것저것 (29)
        • 일기 (1)
      • 프레임워크 (39)
        • 자바 스프링 (39)
        • React Native (0)
      • 프로그래밍 언어 (38)
        • 파이썬 (30)
        • 자바 (3)
        • 스프링부트 (5)
      • 운영체제 (0)
      • DB (17)
        • SQL (0)
        • Redis (17)
      • 클라우드 컴퓨팅 (2)
        • 도커 (2)
        • AWS (0)
      • 스케쥴 (65)
        • 세미나 (0)
        • 수료 (0)
        • 스터디 (24)
        • 시험 (41)
      • 트러블슈팅 (1)
      • 자격증 (0)
        • 정보처리기사 (0)
      • 재태크 (4)
        • 암호화폐 (4)
        • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    FastAPI
    시험
    reactor
    docker
    Spring WebFlux
    spring
    celery
    그리디
    Spring Boot
    DP
    OOP
    java
    RDS
    완전탐색
    Docker-compose
    항해99
    EC2
    백준
    ecs
    프로그래머스
    mybatis
    자바
    파이썬
    #개발자포트폴리오 #개발자이력서 #개발자취업 #개발자취준 #코딩테스트 #항해99 #취리코 #취업리부트코스
    AWS
    Redis
    Python
    취업리부트
    SAA
    WebFlux
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
hyeseong-dev
[프로그래머스] 나머지가 1이되는 수 찾기
상단으로

티스토리툴바