본문 바로가기
Programming/Algorithm(ACM Problems)

[백준] 1864번 : 문어다리 / [자바] JAVA / 학습기록

by jongmln_ 2022. 1. 19.

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

 

1864번: 문어 숫자

해류가 매우 느리고 바닥을 기어다니는 생물이 적은 바다 밑바닥에서만 발견되는 잔물결 무늬의 정체는 오랫동안 해양학자들에게 수수께끼였다. 하지만 최근의 연구 성과는 동물 언어학 분야

www.acmicpc.net


[백준] 1864번 : 문어숫자 문제

위 문제는 얼핏 보면 8진수 관련 명령어를 사용해야 할 것 같지만 전혀 그렇지 않은 문제이다.

 

[백준] 1864번 문어숫자 입출력예제


[전체 코드]

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		while(true) { 
			
			String Oct = sc.next(); //입력
			
			if(Oct.equals("#")) { //#이 입력되면 반복문 종료
				break;
			}
	
			int temp = 0, sum = 0;

			
			int index = Oct.length()-1; //8의 제곱수를 관리할 인덱스(문자 길이 -1)

			for(int i=0;i<Oct.length();i++) { //길이만큼 반복
				
				switch(Oct.charAt(i)) { //i로 글자 하나하나 스위치로 대조
				case '-': { 
					temp = 0; //temp가 대응하는 숫자이다.
					sum += func(temp, index); //func 함수 호출
					//각 자리마다 구한값은 sum에 더해서 넣는다.(곱해서 넣기 X)
					index--; //case밖에 index를 할경우 break때문에 실행되지 않는다.
					break; //하나의 케이스에 걸린경우 그 케이스 실행문을 실행하고 종료되어야 한다.
				}
				case '\\': {
					temp = 1; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '(': {
					temp = 2; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '@': {
					temp = 3; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '?': {
					temp = 4; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '>': {
					temp = 5; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '&': {
					temp = 6; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '%': {
					temp = 7; 
					sum += func(temp, index);
					index--;
					break;
				}
				case '/': {
					temp = -1; 
					sum += func(temp, index);
					index--;
				}

				}

			}
			System.out.println(sum);
			//for 문이 종료되면 출력

		}
	}
	public static int func(int num, int i) {
		//우리의 문어대응수와 8제곱수를 곱한 값을 구해줄 함수
		//인수로 temp와 index를 넣어준다.
		int result = 0; //결과값을 담을 result
		if(i == 0) { //String의 마지막이나 문자길이가 1일 경우 곱해지는수는 없기때문에 그대로 반환해준다.
			return num;
		}
		else { 
			// 8제곱 현재 index 곱하기 문어다리 대응수( temp )이다.
			result = (int) (Math.pow(8, i) * num);
			return result;
		}
		
	}
	
}

[제출 결과]


이번문제는 꽤 오래걸렸다. 사소한 실수들이 이상한 결과값을 불러왔다..

처음으로 Oct.equals("#") 과 Oct.equals('#') 이 다르다는 사실을 알았다. 자바에서는 따옴표를 확실히 구분하는것 같다. 이의 내용은 더 찾아보고 확실히 익힐 필요가 있다. 또 이번문제로 나동빈님 강의에서 못배운 switch를 배우게 되었다.

오랜만에 C배울때 주로 썼었던 Switch를 사용하려니까 실수를 많이 했는데 예를 들어서 각 케이스마다 break를 해주지 않거나 각각 break; 되어있는 case문 밖에 index-- 를 넣어서 index가 줄어들지 못했다는 실수를 했다. 또한 처음에 문제를 제대로 파악하지 못해서 제멋대로 풀었다ㅋㅋ (난독증인가,, ) 결국 구글링하면서 정신채리고 푸니까 또 이렇게 내게 정답을 하나 선물할 수 있게되서 너무 기분이 좋다.