Programmers #30

μ΄κ°•μš©Β·2023λ…„ 8μ›” 3일
0

Programmers

λͺ©λ‘ 보기
29/58

μ‹€νŒ¨μœ¨

πŸ“‘ λ¬Έ1) 슈퍼 κ²Œμž„ 개발자 μ˜€λ λ¦¬λŠ” 큰 고민에 λΉ μ‘Œλ‹€. κ·Έλ…€κ°€ λ§Œλ“  ν”„λžœμ¦ˆ μ˜€μ²œμ„±μ΄ λŒ€μ„±κ³΅μ„ κ±°λ’€μ§€λ§Œ, μš”μ¦˜ μ‹ κ·œ μ‚¬μš©μžμ˜ μˆ˜κ°€ κΈ‰κ°ν•œ 것이닀. 원인은 μ‹ κ·œ μ‚¬μš©μžμ™€ κΈ°μ‘΄ μ‚¬μš©μž 사이에 μŠ€ν…Œμ΄μ§€ 차이가 λ„ˆλ¬΄ 큰 것이 λ¬Έμ œμ˜€λ‹€.

이 문제λ₯Ό μ–΄λ–»κ²Œ ν• κΉŒ κ³ λ―Ό ν•œ κ·Έλ…€λŠ” λ™μ μœΌλ‘œ κ²Œμž„ μ‹œκ°„μ„ λŠ˜λ €μ„œ λ‚œμ΄λ„λ₯Ό μ‘°μ ˆν•˜κΈ°λ‘œ ν–ˆλ‹€. μ—­μ‹œ 슈퍼 개발자라 λŒ€λΆ€λΆ„μ˜ λ‘œμ§μ€ μ‰½κ²Œ κ΅¬ν˜„ν–ˆμ§€λ§Œ, μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” λΆ€λΆ„μ—μ„œ μœ„κΈ°μ— λΉ μ§€κ³  λ§μ•˜λ‹€. 였렐리λ₯Ό μœ„ν•΄ μ‹€νŒ¨μœ¨μ„ κ΅¬ν•˜λŠ” μ½”λ“œλ₯Ό μ™„μ„±ν•˜λΌ.

  • μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό 같이 μ •μ˜ν•œλ‹€.
    • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν–ˆμœΌλ‚˜ 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν•œ ν”Œλ ˆμ΄μ–΄μ˜ 수 / μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ ν”Œλ ˆμ΄μ–΄ 수

전체 μŠ€ν…Œμ΄μ§€μ˜ 개수 N, κ²Œμž„μ„ μ΄μš©ν•˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ λ©ˆμΆ°μžˆλŠ” μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κΈ΄ λ°°μ—΄ stagesκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μ‹€νŒ¨μœ¨μ΄ 높은 μŠ€ν…Œμ΄μ§€λΆ€ν„° λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μŠ€ν…Œμ΄μ§€μ˜ λ²ˆν˜Έκ°€ λ‹΄κ²¨μžˆλŠ” 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜λΌ.


μ œν•œμ‚¬ν•­

  • μŠ€ν…Œμ΄μ§€μ˜ 개수 N은 1 이상 500 μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ‹€.
  • stages의 κΈΈμ΄λŠ” 1 이상 200,000 μ΄ν•˜μ΄λ‹€.
  • stagesμ—λŠ” 1 이상 N + 1 μ΄ν•˜μ˜ μžμ—°μˆ˜κ°€ λ‹΄κ²¨μžˆλ‹€.
    • 각 μžμ—°μˆ˜λŠ” μ‚¬μš©μžκ°€ ν˜„μž¬ 도전 쀑인 μŠ€ν…Œμ΄μ§€μ˜ 번호λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
    • 단, N + 1 은 λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€(N 번째 μŠ€ν…Œμ΄μ§€) κΉŒμ§€ 클리어 ν•œ μ‚¬μš©μžλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.
  • λ§Œμ•½ μ‹€νŒ¨μœ¨μ΄ 같은 μŠ€ν…Œμ΄μ§€κ°€ μžˆλ‹€λ©΄ μž‘μ€ 번호의 μŠ€ν…Œμ΄μ§€κ°€ λ¨Όμ € μ˜€λ„λ‘ ν•˜λ©΄ λœλ‹€.
  • μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ μœ μ €κ°€ μ—†λŠ” 경우 ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ 0 으둜 μ •μ˜ν•œλ‹€.

μž…μΆœλ ₯ 예

Nstagesresult
5[2,1,2,6,2,4,3,3][3,4,2,1,5]
4[4,4,4,4,4][4,1,2,3]

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

1번 μŠ€ν…Œμ΄μ§€μ—λŠ” 총 8λͺ…μ˜ μ‚¬μš©μžκ°€ λ„μ „ν–ˆμœΌλ©°, 이 쀑 1λͺ…μ˜ μ‚¬μš©μžκ°€ 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν–ˆλ‹€. λ”°λΌμ„œ 1번 μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • 1 번 μŠ€ν…Œμ΄μ§€ μ‹€νŒ¨μœ¨ : 1/8

2번 μŠ€ν…Œμ΄μ§€μ—λŠ” 총 7λͺ…μ˜ μ‚¬μš©μžκ°€ λ„μ „ν–ˆμœΌλ©°, 이 쀑 3λͺ…μ˜ μ‚¬μš©μžκ°€ 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν–ˆλ‹€. λ”°λΌμ„œ 2번 μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • 2 번 μŠ€ν…Œμ΄μ§€ μ‹€νŒ¨μœ¨ : 3/7

λ§ˆμ°¬κ°€μ§€λ‘œ λ‚˜λ¨Έμ§€ μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • 3 번 μŠ€ν…Œμ΄μ§€ μ‹€νŒ¨μœ¨ : 2/4
  • 4번 μŠ€ν…Œμ΄μ§€ μ‹€νŒ¨μœ¨ : 1/2
  • 5번 μŠ€ν…Œμ΄μ§€ μ‹€νŒ¨μœ¨ : 0/1

각 μŠ€ν…Œμ΄μ§€μ˜ 번호λ₯Ό μ‹€νŒ¨μœ¨μ˜ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • [3,4,2,1,5]

μž…μΆœλ ₯ 예 #2

λͺ¨λ“  μ‚¬μš©μžκ°€ λ§ˆμ§€λ§‰ μŠ€ν…Œμ΄μ§€μ— μžˆμœΌλ―€λ‘œ 4번 μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ 1이며 λ‚˜λ¨Έμ§€ μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ€ 0이닀.

  • [4,1,2,3]

λ‚˜μ˜ 풀이

package programmers;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class FailureRate {
	
	 public static int[] solution(int N, int[] stages) {
		    int totalUsers = stages.length;
	        int[] stageUserCount = new int[N + 2];
	        
	        for (int stage : stages) {
	            stageUserCount[stage]++;
	        }
	        
	        Map<Integer, Double> stageFailRates = new HashMap<>();
	        for (int i = 1; i <= N; i++) {
	            if (totalUsers != 0) {
	                double failRate = (double) stageUserCount[i] / totalUsers;
	                stageFailRates.put(i, failRate);
	            } else {
	                stageFailRates.put(i, 0.0);
	            }
	            totalUsers -= stageUserCount[i];
	        }

	        List<Map.Entry<Integer, Double>> entryList = new ArrayList<>(stageFailRates.entrySet());
	        entryList.sort(Map.Entry.<Integer, Double>comparingByValue().reversed().thenComparing(Map.Entry.comparingByKey()));

	        int[] answer = new int[N];
	        for (int i = 0; i < N; i++) {
	            answer[i] = entryList.get(i).getKey();
	        }
	        
	        return answer;
	    }
	 
	 public static void main(String[] args) {
		solution(5, new int[] {2,1,2,6,2,4,3,3});
	}

}

λ‚˜μ˜ 생각

 int totalUsers = stages.length;
 int[] stageUserCount = new int[N + 2];
 for (int stage : stages) {
 	stageUserCount[stage]++;
 }

λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§€λŠ” int[] stages λ₯Ό 보면 ν˜„μž¬ λ¨Έλ¬Όκ³  μžˆλŠ” μŠ€ν…Œμ΄μ§€κ°€ λ‚˜νƒ€λ‚œλ‹€. 예λ₯Όλ“€μ–΄, {2,1,2,6,2,4,3,3} 이라고 ν•  λ•Œ, 1λ²ˆμœ μ € 2단계, 2λ²ˆμœ μ € 1단계, 3λ²ˆμœ μ € 2단계, 4λ²ˆμœ μ € 6단계, 5λ²ˆμœ μ € 2단계, 6λ²ˆμœ μ € 4단계, 7λ²ˆμœ μ € 3단계, 8λ²ˆμœ μ € 3단계λ₯Ό μ˜λ―Έν•˜λŠ”λ°, 단계별 μΈμ›μˆ˜λ₯Ό 체크λ₯Ό for문을 톡해 단계별 인원 수λ₯Ό 체크할 수 μžˆλ‹€.

0단계 0λͺ…, 1단계 1λͺ…, 2단계, 3λͺ…, 3단계 2λͺ…, 4단계 1λͺ…, 5단계 0λͺ…, 6단계 1λͺ…을 μ˜λ―Έν•œλ‹€.

Map<Integer, Double> stageFailRates = new HashMap<>();
for (int i = 1; i <= N; i++) {
	if (totalUsers != 0) {
    	double failRate = (double) stageUserCount[i] / totalUsers;
        stageFailRates.put(i, failRate);
    } else {
    	stageFailRates.put(i, 0.0);
    }
    totalUsers -= stageUserCount[i];
}

Map<Integer, Double> stageFailRates = new HashMap<>(); μŠ€ν…Œμ΄μ§€ 번호λ₯Ό key둜, ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ˜ μ‹€νŒ¨μœ¨μ„ value둜 ν•˜λŠ” Map을 생성, 각 μŠ€ν…Œμ΄μ§€λ³„λ‘œ μ‹€νŒ¨μœ¨μ„ κ³„μ‚°ν•˜κ³  stageFailRates에 μ €μž₯ν•˜λŠ”λ°, μ‹€νŒ¨μœ¨μ€ ν•΄λ‹Ή μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν–ˆμ§€λ§Œ, 아직 ν΄λ¦¬μ–΄ν•˜μ§€ λͺ»ν•œ ν”Œλ ˆμ΄μ–΄μ˜ 수λ₯Ό ν˜„μž¬ μŠ€ν…Œμ΄μ§€μ— λ„λ‹¬ν•œ ν”Œλ ˆμ΄μ–΄ 수둜 λ‚˜λˆˆ 값이닀.

List<Map.Entry<Integer, Double>> entryList = new ArrayList<>(stageFailRates.entrySet());
	        entryList.sort(Map.Entry.<Integer, Double>comparingByValue().reversed().thenComparing(Map.Entry.comparingByKey()));

List<Map.Entry<Integer, Double>> entryList = new ArrayList<>(stageFailRates.entrySet()); 라고 ν•  λ•Œ, 예λ₯Όλ“€μ–΄, stageFailRatesκ°€ λ‹€μŒκ³Ό κ°™λ‹€λ©΄:

{
  1 -> 0.1,
  2 -> 0.2,
  3 -> 0.3,
  4 -> 0.2
}

stageFailRates.entrySet()

[  1=0.1,  2=0.2,  3=0.3,  4=0.2]
entryList.sort(Map.Entry.<Integer, Double>comparingByValue().reversed().thenComparing(Map.Entry.comparingByKey()));:

이 뢀뢄은 entryListλ₯Ό μ •λ ¬ν•˜λŠ” μ½”λ“œλ‘œ

  • Map.Entry.<Interger, Double> comparingByValue() λŠ” μ‹€νŒ¨μœ¨μ„ κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ μ •λ ¬ν•˜λŠ” Comparatorλ₯Ό 생성
  • reversed()λŠ” μƒμ„±λœ Comparatorλ₯Ό λ’€μ§‘μ–΄ μ‹€νŒ¨μœ¨μ΄ 높은 μˆœμ„œλŒ€λ‘œ λ‚΄λ¦Όμ°¨μˆœ 정렬함
  • thenComparing(Map.Entry.comparingByKey())λŠ” μ‹€νŒ¨μœ¨μ΄ 같은 경우 μŠ€ν…Œμ΄μ§€ 번호λ₯Ό κΈ°μ€€μœΌλ‘œ μ˜€λ¦„μ°¨μˆœ 정렬함

λ”°λΌμ„œ, 이 λ‘œμ§μ„ 톡해 μ‹€νŒ¨μœ¨μ΄ 높은 μŠ€ν…Œμ΄μ§€λΆ€ν„°, 그리고 μ‹€νŒ¨μœ¨μ΄ 같은 κ²½μš°μ—λŠ” μŠ€ν…Œμ΄μ§€ λ²ˆν˜Έκ°€ μž‘μ€ μˆœμ„œλ‘œ entryListκ°€ 정렬됨


κΈ°μ‚¬λ‹¨μ›μ˜ 무기

πŸ“‘ λ¬Έ2) μˆ«μžλ‚˜λΌ κΈ°μ‚¬λ‹¨μ˜ 각 κΈ°μ‚¬μ—κ²ŒλŠ” 1λ²ˆλΆ€ν„° numberκΉŒμ§€ λ²ˆν˜Έκ°€ μ§€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 기사듀은 λ¬΄κΈ°μ μ—μ„œ 무기λ₯Ό κ΅¬λ§€ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

각 κΈ°μ‚¬λŠ” μžμ‹ μ˜ 기사 번호의 μ•½μˆ˜ κ°œμˆ˜μ— ν•΄λ‹Ήν•˜λŠ” 곡격λ ₯을 κ°€μ§„ 무기λ₯Ό κ΅¬λ§€ν•˜λ € ν•©λ‹ˆλ‹€. 단, μ΄μ›ƒλ‚˜λΌμ™€μ˜ ν˜‘μ•½μ— μ˜ν•΄ 곡격λ ₯의 μ œν•œμˆ˜μΉ˜λ₯Ό μ •ν•˜κ³ , μ œν•œμˆ˜μΉ˜λ³΄λ‹€ 큰 곡격λ ₯을 κ°€μ§„ 무기λ₯Ό ꡬ맀해야 ν•˜λŠ” κΈ°μ‚¬λŠ” ν˜‘μ•½κΈ°κ΄€μ—μ„œ μ •ν•œ 곡격λ ₯을 κ°€μ§€λŠ” 무기λ₯Ό ꡬ맀해야 ν•©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 15번으둜 μ§€μ •λœ 기사단원은 15의 μ•½μˆ˜κ°€ 1, 3, 5, 15둜 4개 μ΄λ―€λ‘œ, 곡격λ ₯이 4인 무기λ₯Ό κ΅¬λ§€ν•©λ‹ˆλ‹€. λ§Œμ•½, μ΄μ›ƒλ‚˜λΌμ™€μ˜ ν˜‘μ•½μœΌλ‘œ μ •ν•΄μ§„ 곡격λ ₯의 μ œν•œμˆ˜μΉ˜κ°€ 3이고 μ œν•œμˆ˜μΉ˜λ₯Ό μ΄ˆκ³Όν•œ 기사가 μ‚¬μš©ν•  무기의 곡격λ ₯이 2라면, 15번으둜 μ§€μ •λœ 기사단원은 λ¬΄κΈ°μ μ—μ„œ 곡격λ ₯이 2인 무기λ₯Ό κ΅¬λ§€ν•©λ‹ˆλ‹€. 무기λ₯Ό λ§Œλ“€ λ•Œ, 무기의 곡격λ ₯ 1λ‹Ή 1kg의 철이 ν•„μš”ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ λ¬΄κΈ°μ μ—μ„œ 무기λ₯Ό λͺ¨λ‘ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 철의 무게λ₯Ό 미리 κ³„μ‚°ν•˜λ € ν•©λ‹ˆλ‹€.

κΈ°μ‚¬λ‹¨μ›μ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ number와 μ΄μ›ƒλ‚˜λΌμ™€ ν˜‘μ•½μœΌλ‘œ μ •ν•΄μ§„ 곡격λ ₯의 μ œν•œμˆ˜μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ limit와 μ œν•œμˆ˜μΉ˜λ₯Ό μ΄ˆκ³Όν•œ 기사가 μ‚¬μš©ν•  무기의 곡격λ ₯을 λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ powerκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 무기점의 주인이 무기λ₯Ό λͺ¨λ‘ λ§Œλ“€κΈ° μœ„ν•΄ ν•„μš”ν•œ 철의 무게λ₯Ό return ν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ‹œμ˜€.


μ œν•œμ‚¬ν•­

  • 1 ≀ number ≀ 100,000
  • 2 ≀ limit ≀ 100
  • 1 ≀ power ≀ limit

μž…μΆœλ ₯ 예

numberlimitpowerresult
53210
103221

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • 1λΆ€ν„° 5κΉŒμ§€μ˜ μ•½μˆ˜μ˜ κ°œμˆ˜λŠ” μˆœμ„œλŒ€λ‘œ [1, 2, 2, 3, 2]κ°œμž…λ‹ˆλ‹€. λͺ¨λ‘ 곡격λ ₯ μ œν•œ 수치인 3을 λ„˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— ν•„μš”ν•œ 철의 λ¬΄κ²ŒλŠ” ν•΄λ‹Ή μˆ˜λ“€μ˜ 합인 10이 λ©λ‹ˆλ‹€. λ”°λΌμ„œ 10을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • 1λΆ€ν„° 10κΉŒμ§€μ˜ μ•½μˆ˜μ˜ κ°œμˆ˜λŠ” μˆœμ„œλŒ€λ‘œ [1, 2, 2, 3, 2, 4, 2, 4, 3, 4]κ°œμž…λ‹ˆλ‹€. 곡격λ ₯의 μ œν•œμˆ˜μΉ˜κ°€ 3이기 λ•Œλ¬Έμ—, 6, 8, 10번 κΈ°μ‚¬λŠ” 곡격λ ₯이 2인 무기λ₯Ό κ΅¬λ§€ν•©λ‹ˆλ‹€. λ”°λΌμ„œ ν•΄λ‹Ή μˆ˜λ“€μ˜ 합인 21을 return ν•©λ‹ˆλ‹€.

λ‚˜μ˜ 풀이

μ‹œκ°„μ΄ˆκ³Όλ‘œ μ‹€νŒ¨ν•œ 둜직

package programmers;

public class TemplarsWeapon {
	
	public static int solution(int number, int limit, int power) {
        int answer = 0;
        int[] divisors = new int[number];
        for(int i = 1; i <= number; i++) {
        	
        	
        	int divisor = 0;
        	for(int j = 1; j <=i ; j++) {
        		if(i % j == 0) {
        			divisor++;
        		}
        		divisors[i-1] = divisor;
        		
        	}
        	
        }
        int cnt = 0;
        for(int a : divisors) {
        	cnt++;
        	if(a > limit) {
        		a = power;
        		divisors[cnt-1] = a;
        	}
        	answer +=a;
        }
        System.out.println(answer);
        return answer;
    }
	
	public static void main(String[] args) {
		solution(10, 3, 2);
	}
}

λ‚˜μ˜ 생각


μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ³ λ €ν•œ 둜직

package programmers;

public class TemplarsWeapon {
	
	public static int solution(int number, int limit, int power) {
        int answer = 0;
        
        for(int i = 1; i <= number; i++) {
        	
        	int divisor = 0;
        	int sqrt = (int)Math.sqrt(i);
        	for(int j = 1; j <= sqrt; j++) {
        		if( i % j == 0) {
        			divisor += (j == i / j) ? 1 : 2;
        		}
        	
        	}
        	if(divisor > limit) {
        		answer += power;
        	} else {
        		answer += divisor;
        	}
        	
        }
       
        
        return answer;
    }
	
	public static void main(String[] args) {
		solution(10, 3, 2);
	}
}

μ—λΌν† μŠ€ν…Œλ„€μŠ€μ˜ 체(Sieve of Eratosthenes) 방식을 기반으둜 ν•΄κ²°ν•œ 둜직

class Solution {

    public int solution(int number, int limit, int power) {
        int[] count = new int[number + 1];    
        for (int i = 1; i <= number; i++) {
            for (int j = 1; j <= number / i; j++) {
                count[i * j]++;
            }
        }
        int answer = 0;
        for (int i = 1; i <= number; i++) {
            if (count[i] > limit) {
                answer += power;
            } else {
                answer += count[i];
            }
        }
        return answer;
    }
}

λ¬Έμžμ—΄ λ‚˜λˆ„κΈ°

πŸ“‘ λ¬Έ3) λ¬Έμžμ—΄ sκ°€ μž…λ ₯λ˜μ—ˆμ„ λ•Œ λ‹€μŒ κ·œμΉ™μ„ λ”°λΌμ„œ 이 λ¬Έμžμ—΄μ„ μ—¬λŸ¬ λ¬Έμžμ—΄λ‘œ λΆ„ν•΄ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

  • λ¨Όμ € 첫 κΈ€μžλ₯Ό μ½μŠ΅λ‹ˆλ‹€. 이 κΈ€μžλ₯Ό x라고 ν•©μ‹œλ‹€.
  • 이제 이 λ¬Έμžμ—΄μ„ μ™Όμͺ½μ—μ„œ 였λ₯Έμͺ½μœΌλ‘œ μ½μ–΄λ‚˜κ°€λ©΄μ„œ, x와 xκ°€ μ•„λ‹Œ λ‹€λ₯Έ κΈ€μžλ“€μ΄ λ‚˜μ˜¨ 횟수λ₯Ό 각각 μ…‰λ‹ˆλ‹€. 처음으둜 두 νšŸμˆ˜κ°€ κ°™μ•„μ§€λŠ” μˆœκ°„ λ©ˆμΆ”κ³ , μ§€κΈˆκΉŒμ§€ 읽은 λ¬Έμžμ—΄μ„ λΆ„λ¦¬ν•©λ‹ˆλ‹€.
  • sμ—μ„œ λΆ„λ¦¬ν•œ λ¬Έμžμ—΄μ„ λΉΌκ³  남은 뢀뢄에 λŒ€ν•΄μ„œ 이 과정을 λ°˜λ³΅ν•©λ‹ˆλ‹€. 남은 뢀뢄이 μ—†λ‹€λ©΄ μ’…λ£Œν•©λ‹ˆλ‹€.
  • λ§Œμ•½ 두 νšŸμˆ˜κ°€ λ‹€λ₯Έ μƒνƒœμ—μ„œ 더 이상 읽을 κΈ€μžκ°€ μ—†λ‹€λ©΄, μ—­μ‹œ μ§€κΈˆκΉŒμ§€ 읽은 λ¬Έμžμ—΄μ„ λΆ„λ¦¬ν•˜κ³ , μ’…λ£Œν•©λ‹ˆλ‹€.

λ¬Έμžμ—΄ sκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μœ„ κ³Όμ •κ³Ό 같이 λ¬Έμžμ—΄λ“€λ‘œ λΆ„ν•΄ν•˜κ³ , λΆ„ν•΄ν•œ λ¬Έμžμ—΄μ˜ 개수λ₯Ό return ν•˜λŠ” ν•¨μˆ˜ solution을 μ™„μ„±ν•˜μ„Έμš”.


μ œν•œμ‚¬ν•­

  • 1 ≀ s의 길이 ≀ 10,000
  • sλŠ” μ˜μ–΄ μ†Œλ¬Έμžλ‘œλ§Œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

sresult
"banana"3
"abracadabra"6
"aaabbaccccabba"3

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1
s="banana"인 경우 ba - na - na와 같이 λΆ„ν•΄λ©λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #2
s="abracadabra"인 경우 ab - ra - ca - da - br - a와 같이 λΆ„ν•΄λ©λ‹ˆλ‹€.
μž…μΆœλ ₯ 예 #3
s="aaabbaccccabba"인 경우 aaabbacc - ccab - ba와 같이 λΆ„ν•΄λ©λ‹ˆλ‹€.


λ‚˜μ˜ 생각

package programmers;

public class StrSplit {
	public static int solution(String s) {
		int answer = 0;
        int i = 0, j = 0, len = s.length();
        int countTarget = 0, countOther = 0;
        while (i < len && j < len) {
            char target = s.charAt(i);
            if (s.charAt(j) == target) {
                countTarget++;
            } else {
                countOther++;
            }
            if (countTarget == countOther) {
                answer++;
                i = j + 1;
                countTarget = 0;
                countOther = 0;
            }
            j++;
        }
        if (i < len) answer++;
        return answer;
    
    }
	
	public static void main(String[] args) {
		solution("banana");
	}
}

숫자 짝꿍

πŸ“‘ λ¬Έ4) 두 μ •μˆ˜ X, Y의 μž„μ˜μ˜ μžλ¦¬μ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” μ •μˆ˜ k(0 ≀ k ≀ 9)듀을 μ΄μš©ν•˜μ—¬ λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜λ₯Ό 두 수의 짝꿍이라 ν•©λ‹ˆλ‹€(단, κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” μ •μˆ˜ 쀑 μ„œλ‘œ 짝지을 수 μžˆλŠ” 숫자만 μ‚¬μš©ν•©λ‹ˆλ‹€). X, Y의 짝꿍이 μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄, 짝꿍은 -1μž…λ‹ˆλ‹€. X, Y의 짝꿍이 0으둜만 κ΅¬μ„±λ˜μ–΄ μžˆλ‹€λ©΄, 짝꿍은 0μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Yμ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” 3, 0, 3으둜 λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜μΈ 330μž…λ‹ˆλ‹€. λ‹€λ₯Έ μ˜ˆμ‹œλ‘œ X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Yμ—μ„œ κ³΅ν†΅μœΌλ‘œ λ‚˜νƒ€λ‚˜λŠ” 2, 5, 5둜 λ§Œλ“€ 수 μžˆλŠ” κ°€μž₯ 큰 μ •μˆ˜μΈ 552μž…λ‹ˆλ‹€(Xμ—λŠ” 5κ°€ 3개, Yμ—λŠ” 5κ°€ 2개 λ‚˜νƒ€λ‚˜λ―€λ‘œ λ‚¨λŠ” 5 ν•œ κ°œλŠ” 짝 지을 수 μ—†μŠ΅λ‹ˆλ‹€.)
두 μ •μˆ˜ X, Yκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, X, Y의 짝꿍을 returnν•˜λŠ” solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­

  • 3 ≀ X, Y의 길이(자릿수) ≀ 3,000,000μž…λ‹ˆλ‹€.
  • X, YλŠ” 0으둜 μ‹œμž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • X, Y의 짝꿍은 μƒλ‹Ήνžˆ 큰 μ •μˆ˜μΌ 수 μžˆμœΌλ―€λ‘œ, λ¬Έμžμ—΄λ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예

XYresult
1002345-1
1002030450
10012345010
1232142531321
55251255552

μž…μΆœλ ₯ 예 μ„€λͺ…

μž…μΆœλ ₯ 예 #1

  • X, Y의 짝꿍은 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ "-1"을 returnν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • X, Y의 κ³΅ν†΅λœ μˆ«μžλŠ” 0으둜만 κ΅¬μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ—, 두 수의 짝꿍은 μ •μˆ˜ 0μž…λ‹ˆλ‹€. λ”°λΌμ„œ "0"을 returnν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • X, Y의 짝꿍은 10μ΄λ―€λ‘œ, "10"을 returnν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #4

  • X, Y의 짝꿍은 321μž…λ‹ˆλ‹€. λ”°λΌμ„œ "321"을 returnν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #5

  • 지문에 μ„€λͺ…λœ μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

λ‚˜μ˜ 풀이

package programmers;

import java.util.Arrays;

public class NumberPair {
	
	public static String solution(String X, String Y) {
		 	int[] countX = new int[10];
	        int[] countY = new int[10];
	        int[] countPair = new int[10];

	        
	        for (char c : X.toCharArray()) {
	            countX[c - '0']++;
	        }
	        for (char c : Y.toCharArray()) {
	            countY[c - '0']++;
	        }
	       
	        
	        for (int i = 0; i <= 9; i++) {
	            countPair[i] = Math.min(countX[i], countY[i]);
	        }
	        
	        
	        StringBuilder pair = new StringBuilder();
	        for (int i = 9; i >= 0; i--) {
	            for (int j = 0; j < countPair[i]; j++) {
	            	System.out.println(j);
	                pair.append(i);
	            }
	        }

	       
	        if (pair.length() == 0) {
	            return "-1";
	        }

	        
	        boolean isOnlyZero = true;
	        for (char c : pair.toString().toCharArray()) {
	            if (c != '0') {
	                isOnlyZero = false;
	                break;
	            }
	        }
	        if (isOnlyZero) {
	            return "0";
	        }

	        
	        int startIndex = 0;
	        while (pair.charAt(startIndex) == '0') {
	            startIndex++;
	        }
	        
	        return pair.substring(startIndex);
    }
	
	public static void main(String[] args) {
		solution("5525", "1255");
	}

}

λ‹€νŠΈ κ²Œμž„

πŸ“‘ λ¬Έ5) μΉ΄μΉ΄μ˜€ν†‘μ— 뜬 λ„€ 번째 별! 심심할 땐? μΉ΄μΉ΄μ˜€ν†‘ κ²Œμž„λ³„~

μΉ΄μΉ΄μ˜€ν†‘ κ²Œμž„λ³„μ˜ ν•˜λ°˜κΈ° μ‹ κ·œ μ„œλΉ„μŠ€λ‘œ λ‹€νŠΈ κ²Œμž„μ„ μΆœμ‹œν•˜κΈ°λ‘œ ν–ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ€ λ‹€νŠΈνŒμ— λ‹€νŠΈλ₯Ό μ„Έ μ°¨λ‘€ 던져 κ·Έ 점수의 ν•©κ³„λ‘œ μ‹€λ ₯을 κ²¨λ£¨λŠ” κ²Œμž„μœΌλ‘œ, λͺ¨λ‘κ°€ κ°„λ‹¨νžˆ 즐길 수 μžˆλ‹€.
κ°“ μž…μ‚¬ν•œ λ¬΄μ§€λŠ” μ½”λ”© μ‹€λ ₯을 인정받아 κ²Œμž„μ˜ 핡심 뢀뢄인 점수 계산 λ‘œμ§μ„ 맑게 λ˜μ—ˆλ‹€. λ‹€νŠΈ κ²Œμž„μ˜ 점수 계산 λ‘œμ§μ€ μ•„λž˜μ™€ κ°™λ‹€.

  1. λ‹€νŠΈ κ²Œμž„μ€ 총 3번의 기회둜 κ΅¬μ„±λœλ‹€.
  2. 각 κΈ°νšŒλ§ˆλ‹€ 얻을 수 μžˆλŠ” μ μˆ˜λŠ” 0μ μ—μ„œ 10μ κΉŒμ§€μ΄λ‹€.
  3. μ μˆ˜μ™€ ν•¨κ»˜ Single(S), Double(D), Triple(T) μ˜μ—­μ΄ μ‘΄μž¬ν•˜κ³  각 μ˜μ—­ 당첨 μ‹œ μ μˆ˜μ—μ„œ 1제곱, 2제곱, 3제곱 (점수1 , 점수2 , 점수3 )으둜 κ³„μ‚°λœλ‹€.
  4. μ˜΅μ…˜μœΌλ‘œ μŠ€νƒ€μƒ() , 아차상(#)이 μ‘΄μž¬ν•˜λ©° μŠ€νƒ€μƒ() 당첨 μ‹œ ν•΄λ‹Ή μ μˆ˜μ™€ λ°”λ‘œ 전에 얻은 점수λ₯Ό 각 2배둜 λ§Œλ“ λ‹€. 아차상(#) 당첨 μ‹œ ν•΄λ‹Ή μ μˆ˜λŠ” λ§ˆμ΄λ„ˆμŠ€λœλ‹€.
  5. μŠ€νƒ€μƒ()은 첫 번째 κΈ°νšŒμ—μ„œλ„ λ‚˜μ˜¬ 수 μžˆλ‹€. 이 경우 첫 번째 μŠ€νƒ€μƒ()의 점수만 2λ°°κ°€ λœλ‹€. (예제 4번 μ°Έκ³ )
  6. μŠ€νƒ€μƒ()의 νš¨κ³ΌλŠ” λ‹€λ₯Έ μŠ€νƒ€μƒ()의 νš¨κ³Όμ™€ 쀑첩될 수 μžˆλ‹€. 이 경우 μ€‘μ²©λœ μŠ€νƒ€μƒ(*) μ μˆ˜λŠ” 4λ°°κ°€ λœλ‹€. (예제 4번 μ°Έκ³ )
  7. μŠ€νƒ€μƒ(*)의 νš¨κ³ΌλŠ” 아차상(#)의 νš¨κ³Όμ™€ 쀑첩될 수 μžˆλ‹€. 이 경우 μ€‘μ²©λœ 아차상(#)의 μ μˆ˜λŠ” -2λ°°κ°€ λœλ‹€. (예제 5번 μ°Έκ³ )
  8. Single(S), Double(D), Triple(T)은 μ μˆ˜λ§ˆλ‹€ ν•˜λ‚˜μ”© μ‘΄μž¬ν•œλ‹€.
  9. μŠ€νƒ€μƒ(*), 아차상(#)은 μ μˆ˜λ§ˆλ‹€ λ‘˜ 쀑 ν•˜λ‚˜λ§Œ μ‘΄μž¬ν•  수 있으며, μ‘΄μž¬ν•˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

0~10의 μ •μˆ˜μ™€ 문자 S, D, T, *, #둜 κ΅¬μ„±λœ λ¬Έμžμ—΄μ΄ μž…λ ₯될 μ‹œ 총점수λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜λΌ.


μž…λ ₯ ν˜•μ‹

"점수|λ³΄λ„ˆμŠ€|[μ˜΅μ…˜]"으둜 이루어진 λ¬Έμžμ—΄ 3μ„ΈνŠΈ.

예) 1S2D*3T

  • μ μˆ˜λŠ” 0μ—μ„œ 10 μ‚¬μ΄μ˜ μ •μˆ˜μ΄λ‹€.
  • λ³΄λ„ˆμŠ€λŠ” S, D, T 쀑 ν•˜λ‚˜μ΄λ‹€.
  • μ˜΅μ„ μ€ *μ΄λ‚˜ # 쀑 ν•˜λ‚˜μ΄λ©°, 없을 μˆ˜λ„ μžˆλ‹€.

좜λ ₯ ν˜•μ‹

3번의 κΈ°νšŒμ—μ„œ 얻은 점수 합계에 ν•΄λ‹Ήν•˜λŠ” μ •μˆ˜κ°’μ„ 좜λ ₯ν•œλ‹€.
예) 37


μž…μΆœλ ₯ 예제


λ‚˜μ˜ 풀이

package programmers;

import java.util.Arrays;

public class DartGame {
	
	public static int solution(String dartResult) {
        
		int[] score = new int[3];
		int index = -1;
		
		
		for(int i = 0; i < dartResult.length(); i++) {
			
			char c = dartResult.charAt(i);
			
			if(Character.isDigit(c)) {
				index++;
				if(c == '1' && dartResult.charAt(i+1) == '0') {
					score[index] = 10;
					i++;
				}else {
					score[index] = Character.getNumericValue(c);
				}
			}else if(c =='D') {
				score[index] = (int)Math.pow(score[index],2);
			}else if(c =='T') {
				score[index] = (int)Math.pow(score[index], 3);
			}else if(c =='*') {
			 if(index > 0) {
				 score[index - 1] *= 2;
			 }
			 score[index] *= 2;
			}else if(c =='#') {
				score[index]  *= -1;
			}
		}
	
        return score[0] + score[1] + score[2];
    }
	
	
	public static void main(String[] args) {
		solution("1S*2T*3S");
	}

}

λ‚˜μ˜ 생각

λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§€λŠ” dartResult λ₯Ό ν•œκΈ€μž μ”© 지라 String λ§€κ°œλ³€μˆ˜ dartResult에 λ¨Όμ € μˆ«μžκ°€ ν¬ν•¨λΌμžˆλŠ”μ§€ λ¨Όμ € ν™•μΈν•œλ‹€. λ§Œμ•½, μˆ«μžκ°€ μ‘΄μž¬ν•˜λ©΄ index++ λ₯Ό μ§„ν–‰ν•˜λŠ”λ°,
λ§€κ°œλ³€μˆ˜μ—λŠ” μˆ«μžκ°€ 3개만 μ‘΄μž¬ν•˜κΈ° λ•Œλ¬Έμ—, int[] score = new int[3]으둜 크기λ₯Ό μ„€μ •ν•˜μ—¬ indexλ₯Ό ν• λ‹Ήν•œλ‹€.

if(c == '1' && dartResult.charAt(i+1) == '0') {
	score[index] = 10;
    i++;
}else {
	score[index] = Character.getNumericValue(c);
}

ν•΄λ‹Ή λ‘œμ§μ„ 톡해, μˆ«μžκ°€ 1~10 κΉŒμ§€ μ‘΄μž¬ν•˜κΈ°λ•Œλ¬Έμ—, 숫자 10을 κ²€μΆœν•˜λŠ” λ°©λ²•μœΌλ‘œ ν˜„μž¬μ˜ λ¬Έμžκ°€ 1 & λ‹€μŒ λ¬Έμžκ°€ 0이면 10을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—, ν•΄λ‹Ήν•˜λŠ” score[index] 값에 10을 μΆ”κ°€μ‹œν‚¨λ‹€. κ·Έλ ‡μ§€μ•ŠμœΌλ©΄, ν•΄λ‹Ή 문자λ₯Ό 숫자둜 λ°”κΎΈλŠ” Character.getNumericValueλ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ score[index] 에 λ‹΄λŠ”λ‹€.

else if(c =='D') {
	score[index] = (int)Math.pow(score[index],2);
}else if(c =='T') {
	score[index] = (int)Math.pow(score[index], 3);
}else if(c =='*') {
	if(index > 0) {
    	score[index - 1] *= 2;
    }
score[index] *= 2;
}else if(c =='#') {
	score[index]  *= -1;
}

c == 'S' λŠ” ν•΄λ‹Ήν•˜λŠ” 숫자의 *1을 μ˜λ―Έν•˜κΈ° λ•Œλ¬Έμ—, Double, Triple만 체크 ν•œλ‹€. 그리고 *, # λ₯Ό μ²΄ν¬ν•˜μ—¬ μ˜΅μ…˜μ΄ λ°œμƒν•  경우λ₯Ό μ²˜λ¦¬ν•œλ‹€. *κ°€ λ‚˜μ˜¬ 경우 ν˜„μž¬ 점수 score[index]λ₯Ό 2배둜 λ§Œλ“€κ³ , λ§Œμ•½ 이전 점수 score[index -1]이 μ‘΄μž¬ν•œλ‹€λ©΄ 이전 μ μˆ˜λ„ 2배둜 λ§Œλ“¦. 쑰건문 if (index > 0) 은 indexκ°€ 0보닀 클 κ²½μš°μ—λ§Œ 이전 점수λ₯Ό 2배둜 λ§Œλ“œλŠ” 처리λ₯Ό 함. μ΄λŠ” 첫 번째 점수의 경우 이전 μ μˆ˜κ°€ μ—†μœΌλ―€λ‘œ, 이전 μ μˆ˜μ— λŒ€ν•œ 처리λ₯Ό ν•˜μ§€ μ•Šλ„λ‘ ν•˜κΈ°μœ„ν•¨μ΄λ‹€.

1개의 λŒ“κΈ€

comment-user-thumbnail
2023λ…„ 8μ›” 3일

쒋은 κΈ€ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ‹΅κΈ€ 달기