본문 바로가기

Coding Test/Problem Number

[Java] 영식이의 손가락 [2740번]

https://www.acmicpc.net/problem/1614

  • 예제 입력1
2
3
  • 예제 출력1
15
  • 예제 입력2
1
0
  • 예제 출력2
0
  • 예제 입력3
5
0
  • 예제 출력3
4
  • 예제 입력4
2
48
  • 예제 출력4
193
  • 예제 입력5
5
973
  • 예제 출력5
7788

 

  • 예제 입력6
3
99999
  • 예제 출력6
399998

  • 문제 접근
    • 패턴은 1 → 2 → 3 → 4 → 5 → 4 → 3 → 2로 반복
    • 다친 손가락이 패턴을 몇 번 반복할 수 있는 지 확인
    • 8 * 반복 가능한 패턴
    • 패턴은 온전히 반복하지 못할 때 1개씩 계산
  • 문제 해결
    • 다친 손가락으로 셀 수 있는 수는 10억이하로 int가 아닌 long 선언 필요
    • 패턴 배열 생성 [1, 2, 3, 4 ,5 ,4 ,3, 2]
    • 다친 손가락이 1패턴에 몇 번 등장하는 지 확인
    • 전체 패턴 = 다친 손가락 사용 가능 횟수 / 1패턴에 다친 손가락 사용 횟수
    • 나머지 = 다친 손가락 사용 가능 횟수 % 1패턴에 다친 손가락 사용 횟수
  • 슈도 코드
hurtFinger (다친 손가락 번호 저장)
limitCount (사용 가능 횟수 저장)
pattern[] (패턴 배열 저장)
patternInCount (1패턴에 등장하는 다친 손가락 횟수)
for(pattern만큼 반복){
	if(pattern값과 hurtFinger가 같다면)
		patternInCount 1증가
}

fullPatternCount = limitCount / patternInCount
remainder = limitCount % patternInCount
num = fullPatternCount * pattern의 길이
for(i = 0 ~ pattern길이 -1 반복){
	if(remainder==0) break;
	if(pattern[i]가 hurtFinger와 같다면)
		remainder 1감소
	num 1 증가
}
  • 코딩하기
public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    int hurtFinger = scan.nextInt();
    int limitCount = scan.nextInt();
    int[] pattern = new int[]{1, 2, 3, 4, 5, 4, 3, 2};
    int hurtFingerPatternCount = 0;
    for(int order : pattern){
        if(order == hurtFinger){
            hurtFingerPatternCount++;
        }
    }
    int fullPatternCount = limitCount / hurtFingerPatternCount; // 패턴 반복 가능 횟수
    int remainder = limitCount % hurtFingerPatternCount; // 남은 다친 손가락 사용 가능 횟수
    long num = (long) fullPatternCount * pattern.length;
    for(int i = 0; i < pattern.length; i++){
        if(pattern[i] == hurtFinger){
            if(remainder == 0) break;
            remainder--;
        }
        num++;
    }
    System.out.println(num);
}