728x90
반응형

📝문제

더보기

1. 문제 설명

 고객의 약관 동의를 얻어서 수집된 1 ~ n번으로 분류되는 개인정보 n개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.

 

 예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.

당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.

 

모든 달은 28일까지 있다고 가정합니다.

 

다음은 오늘 날짜가 2022.05.19일 때의 예시입니다.

약관 종류 유효기간
A 6 달
B 12 달
C 3 달
 번호 개인정보 수집 일자 약관 종류
1 2021.05.02 A
2 2021.07.01 B
3 2022.02.19 C
4 2022.02.20 C
  • 첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.

따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.

 

 오늘 날짜를 의미하는 문자열 today, 약관의 유효기간을 담은 1차원 문자열 배열 terms와 수집된 개인정보의 정보를 담은 1차원 문자열 배열 privacies가 매개변수로 주어집니다. 이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요.


2. 제한사항

  • today는 "YYYY.MM.DD" 형태로 오늘 날짜를 나타냅니다.
  • 1 ≤ terms의 길이 ≤ 20
    • terms의 원소는 "약관 종류 유효기간" 형태의 약관 종류와 유효기간을 공백 하나로 구분한 문자열입니다.
    • 약관 종류는 A~Z중 알파벳 대문자 하나이며, terms 배열에서 약관 종류는 중복되지 않습니다.
    • 유효기간은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.
  • 1 ≤ privacies의 길이 ≤ 100
    • privacies[i]는 i+1번 개인정보의 수집 일자와 약관 종류를 나타냅니다.
    • privacies의 원소는 "날짜 약관 종류" 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다.
    • 날짜는 "YYYY.MM.DD" 형태의 개인정보가 수집된 날짜를 나타내며, today 이전의 날짜만 주어집니다.
    • privacies의 약관 종류는 항상 terms에 나타난 약관 종류만 주어집니다.
  • today와 privacies에 등장하는 날짜의 YYYY는 연도, MM은 월, DD는 일을 나타내며 점(.) 하나로 구분되어 있습니다.
    • 2000 ≤ YYYY ≤ 2022
    • 1 ≤ MM ≤ 12
    • MM이 한 자릿수인 경우 앞에 0이 붙습니다.
    • 1 ≤ DD ≤ 28
    • DD가 한 자릿수인 경우 앞에 0이 붙습니다.
  • 파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.

3. 입출력 예

today terms privacies result
"2022.05.19" ["A 6", "B 12", "C 3"] ["2021.05.02 A", "2021.07.01 B", "2022.02.19 C", "2022.02.20 C"] [1, 3]
"2020.01.01" ["Z 3", "D 5"] ["2019.01.01 D", "2019.11.15 Z", "2019.08.02 D", "2019.07.01 D", "2018.12.28 Z"] [1, 4, 5]

4. 입출력 예 설명

  • 입출력 예 #1
    문제 예시와 같습니다.

  • 입출력 예 #2
약관 종류 유효기간
Z 3 달
D 5 달
번호 개인정보 수집 일자 약관 종류
1 2019.01.01 D
2 2019.11.15 Z
3 2019.08.02 D
4 2019.07.01 D
5 2018.12.28 Z

 

오늘 날짜는 2020년 1월 1일입니다.

  • 첫 번째 개인정보는 D약관에 의해 2019년 5월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 두 번째 개인정보는 Z약관에 의해 2020년 2월 14일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 세 번째 개인정보는 D약관에 의해 2020년 1월 1일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.
  • 네 번째 개인정보는 D약관에 의해 2019년 11월 28일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.
  • 다섯 번째 개인정보는 Z약관에 의해 2019년 3월 27일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.

📝 작성한 코드 

terms의 약관 종류와 privacies의 약관 종류가 같은 값을 찾고 해당 privacies 값의 수집된 날짜가 오늘의 날짜 + terms의 유효기간 이내인지 확인한다. 유효기간이 지났으면 폐기한다.

import java.util.*;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

class Solution {
    public int[] solution(String today, String[] terms, String[] privacies) {
       List<Integer> answerList = new ArrayList<>();
       DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");

        for (int j = 0 ; j < terms.length; j++){            
            for (int k = 0 ; k < privacies.length; k++){
                if (terms[j].charAt(0) == privacies[k].charAt(11)) {
                    LocalDate date = LocalDate.parse(privacies[k].substring(0, 10), formatter);
                    int monthsToAdd = Integer.parseInt(terms[j].replaceAll("[^0-9]", ""));
      
                    // System.out.println("Adding months: " + monthsToAdd);
    
                    LocalDate resultDate = date.plusMonths(monthsToAdd);
                    String resultStr = resultDate.format(formatter);
                    // System.out.println(resultStr);
                    
                        if (today.compareTo(resultStr) >= 0) {
                        int index = k + 1;
                        answerList.add(index);
                        // System.out.println(index);
                    }
                }
            }
        }
        int[] answer = answerList.stream().mapToInt(Integer::intValue).toArray();
        Arrays.sort(answer);

        return answer;
    }
}

 

< 코드 설명 >

  • List<Integer> answerList = new ArrayList<>();
    answerList라는 이름의 ArrayList를 생성한다. 이 리스트에는 조건을 만족하는 index 값들이 추가된다.
  • DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd");
    날짜 형식을 지정
  •  for (int j = 0 ; j < terms.length; j++){
    terms 배열의 각 요소(terms[j])에 대해 다음을 수행
  • for (int k = 0 ; k < privacies.length; k++){
    privacies 배열의 각 요소(privacies[k])에 대해 다음을 수행
  • if (terms[j].charAt(0) == privacies[k].charAt(11)) {
    만약 terms의 현재 요소의 첫 번째 문자(terms[j].charAt(0))와 privacies의 현재 요소의 12번째 문자(privacies[k].charAt(11))가 같다면 다음을 수행
  • LocalDate date = LocalDate.parse(privacies[k].substring(0, 10), formatter);
    현재 privacies 요소의 첫 10자(privacies[k].substring(0, 10))를 날짜로 변환한다. 이 날짜는 앞서 생성한 DateTimeFormatter를 사용하여 LocalDate 객체로 파싱된다.
  • int monthsToAdd = Integer.parseInt(terms[j].replaceAll("[^0-9]", ""));
    Terms의 현재 요소에서 숫자만 추출하여 monthsToAdd에 저장한다. 이를 위해 정규 표현식을 사용하여 숫자가 아닌 문자를 제거하고, 남은 숫자 문자열을 정수로 변환한다.
  • LocalDate resultDate = date.plusMonths(monthsToAdd);
    추출한 월 수(monthsToAdd)를 현재 날짜(date)에 더한다.
  • String resultStr = resultDate.format(formatter);
    더한 날짜(resultDate)를 다시 문자열 형태로 변환(resultStr)한다.
  • if (today.compareTo(resultStr) >= 0) {
    today가 resultStr보다 크거나 같은지를 확인하는 조건이다. 
    • A.compareTo(B) : A.compareTo(B)는 A와 B를 비교하는 메서드
      →  A가 B보다 작으면 음수 값을 반환
      →  A가 B와 같으면 0을 반환
      →  A가 B보다 크면 양수 값을 반환
      →  이 메서드를 사용하여 날짜를 비교할 때, 반환된 값을 기반으로 조건문을 작성할 수 있다.
  •  int index = k + 1; answerList.add(index);
    만약 today가 resultStr보다 이후라면, 현재 privacies 요소의 인덱스(k + 1)를 answerList에 추가한다. 이 인덱스는 privacies 배열에서 0부터 시작하므로, 실제 인덱스는 k + 1이 된다.
  • int[] answer = answerList.stream().mapToInt(Integer::intValue).toArray();
    Stream API를 사용하여 answerList라는 Integer 객체의 ArrayList를 int 형태의 배열로 변환하는 과정을 나타낸다.
    • answerList.stream() : answerList를 Stream 형태로 변환한다. Stream은 데이터의 흐름을 나타내며, 다양한 연산(필터링, 매핑, 정렬 등)을 수행할 수 있다.
    • .mapToInt(Integer::intValue) : Stream 내의 각 요소를 int 형태로 변환한다. Integer::intValue는 Integer 객체를 int 형태로 변환하는 메서드 참조이다. 즉, 이 코드는 answerList의 각 Integer 요소를 int 형태로 변환하는 매핑 연산을 수행한다.
    • .toArray() : Stream을 배열로 변환한다. mapToInt에 의해 생성된 IntStream (int 요소의 Stream)은 toArray를 호출하면 int 배열로 변환된다.
728x90
반응형
728x90
반응형

문제 1 - 자동차 대여 기록에서 장기/단기 대여 구분하기

1. 문제 

https://school.programmers.co.kr/learn/courses/30/lessons/151138

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

  • DATEDIFF () : 두개의 날짜값의 차이를 int로 반환하는 내장함수이다.
  • 마자막 날짜에서 시작 날짜의 차이를 구하면 하루를 포함하지 않는 값이 나오므로 +1 해줘야 한다.
SELECT HISTORY_ID
        , CAR_ID
        , DATE_FORMAT(START_DATE, "%Y-%m-%d") AS START_DATE
        , DATE_FORMAT(END_DATE, "%Y-%m-%d") AS END_DATE
        , (CASE 
            WHEN (DATEDIFF(END_DATE, START_DATE) + 1) >= 30 THEN "장기 대여"
            ELSE "단기 대여"
            END) as RENT_TYPE
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
where START_DATE like '2022-09%'
order by HISTORY_ID desc

 

문제 2 - 특정 옵션이 포함된 자동차 리스트 구하기

1. 문제 

https://school.programmers.co.kr/learn/courses/30/lessons/157343

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS
from CAR_RENTAL_COMPANY_CAR
where OPTIONS LIKE '%네비게이션%'
order by CAR_ID DESC

 

문제 3 - 과일로 만든 아이스크림 고르기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/133025

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT A.FLAVOR
FROM FIRST_HALF A, ICECREAM_INFO B
WHERE (A.FLAVOR = B.FLAVOR 
       AND B.INGREDIENT_TYPE = "fruit_based"
 AND A.TOTAL_ORDER > 3000)
ORDER BY A.TOTAL_ORDER DESC

 

문제 4 - 인기있는 아이스크림

1. 문제 

https://school.programmers.co.kr/learn/courses/30/lessons/133024

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT FLAVOR
FROM FIRST_HALF
ORDER BY TOTAL_ORDER DESC, SHIPMENT_ID

 

문제 5 - 흉부외과 또는 일반외과 의사 목록 출력하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/132203

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT DR_NAME
        , DR_ID
        , MCDP_CD
        , DATE_FORMAT(HIRE_YMD, '%Y-%m-%d') AS HIRE_YMD
FROM DOCTOR
where MCDP_CD IN ("CS", "GS")
order by HIRE_YMD desc, DR_NAME

 

문제 6 - 12세 이하인 여자 환자 목록 출력하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/132201

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT PT_NAME,	PT_NO, GEND_CD,	AGE, IFNULL(TLNO, "NONE") AS TLNO
FROM PATIENT
WHERE GEND_CD = "W"
    AND AGE <= 12
ORDER BY AGE DESC, PT_NAME

 

문제 7 - 가장 비싼 상품 구하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131697

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT

 

문제 8 - 조건에 맞는 회원수 구하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131697

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE JOINED LIKE "2021%"
    AND AGE BETWEEN 20 AND 29

 

문제 9 - 나이 정보가 없는 회원 수 구하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131528

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT COUNT(USER_ID) AS USERS
FROM USER_INFO
WHERE AGE IS NULL

 

문제 10 - 경기도에 위치한 식품창고 목록 출력하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131114

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT WAREHOUSE_ID, WAREHOUSE_NAME, ADDRESS, IFNULL(FREEZER_YN, "N")
FROM FOOD_WAREHOUSE
WHERE ADDRESS LIKE "경기도%"
ORDER BY  WAREHOUSE_ID

 

문제 11 - 강원도에 위치한 생산공장 목록 출력하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/131112

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT FACTORY_ID, FACTORY_NAME, ADDRESS
FROM FOOD_FACTORY
WHERE ADDRESS LIKE "강원도%"
ORDER BY FACTORY_ID

 

문제 12 - 경기도에 위치한 식품창고 목록 출력하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59415

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT MAX(DATETIME) AS 시간
FROM ANIMAL_INS

 

문제 13 - 이름이 있는 동물의 아이디

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59407

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
ORDER BY ANIMAL_ID

 

문제 14 - 상위 n개 레코드

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59405

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

  • MySQL에서 상위 N개의 데이터를 출력하기 위해선 LIMIT N 함수를 사용한다.
  • ORACLE : ROWNUM < N
  • MS - SQL : TOP N, TOP N WITH TIES 
SELECT NAME
FROM ANIMAL_INS
ORDER BY DATETIME
LIMIT 1

 

문제 15 - 여러 기준으로 정렬하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59404

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID, NAME, DATETIME
FROM ANIMAL_INS
ORDER BY NAME, DATETIME DESC

 

문제 16 - 동물의 아이디와 이름

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59403

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID

 

문제 17- 이름이 없는 동물의 아이디

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59039

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID
FROM ANIMAL_INS
WHERE NAME IS NULL
ORDER BY ANIMAL_ID

 

문제 18 - 어린 동물 찾기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59037#fn1

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID, NAME
FROM ANIMAL_INS
WHERE INTAKE_CONDITION != "Aged"
ORDER BY ANIMAL_ID

 

문제 19 - 아픈 동물 찾기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59036

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID, NAME
from ANIMAL_INS
where INTAKE_CONDITION = "Sick"
order by ANIMAL_ID

 

문제 20 - 역순 정렬하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59035

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT NAME, DATETIME
FROM ANIMAL_INS
ORDER BY ANIMAL_ID DESC

 

문제 21 - 모든 레코드 조회하기

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/59034

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 작성한 코드

SELECT ANIMAL_ID
        , ANIMAL_TYPE
        , DATETIME
        , INTAKE_CONDITION
        , NAME
        , SEX_UPON_INTAKE
FROM ANIMAL_INS
ORDER BY ANIMAL_ID
728x90
반응형
728x90
반응형

📝 문제

더보기

1. 문제 설명

 코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.

  • 원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
  • 한 번 사용한 카드는 다시 사용할 수 없습니다.
  • 카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
  • 기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.

예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.

문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.


2. 제한사항

  • 1 ≤ cards1의 길이, cards2의 길이 ≤ 10
    • 1 ≤ cards1[i]의 길이, cards2[i]의 길이 ≤ 10
    • cards1과 cards2에는 서로 다른 단어만 존재합니다.
  • 2 ≤ goal의 길이 ≤ cards1의 길이 + cards2의 길이
    • 1 ≤ goal[i]의 길이 ≤ 10
    • goal의 원소는 cards1과 cards2의 원소들로만 이루어져 있습니다.
  • cards1cards2goal의 문자열들은 모두 알파벳 소문자로만 이루어져 있습니다.

3. 입출력 예

cards1 cards2 goal result
["i", "drink", "water"] ["want", "to"] ["i", "want", "to", "drink", "water"] "Yes"
["i", "water", "drink"] ["want", "to"] ["i", "want", "to", "drink", "water"] "No"

 


4. 입출력 예 설명

  • 입출력 예 #1
     본문과 같습니다.
  • 입출력 예 #2
     cards1에서 "i"를 사용하고 cards2에서 "want"와 "to"를 사용하여 "i want to"까지는 만들 수 있지만 "water"가 "drink"보다 먼저 사용되어야 하기 때문에 해당 문장을 완성시킬 수 없습니다. 따라서 "No"를 반환합니다.

📝 작성한 코드

 처음엔 HaspMap을 써보려다 실패하고 작성한 코드인데, 다른 분들이 작성한 걸 보니 HashMap을 써서 푸신 분이 꽤나 있었다. 이 외에도 Queue(큐)라는 클래스를 사용하신 분들이 많았다. 큐는 선입선출법의 성격을 지닌 자료구조라고 한다. 문제의 조건에서 카드 뭉치를 순서대로 한장 씩 사용한다고 했으므로, 큐의 성격을 이용하여 문제를 풀어보면 좋을 것 같다.
 
 내가 작성한 코드는 간단히 for문을 돌려 진행되는 코드이다. 처음에는 goal[i]와 cards[i]를 비교해보면 된다고 생각했는데, 인덱스범위 오류가 나는 걸 보고 cards의 길이는 goal의 길이보다 작다는 것을 깨달았다. 그래서 cards의 인덱스 값을 따로 변수 (card1Index)로 주고 cards1[card1Index]이 goal에 들어있는 값과 일치하면 그 인덱스에 해당하는 cards의 값은 다시 사용할 수 없도록 +1을 해주었다. 그리고 answer의 초기값을 Yes로 설정해두고 if문의 조건1과 2가 제대로 실행되않으면 No를 반환하도록 하였다.
 

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "Yes";
        int card1Index = 0;
        int card2Index = 0;
 
        for (int i = 0; i < goal.length; i++) {
            if (card1Index < cards1.length && cards1[card1Index].equals(goal[i])){
                card1Index++;
            }
            else if(card2Index < cards2.length && cards2[card2Index].equals(goal[i])){
                card2Index++;
            }
            else {
                answer = "No";
            }
        }    
                 
        return answer;
    }
}

 

📝 공부해 볼 코드

Queue(큐)를 사용한 코드.
큐는 데이터를 일시적으로 쌓아두기 위한 자료구조로 스택과는 다르게 FIFO(First In First Out)의 형태를 가진다. FIFO 형태는 뜻 그대로 먼저 들어온 데이터가 가장 먼저 나가는 선입선출을 의미한다.
 
<코드 설명>

  1. Queue<String> queue1 및 Queue<String> queue2를 생성하고, 각각 cards1 및 cards2 배열을 큐로 변환하여 초기화
  2. for (String g : goal) 루프를 통해 목표 배열을 순회한다. 루프 내에서는 peek()라는 메서드를 통해 현재 목표 g가 queue1 또는 queue2의 맨 앞에 있는 카드와 일치하는지 확인한다.
  3. * queue.peek(); // queue의 첫번째 값 참조
  4. 만약 g가 queue1의 맨 앞에 있는 카드와 일치한다면, queue1.poll()를 사용하여 큐에서 해당 카드를 제거한다. 이어서 continue 키워드를 사용하여 다음 목표로 이동한다.
  5. * queue.poll(); // queue에 첫번째 값을 반환하고 제거 비어있다면 null
  6. 만약 g가 queue2의 맨 앞에 있는 카드와 일치한다면, queue2.poll()를 사용하여 큐에서 해당 카드를 제거한다. 이어서 continue 키워드를 사용하여 다음 목표로 이동한다.
  7. 만약 g가 어느 큐에도 일치하지 않는다면, "No"를 반환하며 프로그램을 종료시킨다
  8. 모든 목표를 순회한다면, "Yes"를 반환한다.
import java.util.*;

class Solution {
    public String solution(String[] cards1, String[] cards2, String[] goal) {
        String answer = "";

        Queue<String> queue1 = new LinkedList<>(Arrays.asList(cards1));
        Queue<String> queue2 = new LinkedList<>(Arrays.asList(cards2));

        for (String g : goal) {
            if (g.equals(queue1.peek())) {
                queue1.poll();
                continue;
            } else if (g.equals(queue2.peek())) {
                queue2.poll();
                continue;
            }
            return "No";
        }

        return "Yes";
    }
}

 

Queue(큐) 참고 주소
https://coding-factory.tistory.com/602

728x90
반응형
728x90
반응형

📝문제

더보기

1. 문제 설명

과일 장수가 사과 상자를 포장하고 있습니다. 사과는 상태에 따라 1점부터 k점까지의 점수로 분류하며, k점이 최상품의 사과이고 1점이 최하품의 사과입니다. 사과 한 상자의 가격은 다음과 같이 결정됩니다.

  • 한 상자에 사과를 m개씩 담아 포장합니다.
  • 상자에 담긴 사과 중 가장 낮은 점수가 p (1 ≤ p ≤ k)점인 경우, 사과 한 상자의 가격은 p * m 입니다.

과일 장수가 가능한 많은 사과를 팔았을 때, 얻을 수 있는 최대 이익을 계산하고자 합니다.(사과는 상자 단위로만 판매하며, 남는 사과는 버립니다)

예를 들어, k = 3, m = 4, 사과 7개의 점수가 [1, 2, 3, 1, 2, 3, 1]이라면, 다음과 같이 [2, 3, 2, 3]으로 구성된 사과 상자 1개를 만들어 판매하여 최대 이익을 얻을 수 있습니다.

  • (최저 사과 점수) x (한 상자에 담긴 사과 개수) x (상자의 개수) = 2 x 4 x 1 = 8

사과의 최대 점수 k, 한 상자에 들어가는 사과의 수 m, 사과들의 점수 score가 주어졌을 때, 과일 장수가 얻을 수 있는 최대 이익을 return하는 solution 함수를 완성해주세요.

제한사항

  • 3 ≤ k ≤ 9
  • 3 ≤ m ≤ 10
  • 7 ≤ score의 길이 ≤ 1,000,000
    • 1 ≤ score[i] ≤ k
  • 이익이 발생하지 않는 경우에는 0을 return 해주세요.

2. 입출력 예

k m score result
3 4 [1, 2, 3, 1, 2, 3, 1] 8
4 3 [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 33

3. 입출력 예 설명

  • 입출력 예 #1
    문제의 예시와 같습니다.

  • 입출력 예 #2
    다음과 같이 사과 상자를 포장하여 모두 팔면 최대 이익을 낼 수 있습니다.
사과 상자가격
[1, 1, 2] 1 x 3 = 3
[2, 2, 2] 2 x 3 = 6
[4, 4, 4] 4 x 3 = 12
[4, 4, 4] 4 x 3 = 12

따라서 (1 x 3 x 1) + (2 x 3 x 1) + (4 x 3 x 2) = 33을 return합니다.

📝작성한 코드

1. 처음 작성한 코드

 과일장수가 최대의 이익을 얻기 위해선 m만큼 과일을 담을 때 담아지는 과일의 수가 딱 떨어지지 않아 1상자를 완성하지 못하고 남아버릴 경우 남아진 과일은 점수가 낮은 과일이여야 하므로 가장 점수가 높은 과일부터  담아져야 한다. 가격을 계산 할 때는 한 상자에 같은 점수의 과일이 담아져 있지 않은 경우 그 상자에서 가장 점수가 낮은 과일을 기준으로 가격을 계산해야 한다. 그렇기 때문에 점수를 오름차순으로 정렬하여 가장 첫번째 과일의 점수로 1상자의 가격을 계산해야 한다.

  • Arrays.sort(score) : score에서 큰 수 부터 차례대로 뽑아오기 위해 오름차순으로 정렬하였다.
  • for문 : score의 값들을 차례대로 뽑아오면서 계산을 하기 위해 for문을 작성했다. k = 4, m = 3, score = [4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2] 라고 생각해보면 i의 처음 값은 -3이며 이 값은  -score.length보다 크거나 같으므로 -12보다 작아 질 수 없다. for문이 돌아가면 score[-3]인 4가 m인 3과 곱해지고 12라는 값이 answer에 들어간다. for문이 실행됐으니까 i -= m 이 실행 되면서 i는 -6이 된다.

하지만 실행하면 ArrayIndexOutOfBoundsException 오류가 떴다. 이 오류는 배열 인덱스가 배열 길이를 벗어나는 경우에 발생한다. 오류 메시지에서 "Index -3 out of bounds for length 12"가 나오는데, 이는 배열의 길이가 12이고 인덱스 -3에 접근하려고 하고 있다는 것을 의미한다. 

 즉, 자바에서 배열의 인덱스에 접근할 때 음수 사용이 불가능 하다는 것이다. 배열 인덱스는 음이 아닌 정수여야 한다. 그러나 나는  for문에서 i를 -m으로 주면서 score[-3]라는 코드가 나왔기 때문에 오류가 났던 것이다.

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        Arrays.sort(score); 
        // System.out.println(Arrays.toString(score));   
        	// [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]
       
        for (int i = -m; i >= -score.length; i -= m){           
             answer += score[i] * m ;
        }
        
        return answer;
    }
}

 

2. 수정한 코드

 수정한 코드에서는 i를  score.length로 주었다. k = 4, m = 3, score =[4, 1, 2, 2, 4, 4, 4, 4, 1, 2, 4, 2]라고 생각해보면 i의 초기값은 12이고 i >= m만큼 반복 하므로 i는 3보다 크거나 같을 때까지 반복한다. for문이 실행되면 score[9] 인 4에 m인 3이 곱해져  12라는 값이 answer에 들어간다. for문이 실행됐으니까 i -= m 이 실행 되면서 i는 9가 된다.

 이렇게 조건을 주면 배열의 인덱스에 음수를 넣지 않고도 원하는 값을 가져올 수 있다.

import java.util.*;

class Solution {
    public int solution(int k, int m, int[] score) {
        int answer = 0;
        Arrays.sort(score); 
        // System.out.println(Arrays.toString(score));   
        	// [1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4]

        for(int i = score.length; i >= m; i -= m){
             answer += score[i - m] * m;
        }
 
        return answer;
    }
}

728x90
반응형
728x90
반응형

📝문제 1 - 평균 일일 대여 요금 구하기

더보기

1. 문제 설명

다음은 어느 자동차 대여 회사에서 대여중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며 CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

Column name  Type  Nullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: '열선시트', '스마트키', '주차감지센서')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.


2. 문제

CAR_RENTAL_COMPANY_CAR 테이블에서 자동차 종류가 'SUV'인 자동차들의 평균 일일 대여 요금을 출력하는 SQL문을 작성해주세요. 이때 평균 일일 대여 요금은 소수 첫 번째 자리에서 반올림하고, 컬럼명은 AVERAGE_FEE 로 지정해주세요.


3. 예시

예를 들어 CAR_RENTAL_COMPANY_CAR 테이블이 다음과 같다면

CAR_ID CAR_TYPE DAILY_FEE OPTIONS
1 세단 16000 가죽시트,열선시트,후방카메라
2 SUV 14000 스마트키,네비게이션,열선시트
3 SUV 22000 주차감지센서,후방카메라,가죽시트

 

'SUV' 에 해당하는 자동차들의 평균 일일 대여 요금은 18,000 원 이므로, 다음과 같은 결과가 나와야 합니다.

AVERAGE_FEE
18000

✏️ 작성한 코드

SELECT ROUND(AVG(DAILY_FEE)) as AVERAGE_FEE
from CAR_RENTAL_COMPANY_CAR
where CAR_TYPE = 'SUV'
GROUP BY CAR_TYPE;

 

📝문제 2 - 조건에 맞는 도서 리스트 출력하기

더보기

1. 문제 설명

다음은 어느 한 서점에서 판매중인 도서들의 도서 정보(BOOK) 테이블입니다. BOOK 테이블은 각 도서의 정보를 담은 테이블로 아래와 같은 구조로 되어있습니다.

Column name Type Nullable Description
BOOK_ID INTEGER FALSE 도서 ID
CATEGORY VARCHAR(N) FALSE 카테고리 (경제, 인문, 소설, 생활, 기술)
AUTHOR_ID INTEGER FALSE 저자 ID
PRICE INTEGER FALSE 판매가 (원)
PUBLISHED_DATE DATE FALSE 출판일

2. 문제

BOOK 테이블에서 2021년에 출판된 '인문' 카테고리에 속하는 도서 리스트를 찾아서 도서 ID(BOOK_ID), 출판일 (PUBLISHED_DATE)을 출력하는 SQL문을 작성해주세요.결과는 출판일을 기준으로 오름차순 정렬해주세요.


3. 예시

예를 들어 BOOK 테이블이 다음과 같다면

BOOK_ID CATEGORY AUTHOR_ID PRICE PUBLISHED_DATE
1 인문 1 10000 2020-01-01
2 경제 2 9000 2021-02-05
3 인문 2 11000 2021-04-11
4 인문 3 10000 2021-03-15
5 생활 1 12000 2021-01-10

 

조건에 속하는 도서는 도서 ID 가 3, 4인 도서이므로 다음과 같습니다.

BOOK_ID PUBLISHED_DATE
3 2021-04-11
4 2021-03-15

 

그리고 출판일 오름차순으로 정렬하여야 하므로 다음과 같은 결과가 나와야 합니다.

BOOK_ID PUBLISHED_DATE
4 2021-03-15
3 2021-04-11

4. 주의사항

PUBLISHED_DATE의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.

✏️ 작성한 코드

SELECT BOOK_ID
	, DATE_FORMAT(PUBLISHED_DATE, '%Y-%m-%d') as PUBLISHED_DATE
from BOOK
where PUBLISHED_DATE like '2021%'
    AND CATEGORY = '인문'
order by PUBLISHED_DATE;

 

728x90
반응형
728x90
반응형

📝 문제

더보기

1. 문제 설명

코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.

컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 wallpaper가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 ".", 파일이 있는 칸은 "#"의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.

  • 드래그는 바탕화면의 격자점 S(lux, luy)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(rdxrdy)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, "점 S에서 점 E로 드래그한다"고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.
  • 점 S(luxluy)에서 점 E(rdxrdy)로 드래그를 할 때, "드래그 한 거리"는 |rdx lux| + |rdy luy|로 정의합니다.
  • 점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.

예를 들어 wallpaper = [".#...", "..#..", "...#."]인 바탕화면을 그림으로 나타내면 다음과 같습니다

이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.

(0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.

 

머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 wallpaper가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 solution 함수를 작성해 주세요. 드래그의 시작점이 (lux, luy), 끝점이 (rdx, rdy)라면 정수 배열 [lux, luy, rdx, rdy]를 return하면 됩니다.


2. 제한사항

  • 1 ≤ wallpaper의 길이 ≤ 50
  • 1 ≤ wallpaper[i]의 길이 ≤ 50
    wallpaper의 모든 원소의 길이는 동일합니다.
  • wallpaper[i][j]는 바탕화면에서 i + 1행 j + 1열에 해당하는 칸의 상태를 나타냅니다.
  • wallpaper[i][j]는 "#" 또는 "."의 값만 가집니다.
  • 바탕화면에는 적어도 하나의 파일이 있습니다.
  • 드래그 시작점 (luxluy)와 끝점 (rdxrdy)는 lux rdxluy rdy를 만족해야 합니다.

3. 입출력 예

wallpaper result
[".#...", "..#..", "...#."] [0, 1, 3, 4]
["..........", ".....#....", "......##..", "...##.....", "....#....."] [1, 3, 5, 8]
[".##...##.", "#..#.#..#", "#...#...#", ".#.....#.", "..#...#..", "...#.#...", "....#...."] [0, 0, 7, 9]
["..", "#."] [1, 0, 2, 1]

 

4. 입출력 예

  • 입출력 예 #1
     문제 설명의 예시와 같은 예제입니다. (0, 1)에서 (3, 4)로 드래그 하면 모든 파일을 선택할 수 있고 드래그 한 거리는 6이었고, 6보다 적은 거리로 모든 파일을 선택하는 방법은 없습니다. 따라서 [0, 1, 3, 4]를 return합니다.

  • 입출력 예 #2
     예제 2번의 바탕화면은 다음과 같습니다.(1, 3)에서 (5, 8)로 드래그하면 모든 파일을 선택할 수 있고 이보다 적은 이동거리로 모든 파일을 선택하는 방법은 없습니다. 따라서 가장 적은 이동의 드래그로 모든 파일을 선택하는 방법인 [1, 3, 5, 8]을 return합니다.

 

  • 입출력 예 #3
     예제 3번의 바탕화면은 다음과 같습니다.모든 파일을 선택하기 위해선 바탕화면의 가장 왼쪽 위 (0, 0)에서 가장 오른쪽 아래 (7, 9)로 드래그 해야만 합니다. 따라서 [0, 0, 7, 9]를 return합니다.

 

  • 입출력 예 #4
     예제 4번의 바탕화면은 다음과 같이 2행 1열에만 아이콘이 있습니다.이를 드래그로 선택하기 위해서는 그 칸의 왼쪽 위 (1, 0)에서 오른쪽 아래 (2, 1)로 드래그 하면 됩니다. (1, 0)에서 (2, 2)로 드래그 해도 아이콘을 선택할 수 있지만 이전보다 이동거리가 늘어납니다. 따라서 [1, 0, 2, 1]을 return합니다.

✏️작성한 코드

코드 풀이를 해보자.

일단 X, Y를 행과 열로 생각한다.

  •  int[] X = new int[wallpaper.length]; 
    wallpaper 배열에 들어가 있는 값의 길이 만큼 X, Y도 출력되서 나오므로 X, Y를 wallpaper 만큼의 길이를 가진 리스트로 설정했다.
  • int xMin = Integer.MAX_VALUE;
    X, Y에 들어간 값 중 행의 최솟값과 행의 최댓값, 열의 최솟값과 열의 최댓값을 찾아야 하므로 각각을 변수로 설정한다.  Integer.MAX_VALUE는 JAVA에서의 정수 최댓값을 의미하기 때문에 최솟값을 구하려고 할 때 MAX_VALUE와 비교해야 한다.

  • for 문
    중첩된 루프를 사용하여 wallpaper 배열을 순회하면서 '#' 문자를 찾고, 해당 위치의 행과 열을 XY 배열에 저장하고 최솟값과 최댓값을 업데이트합니다.

  •  Math.min(A, X[i])
    Math.min(a, b)은 두 인자 값 중 작은 값을 리턴한다. 즉, A가 Integer.MAX_VALUE 이므로 X[i]이 그보다 더 클 수 없다. 그러므로 처음 들어오는 X[i]의 값이 A로 리턴되면서 새로 들어오는 X[i]과 비교하여 최소값을 반환하게 된다.

  • xMax = Math.max(C, X[i]+1);
    Max 값에 1을 더해준 이유는 파일이 교차되는 점에 위치해 있는게 아닌 한 개의 구역을 차지하고 있기 때문에 드래그 했을 때 마지막 위치가 구역의 시작이 아닌 마지막이므로 1을 더 해줘야 해야 한다.
class Solution {
    public int[] solution(String[] wallpaper) {
        int[] X = new int[wallpaper.length]; 
        int[] Y = new int[wallpaper.length];

        int xMin = Integer.MAX_VALUE;
        int yMin = Integer.MAX_VALUE;
        int xMax = Integer.MIN_VALUE;
        int yMax = Integer.MIN_VALUE;

        for (int i = 0; i < wallpaper.length; i++) {
            for (int j = 0; j < wallpaper[i].length(); j++) {
                if (wallpaper[i].charAt(j) == '#') {
                    X[i] = i;
                    Y[i] = j;

                    xMin = Math.min(A, X[i]);
                    yMin = Math.min(B, Y[i]);
                    xMax = Math.max(C, X[i]+1);
                   	yMax = Math.max(D, Y[i]+1);
                }
            }
        }

        int[] answer = {xMin, yMin, xMax, yMax};
        return answer;
    }
}

 
728x90
반응형

+ Recent posts